svn commit: r196668 - user/kmacy/head_zfs_merge/sys/cddl/contrib/opensolaris/uts/common/fs/zfs

Kip Macy kmacy at FreeBSD.org
Sun Aug 30 22:30:08 UTC 2009


Author: kmacy
Date: Sun Aug 30 22:30:07 2009
New Revision: 196668
URL: http://svn.freebsd.org/changeset/base/196668

Log:
  integrate 192698
  
  - align the arc state lock and reduce the length of time that it is held

Modified:
  user/kmacy/head_zfs_merge/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c

Modified: user/kmacy/head_zfs_merge/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c
==============================================================================
--- user/kmacy/head_zfs_merge/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c	Sun Aug 30 22:17:59 2009	(r196667)
+++ user/kmacy/head_zfs_merge/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c	Sun Aug 30 22:30:07 2009	(r196668)
@@ -227,7 +227,7 @@ typedef struct arc_state {
 	list_t	arcs_list[ARC_BUFC_NUMTYPES];	/* list of evictable buffers */
 	uint64_t arcs_lsize[ARC_BUFC_NUMTYPES];	/* amount of evictable data */
 	uint64_t arcs_size;	/* total amount of data in this state */
-	kmutex_t arcs_mtx;
+	kmutex_t arcs_mtx __aligned(128);
 } arc_state_t;
 
 /* The 6 states: */
@@ -972,6 +972,8 @@ add_reference(arc_buf_hdr_t *ab, kmutex_
 		mutex_enter(&ab->b_state->arcs_mtx);
 		ASSERT(list_link_active(&ab->b_arc_node));
 		list_remove(list, ab);
+		mutex_exit(&ab->b_state->arcs_mtx);
+
 		if (GHOST_STATE(ab->b_state)) {
 			ASSERT3U(ab->b_datacnt, ==, 0);
 			ASSERT3P(ab->b_buf, ==, NULL);
@@ -980,7 +982,6 @@ add_reference(arc_buf_hdr_t *ab, kmutex_
 		ASSERT(delta > 0);
 		ASSERT3U(*size, >=, delta);
 		atomic_add_64(size, -delta);
-		mutex_exit(&ab->b_state->arcs_mtx);
 		/* remove the prefetch flag if we get a reference */
 		if (ab->b_flags & ARC_PREFETCH)
 			ab->b_flags &= ~ARC_PREFETCH;
@@ -1004,9 +1005,10 @@ remove_reference(arc_buf_hdr_t *ab, kmut
 		mutex_enter(&state->arcs_mtx);
 		ASSERT(!list_link_active(&ab->b_arc_node));
 		list_insert_head(&state->arcs_list[ab->b_type], ab);
+		mutex_exit(&state->arcs_mtx);
+
 		ASSERT(ab->b_datacnt > 0);
 		atomic_add_64(size, ab->b_size * ab->b_datacnt);
-		mutex_exit(&state->arcs_mtx);
 	}
 	return (cnt);
 }


More information about the svn-src-user mailing list