diff options
author | pjd <pjd@FreeBSD.org> | 2007-05-23 11:06:09 +0000 |
---|---|---|
committer | pjd <pjd@FreeBSD.org> | 2007-05-23 11:06:09 +0000 |
commit | 1e693d6e521e7aa7f264c9b6e5a8865ba5466df6 (patch) | |
tree | c916d8fe2f60c7277d1be5a23b40bc51accdc1e3 | |
parent | aac7a2ca82f3bcb6a749f1b4d1d403e3f718d928 (diff) | |
download | FreeBSD-src-1e693d6e521e7aa7f264c9b6e5a8865ba5466df6.zip FreeBSD-src-1e693d6e521e7aa7f264c9b6e5a8865ba5466df6.tar.gz |
Eliminate VI_LOCK()/VI_UNLOCK() pair from getattr and close code paths.
It's hard to measure performance improvement on my test machine, but the
change won't degrade performance for sure. I can measure slight improvement
for debugging kernel and it can also be a win for machines where atomic
operation is more expensive.
Reviewed by: kib
-rw-r--r-- | sys/ufs/ufs/ufs_vnops.c | 47 |
1 files changed, 27 insertions, 20 deletions
diff --git a/sys/ufs/ufs/ufs_vnops.c b/sys/ufs/ufs/ufs_vnops.c index e4e8457..45d2d04 100644 --- a/sys/ufs/ufs/ufs_vnops.c +++ b/sys/ufs/ufs/ufs_vnops.c @@ -127,21 +127,19 @@ static struct odirtemplate omastertemplate = { 0, DIRBLKSIZ - 12, 2, ".." }; -void -ufs_itimes(vp) - struct vnode *vp; +static void +ufs_itimes_locked(struct vnode *vp) { struct inode *ip; struct timespec ts; + ASSERT_VI_LOCKED(vp, __func__); + ip = VTOI(vp); - VI_LOCK(vp); if ((vp->v_mount->mnt_flag & MNT_RDONLY) != 0) goto out; - if ((ip->i_flag & (IN_ACCESS | IN_CHANGE | IN_UPDATE)) == 0) { - VI_UNLOCK(vp); + if ((ip->i_flag & (IN_ACCESS | IN_CHANGE | IN_UPDATE)) == 0) return; - } if ((vp->v_type == VBLK || vp->v_type == VCHR) && !DOINGSOFTDEP(vp)) ip->i_flag |= IN_LAZYMOD; @@ -168,6 +166,14 @@ ufs_itimes(vp) out: ip->i_flag &= ~(IN_ACCESS | IN_CHANGE | IN_UPDATE); +} + +void +ufs_itimes(struct vnode *vp) +{ + + VI_LOCK(vp); + ufs_itimes_locked(vp); VI_UNLOCK(vp); } @@ -286,9 +292,9 @@ ufs_close(ap) VI_LOCK(vp); usecount = vp->v_usecount; - VI_UNLOCK(vp); if (usecount > 1) - ufs_itimes(vp); + ufs_itimes_locked(vp); + VI_UNLOCK(vp); return (0); } @@ -379,7 +385,16 @@ ufs_getattr(ap) struct inode *ip = VTOI(vp); struct vattr *vap = ap->a_vap; - ufs_itimes(vp); + VI_LOCK(vp); + ufs_itimes_locked(vp); + if (ip->i_ump->um_fstype == UFS1) { + vap->va_atime.tv_sec = ip->i_din1->di_atime; + vap->va_atime.tv_nsec = ip->i_din1->di_atimensec; + } else { + vap->va_atime.tv_sec = ip->i_din2->di_atime; + vap->va_atime.tv_nsec = ip->i_din2->di_atimensec; + } + VI_UNLOCK(vp); /* * Copy from inode table */ @@ -392,10 +407,6 @@ ufs_getattr(ap) if (ip->i_ump->um_fstype == UFS1) { vap->va_rdev = ip->i_din1->di_rdev; vap->va_size = ip->i_din1->di_size; - VI_LOCK(vp); - vap->va_atime.tv_sec = ip->i_din1->di_atime; - vap->va_atime.tv_nsec = ip->i_din1->di_atimensec; - VI_UNLOCK(vp); vap->va_mtime.tv_sec = ip->i_din1->di_mtime; vap->va_mtime.tv_nsec = ip->i_din1->di_mtimensec; vap->va_ctime.tv_sec = ip->i_din1->di_ctime; @@ -406,10 +417,6 @@ ufs_getattr(ap) } else { vap->va_rdev = ip->i_din2->di_rdev; vap->va_size = ip->i_din2->di_size; - VI_LOCK(vp); - vap->va_atime.tv_sec = ip->i_din2->di_atime; - vap->va_atime.tv_nsec = ip->i_din2->di_atimensec; - VI_UNLOCK(vp); vap->va_mtime.tv_sec = ip->i_din2->di_mtime; vap->va_mtime.tv_nsec = ip->i_din2->di_mtimensec; vap->va_ctime.tv_sec = ip->i_din2->di_ctime; @@ -2037,9 +2044,9 @@ ufsfifo_close(ap) VI_LOCK(vp); usecount = vp->v_usecount; - VI_UNLOCK(vp); if (usecount > 1) - ufs_itimes(vp); + ufs_itimes_locked(vp); + VI_UNLOCK(vp); return (fifo_specops.vop_close(ap)); } |