From owner-svn-src-head@FreeBSD.ORG Sun Mar 22 13:37:15 2015 Return-Path: Delivered-To: svn-src-head@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTPS id 16288E20; Sun, 22 Mar 2015 13:37:15 +0000 (UTC) Received: from mx1.stack.nl (relay04.stack.nl [IPv6:2001:610:1108:5010::107]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (Client CN "mailhost.stack.nl", Issuer "CA Cert Signing Authority" (not verified)) by mx1.freebsd.org (Postfix) with ESMTPS id CB468BE; Sun, 22 Mar 2015 13:37:14 +0000 (UTC) Received: from snail.stack.nl (snail.stack.nl [IPv6:2001:610:1108:5010::131]) by mx1.stack.nl (Postfix) with ESMTP id DBC83B8057; Sun, 22 Mar 2015 14:37:09 +0100 (CET) Received: by snail.stack.nl (Postfix, from userid 1677) id C7D5628494; Sun, 22 Mar 2015 14:37:09 +0100 (CET) Date: Sun, 22 Mar 2015 14:37:09 +0100 From: Jilles Tjoelker To: Bruce Evans Subject: Re: svn commit: r280308 - head/sys/fs/devfs Message-ID: <20150322133709.GA39238@stack.nl> References: <201503210114.t2L1ECcB075556@svn.freebsd.org> <20150321200221.K1846@besplex.bde.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150321200221.K1846@besplex.bde.org> User-Agent: Mutt/1.5.21 (2010-09-15) Cc: svn-src-head@freebsd.org, svn-src-all@freebsd.org, src-committers@freebsd.org, Xin LI X-BeenThere: svn-src-head@freebsd.org X-Mailman-Version: 2.1.18-1 Precedence: list List-Id: SVN commit messages for the src tree for head/-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 22 Mar 2015 13:37:15 -0000 On Sat, Mar 21, 2015 at 08:49:00PM +1100, Bruce Evans wrote: > On Sat, 21 Mar 2015, Xin LI wrote: > > Log: > > Disable timestamping on devfs read/write operations by default. > > Currently we update timestamps unconditionally when doing read or > > write operations. This may slow things down on hardware where > > reading timestamps is expensive (e.g. HPET, because of the default > > vfs.timestamp_precision setting is nanosecond now) with limited > > benefit. > > A new sysctl variable, vfs.devfs.dotimes is added, which can be > > set to non-zero value when the old behavior is desirable. > I don't like this. It defaults to non-POSIX-conformant behaviour... > The slowness is mostly from no delayed update of times in devfs. > Switching vfs.timestamp_precision to a hardware timecounter would > have been even more expensive for regular files if file systems > didn't have delayed updates. The assumption that vfs_timestamp() > doesn't use a slow timecounter was so often satisfied that no one > missed devfs also not supporting mounting with -noatime. > Delayed updates are even easier to implement for devfs than for disk > file systems the times never need to be written to disk. A slow update > is still wasteful for atimes, but not as bad as for disk file systems > since it doesn't trigger a slower sync to disk. Yes, I think implementing delayed updates is the right solution to this problem. This way, only stat and last close will need to read the clock. No configuration option will be needed. A subtle difference with most other file systems is that devfs nodes often stay open for very long, so the timestamps will usually come from stat() calls, which may be much later than the actual read or write. Still that is better than not updating timestamps at all. > > ... > > Modified: head/sys/fs/devfs/devfs_vnops.c > > ============================================================================== > > --- head/sys/fs/devfs/devfs_vnops.c Sat Mar 21 00:21:30 2015 (r280307) > > +++ head/sys/fs/devfs/devfs_vnops.c Sat Mar 21 01:14:11 2015 (r280308) > > ... > > @@ -1700,7 +1708,8 @@ devfs_write_f(struct file *fp, struct ui > > resid = uio->uio_resid; > > > > error = dsw->d_write(dev, uio, ioflag); > > - if (uio->uio_resid != resid || (error == 0 && resid != 0)) { > > + if (devfs_dotimes && > > + (uio->uio_resid != resid || (error == 0 && resid != 0))) { > > vfs_timestamp(&dev->si_ctime); > > dev->si_mtime = dev->si_ctime; > > } > An old bug is evident in the diff. Writing shouldn't change the ctime. That is not a bug. POSIX unambiguously requires write() to update both mtime and ctime. -- Jilles Tjoelker