svn commit: r192717 - user/kmacy/releng_7_2_fcs/sys/kern
Kip Macy
kmacy at FreeBSD.org
Mon May 25 03:41:41 UTC 2009
Author: kmacy
Date: Mon May 25 03:41:40 2009
New Revision: 192717
URL: http://svn.freebsd.org/changeset/base/192717
Log:
eliminate one point of contention for the mnt lock by making mnt_opwritecount
atomically updated
Modified:
user/kmacy/releng_7_2_fcs/sys/kern/vfs_vnops.c
Modified: user/kmacy/releng_7_2_fcs/sys/kern/vfs_vnops.c
==============================================================================
--- user/kmacy/releng_7_2_fcs/sys/kern/vfs_vnops.c Mon May 25 03:24:47 2009 (r192716)
+++ user/kmacy/releng_7_2_fcs/sys/kern/vfs_vnops.c Mon May 25 03:41:40 2009 (r192717)
@@ -929,7 +929,7 @@ vn_start_write(vp, mpp, flags)
}
if (flags & V_XSLEEP)
goto unlock;
- mp->mnt_writeopcount++;
+ atomic_add_int(&mp->mnt_writeopcount, 1);
unlock:
MNT_REL(mp);
MNT_IUNLOCK(mp);
@@ -999,19 +999,23 @@ vn_start_secondary_write(vp, mpp, flags)
* now in effect.
*/
void
-vn_finished_write(mp)
- struct mount *mp;
+vn_finished_write(struct mount *mp)
{
+ int writeopcount;
+
if (mp == NULL)
return;
- MNT_ILOCK(mp);
- mp->mnt_writeopcount--;
- if (mp->mnt_writeopcount < 0)
+
+ writeopcount = atomic_fetchadd_int(&mp->mnt_writeopcount, -1) - 1;
+
+ if (writeopcount < 0)
panic("vn_finished_write: neg cnt");
if ((mp->mnt_kern_flag & MNTK_SUSPEND) != 0 &&
- mp->mnt_writeopcount <= 0)
+ writeopcount <= 0) {
+ MNT_ILOCK(mp);
wakeup(&mp->mnt_writeopcount);
- MNT_IUNLOCK(mp);
+ MNT_IUNLOCK(mp);
+ }
}
More information about the svn-src-user
mailing list