Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 25 May 2009 03:41:40 +0000 (UTC)
From:      Kip Macy <kmacy@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-user@freebsd.org
Subject:   svn commit: r192717 - user/kmacy/releng_7_2_fcs/sys/kern
Message-ID:  <200905250341.n4P3feQA009653@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
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);
+	}
 }
 
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200905250341.n4P3feQA009653>