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 {