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