Index: sys/kern/subr_extent.c =================================================================== RCS file: /cvsroot/src/sys/kern/subr_extent.c,v retrieving revision 1.81 diff -u -p -r1.81 subr_extent.c --- sys/kern/subr_extent.c 24 Jul 2017 19:56:07 -0000 1.81 +++ sys/kern/subr_extent.c 23 Aug 2017 13:21:46 -0000 @@ -131,6 +131,7 @@ extent_alloc_region_descriptor(struct ex if (ex->ex_flags & EXF_FIXED) { struct extent_fixed *fex = (struct extent_fixed *)ex; + if (!(ex->ex_flags & EXF_EARLY)) mutex_enter(&ex->ex_lock); for (;;) { if ((rp = LIST_FIRST(&fex->fex_freelist)) != NULL) { @@ -141,17 +142,21 @@ extent_alloc_region_descriptor(struct ex * need to remember that information. */ LIST_REMOVE(rp, er_link); - mutex_exit(&ex->ex_lock); + if (!(ex->ex_flags & EXF_EARLY)) + mutex_exit(&ex->ex_lock); return (rp); } if (flags & EX_MALLOCOK) { - mutex_exit(&ex->ex_lock); + if (!(ex->ex_flags & EXF_EARLY)) + mutex_exit(&ex->ex_lock); goto alloc; } if ((flags & EX_WAITOK) == 0) { - mutex_exit(&ex->ex_lock); + if (!(ex->ex_flags & EXF_EARLY)) + mutex_exit(&ex->ex_lock); return (NULL); } + KASSERT(mutex_owned(&ex->ex_lock)); ex->ex_flwanted = true; if ((flags & EX_CATCH) != 0) error = cv_wait_sig(&ex->ex_cv, &ex->ex_lock); @@ -206,8 +211,10 @@ extent_free_region_descriptor(struct ext } wake_em_up: - ex->ex_flwanted = false; - cv_broadcast(&ex->ex_cv); + if (!(ex->ex_flags & EXF_EARLY)) { + ex->ex_flwanted = false; + cv_broadcast(&ex->ex_cv); + } return; } @@ -297,6 +304,8 @@ extent_create(const char *name, u_long s ex->ex_flags |= EXF_FIXED; if (flags & EX_NOCOALESCE) ex->ex_flags |= EXF_NOCOALESCE; + if (flags & EX_EARLY) + ex->ex_flags |= EXF_EARLY; return (ex); } @@ -507,7 +516,8 @@ extent_alloc_region(struct extent *ex, u return (ENOMEM); } - mutex_enter(&ex->ex_lock); + if (!(ex->ex_flags & EXF_EARLY)) + mutex_enter(&ex->ex_lock); alloc_start: /* @@ -545,6 +555,7 @@ extent_alloc_region(struct extent *ex, u * do so. */ if (flags & EX_WAITSPACE) { + KASSERT(!(ex->ex_flags & EXF_EARLY)); if ((flags & EX_CATCH) != 0) error = cv_wait_sig(&ex->ex_cv, &ex->ex_lock); @@ -556,7 +567,8 @@ extent_alloc_region(struct extent *ex, u goto alloc_start; mutex_exit(&ex->ex_lock); } else { - mutex_exit(&ex->ex_lock); + if (!(ex->ex_flags & EXF_EARLY)) + mutex_exit(&ex->ex_lock); error = EAGAIN; } extent_free_region_descriptor(ex, myrp); @@ -576,7 +588,8 @@ extent_alloc_region(struct extent *ex, u * at the beginning of the region list. Insert ourselves. */ extent_insert_and_optimize(ex, start, size, flags, last, myrp); - mutex_exit(&ex->ex_lock); + if (!(ex->ex_flags & EXF_EARLY)) + mutex_exit(&ex->ex_lock); return (0); } @@ -1042,7 +1055,8 @@ extent_free(struct extent *ex, u_long st return (ENOMEM); } - mutex_enter(&ex->ex_lock); + if (!(ex->ex_flags & EXF_EARLY)) + mutex_enter(&ex->ex_lock); /* * Find region and deallocate. Several possibilities: @@ -1125,7 +1139,8 @@ extent_free(struct extent *ex, u_long st } /* Region not found, or request otherwise invalid. */ - mutex_exit(&ex->ex_lock); + if (!(ex->ex_flags & EXF_EARLY)) + mutex_exit(&ex->ex_lock); extent_print(ex); printf("extent_free: start 0x%lx, end 0x%lx\n", start, end); panic("extent_free: region not found"); @@ -1133,8 +1148,10 @@ extent_free(struct extent *ex, u_long st done: if (nrp != NULL) extent_free_region_descriptor(ex, nrp); - cv_broadcast(&ex->ex_cv); - mutex_exit(&ex->ex_lock); + if (!(ex->ex_flags & EXF_EARLY)) { + cv_broadcast(&ex->ex_cv); + mutex_exit(&ex->ex_lock); + } return (0); } Index: sys/sys/extent.h =================================================================== RCS file: /cvsroot/src/sys/sys/extent.h,v retrieving revision 1.25 diff -u -p -r1.25 extent.h --- sys/sys/extent.h 27 Jul 2017 10:04:28 -0000 1.25 +++ sys/sys/extent.h 23 Aug 2017 13:21:47 -0000 @@ -73,8 +73,9 @@ struct extent_fixed { /* ex_flags; for internal use only */ #define EXF_FIXED __BIT(0) /* extent uses fixed storage */ #define EXF_NOCOALESCE __BIT(1) /* coalescing of regions not allowed */ +#define EXF_EARLY __BIT(2) /* no need to lock */ -#define EXF_BITS "\20\2NOCOALESCE\1FIXED" +#define EXF_BITS "\20\3EARLY\2NOCOALESCE\1FIXED" /* misc. flags passed to extent functions */ #define EX_NOWAIT 0 /* not safe to sleep */