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 {