Module Name:    src
Committed By:   skrll
Date:           Mon Jul 24 19:56:07 UTC 2017

Modified Files:
        src/sys/kern: subr_extent.c
        src/sys/sys: extent.h

Log Message:
Add a condition variable (ex_flwanted) to struct extent so that ex_flags
becomes an invariant.

Remove strange locking for ex_flags as a result.


To generate a diff of this commit:
cvs rdiff -u -r1.80 -r1.81 src/sys/kern/subr_extent.c
cvs rdiff -u -r1.20 -r1.21 src/sys/sys/extent.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/kern/subr_extent.c
diff -u src/sys/kern/subr_extent.c:1.80 src/sys/kern/subr_extent.c:1.81
--- src/sys/kern/subr_extent.c:1.80	Mon Dec 19 13:02:14 2016
+++ src/sys/kern/subr_extent.c	Mon Jul 24 19:56:07 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: subr_extent.c,v 1.80 2016/12/19 13:02:14 cherry Exp $	*/
+/*	$NetBSD: subr_extent.c,v 1.81 2017/07/24 19:56:07 skrll Exp $	*/
 
 /*-
  * Copyright (c) 1996, 1998, 2007 The NetBSD Foundation, Inc.
@@ -34,7 +34,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: subr_extent.c,v 1.80 2016/12/19 13:02:14 cherry Exp $");
+__KERNEL_RCSID(0, "$NetBSD: subr_extent.c,v 1.81 2017/07/24 19:56:07 skrll Exp $");
 
 #ifdef _KERNEL
 #ifdef _KERNEL_OPT
@@ -126,17 +126,9 @@ static struct extent_region *
 extent_alloc_region_descriptor(struct extent *ex, int flags)
 {
 	struct extent_region *rp;
-	int exflags, error;
-
-	/*
-	 * XXX Make a static, create-time flags word, so we don't
-	 * XXX have to lock to read it!
-	 */
-	mutex_enter(&ex->ex_lock);
-	exflags = ex->ex_flags;
-	mutex_exit(&ex->ex_lock);
+	int error;
 
-	if (exflags & EXF_FIXED) {
+	if (ex->ex_flags & EXF_FIXED) {
 		struct extent_fixed *fex = (struct extent_fixed *)ex;
 
 		mutex_enter(&ex->ex_lock);
@@ -160,7 +152,7 @@ extent_alloc_region_descriptor(struct ex
 				mutex_exit(&ex->ex_lock);
 				return (NULL);
 			}
-			ex->ex_flags |= EXF_FLWANTED;
+			ex->ex_flwanted = true;
 			if ((flags & EX_CATCH) != 0)
 				error = cv_wait_sig(&ex->ex_cv, &ex->ex_lock);
 			else {
@@ -199,7 +191,7 @@ extent_free_region_descriptor(struct ext
 		 * just free'ing it back to the system.
 		 */
 		if (rp->er_flags & ER_ALLOC) {
-			if (ex->ex_flags & EXF_FLWANTED) {
+			if (ex->ex_flwanted) {
 				/* Clear all but ER_ALLOC flag. */
 				rp->er_flags = ER_ALLOC;
 				LIST_INSERT_HEAD(&fex->fex_freelist, rp,
@@ -214,7 +206,7 @@ extent_free_region_descriptor(struct ext
 		}
 
  wake_em_up:
-		ex->ex_flags &= ~EXF_FLWANTED;
+		ex->ex_flwanted = false;
 		cv_broadcast(&ex->ex_cv);
 		return;
 	}
@@ -300,6 +292,7 @@ extent_create(const char *name, u_long s
 	ex->ex_start = start;
 	ex->ex_end = end;
 	ex->ex_flags = 0;
+	ex->ex_flwanted = false;
 	if (fixed_extent)
 		ex->ex_flags |= EXF_FIXED;
 	if (flags & EX_NOCOALESCE)
@@ -1009,7 +1002,6 @@ extent_free(struct extent *ex, u_long st
 {
 	struct extent_region *rp, *nrp = NULL;
 	u_long end = start + (size - 1);
-	int coalesce;
 
 #ifdef DIAGNOSTIC
 	/*
@@ -1040,13 +1032,8 @@ extent_free(struct extent *ex, u_long st
 	/*
 	 * If we're allowing coalescing, we must allocate a region
 	 * descriptor now, since it might block.
-	 *
-	 * XXX Make a static, create-time flags word, so we don't
-	 * XXX have to lock to read it!
 	 */
-	mutex_enter(&ex->ex_lock);
-	coalesce = (ex->ex_flags & EXF_NOCOALESCE) == 0;
-	mutex_exit(&ex->ex_lock);
+	const bool coalesce = (ex->ex_flags & EXF_NOCOALESCE) == 0;
 
 	if (coalesce) {
 		/* Allocate a region descriptor. */

Index: src/sys/sys/extent.h
diff -u src/sys/sys/extent.h:1.20 src/sys/sys/extent.h:1.21
--- src/sys/sys/extent.h:1.20	Mon Jul 24 19:22:32 2017
+++ src/sys/sys/extent.h	Mon Jul 24 19:56:07 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: extent.h,v 1.20 2017/07/24 19:22:32 skrll Exp $	*/
+/*	$NetBSD: extent.h,v 1.21 2017/07/24 19:56:07 skrll Exp $	*/
 
 /*-
  * Copyright (c) 1996, 1998 The NetBSD Foundation, Inc.
@@ -55,6 +55,7 @@ struct extent {
 	u_long	ex_start;		/* start of extent */
 	u_long	ex_end;			/* end of extent */
 	int	ex_flags;		/* misc. information */
+	bool	ex_flwanted;		/* someone asleep on freelist */
 };
 
 struct extent_fixed {

Reply via email to