Module Name:    src
Committed By:   jmcneill
Date:           Thu Aug 24 11:33:28 UTC 2017

Modified Files:
        src/sys/arch/evbarm/fdt: fdt_machdep.c
        src/sys/kern: subr_extent.c
        src/sys/sys: extent.h

Log Message:
Add EX_EARLY flag for extent_create, which skips locking. Required for
using extent subsystem in early bootstrap code, before caches are enabled.
>From skrll@


To generate a diff of this commit:
cvs rdiff -u -r1.12 -r1.13 src/sys/arch/evbarm/fdt/fdt_machdep.c
cvs rdiff -u -r1.81 -r1.82 src/sys/kern/subr_extent.c
cvs rdiff -u -r1.25 -r1.26 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/arch/evbarm/fdt/fdt_machdep.c
diff -u src/sys/arch/evbarm/fdt/fdt_machdep.c:1.12 src/sys/arch/evbarm/fdt/fdt_machdep.c:1.13
--- src/sys/arch/evbarm/fdt/fdt_machdep.c:1.12	Sun Aug 20 21:00:01 2017
+++ src/sys/arch/evbarm/fdt/fdt_machdep.c	Thu Aug 24 11:33:28 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: fdt_machdep.c,v 1.12 2017/08/20 21:00:01 jakllsch Exp $ */
+/* $NetBSD: fdt_machdep.c,v 1.13 2017/08/24 11:33:28 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2015-2017 Jared McNeill <jmcne...@invisible.ca>
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: fdt_machdep.c,v 1.12 2017/08/20 21:00:01 jakllsch Exp $");
+__KERNEL_RCSID(0, "$NetBSD: fdt_machdep.c,v 1.13 2017/08/24 11:33:28 jmcneill Exp $");
 
 #include "opt_machdep.h"
 #include "opt_ddb.h"
@@ -230,7 +230,7 @@ fdt_build_bootconfig(uint64_t mem_addr, 
 	int index, error;
  
 	fdt_memory_ext = extent_create("FDT Memory", mem_addr, max_addr,
-	    fdt_memory_ext_storage, sizeof(fdt_memory_ext_storage), 0);
+	    fdt_memory_ext_storage, sizeof(fdt_memory_ext_storage), EX_EARLY);
 
 	for (index = 0;
 	     fdtbus_get_reg64(memory, index, &addr, &size) == 0;

Index: src/sys/kern/subr_extent.c
diff -u src/sys/kern/subr_extent.c:1.81 src/sys/kern/subr_extent.c:1.82
--- src/sys/kern/subr_extent.c:1.81	Mon Jul 24 19:56:07 2017
+++ src/sys/kern/subr_extent.c	Thu Aug 24 11:33:28 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: subr_extent.c,v 1.81 2017/07/24 19:56:07 skrll Exp $	*/
+/*	$NetBSD: subr_extent.c,v 1.82 2017/08/24 11:33:28 jmcneill 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.81 2017/07/24 19:56:07 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: subr_extent.c,v 1.82 2017/08/24 11:33:28 jmcneill Exp $");
 
 #ifdef _KERNEL
 #ifdef _KERNEL_OPT
@@ -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: src/sys/sys/extent.h
diff -u src/sys/sys/extent.h:1.25 src/sys/sys/extent.h:1.26
--- src/sys/sys/extent.h:1.25	Thu Jul 27 10:04:28 2017
+++ src/sys/sys/extent.h	Thu Aug 24 11:33:28 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: extent.h,v 1.25 2017/07/27 10:04:28 skrll Exp $	*/
+/*	$NetBSD: extent.h,v 1.26 2017/08/24 11:33:28 jmcneill Exp $	*/
 
 /*-
  * Copyright (c) 1996, 1998 The NetBSD Foundation, Inc.
@@ -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 */
@@ -85,6 +86,7 @@ struct extent_fixed {
 #define EX_MALLOCOK	__BIT(4)	/* safe to call kmem_alloc() */
 #define EX_WAITSPACE	__BIT(5)	/* wait for space to become free */
 #define EX_BOUNDZERO	__BIT(6)	/* boundary lines start at 0 */
+#define EX_EARLY	__BIT(7)	/* safe for early kernel bootstrap */
 
 /*
  * Special place holders for "alignment" and "boundary" arguments,

Reply via email to