Module Name:    src
Committed By:   maxv
Date:           Mon Mar 11 20:21:33 UTC 2019

Modified Files:
        src/sys/kern: subr_pool.c

Log Message:
Rename pr_item_notouch_* to pr_item_bitmap_*, and move some code into new
pr_item_linkedlist_* functions. This makes it easier to see that we have
two ways of handling freed items.

No functional change.


To generate a diff of this commit:
cvs rdiff -u -r1.233 -r1.234 src/sys/kern/subr_pool.c

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_pool.c
diff -u src/sys/kern/subr_pool.c:1.233 src/sys/kern/subr_pool.c:1.234
--- src/sys/kern/subr_pool.c:1.233	Mon Feb 11 11:12:58 2019
+++ src/sys/kern/subr_pool.c	Mon Mar 11 20:21:32 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: subr_pool.c,v 1.233 2019/02/11 11:12:58 maxv Exp $	*/
+/*	$NetBSD: subr_pool.c,v 1.234 2019/03/11 20:21:32 maxv Exp $	*/
 
 /*
  * Copyright (c) 1997, 1999, 2000, 2002, 2007, 2008, 2010, 2014, 2015, 2018
@@ -33,7 +33,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: subr_pool.c,v 1.233 2019/02/11 11:12:58 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: subr_pool.c,v 1.234 2019/03/11 20:21:32 maxv Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_ddb.h"
@@ -258,8 +258,10 @@ static void pool_print1(struct pool *, c
 static int pool_chk_page(struct pool *, const char *,
 			 struct pool_item_header *);
 
+/* -------------------------------------------------------------------------- */
+
 static inline unsigned int
-pr_item_notouch_index(const struct pool *pp, const struct pool_item_header *ph,
+pr_item_bitmap_index(const struct pool *pp, const struct pool_item_header *ph,
     const void *v)
 {
 	const char *cp = v;
@@ -272,10 +274,10 @@ pr_item_notouch_index(const struct pool 
 }
 
 static inline void
-pr_item_notouch_put(const struct pool *pp, struct pool_item_header *ph,
+pr_item_bitmap_put(const struct pool *pp, struct pool_item_header *ph,
     void *obj)
 {
-	unsigned int idx = pr_item_notouch_index(pp, ph, obj);
+	unsigned int idx = pr_item_bitmap_index(pp, ph, obj);
 	pool_item_bitmap_t *bitmap = ph->ph_bitmap + (idx / BITMAP_SIZE);
 	pool_item_bitmap_t mask = 1U << (idx & BITMAP_MASK);
 
@@ -284,7 +286,7 @@ pr_item_notouch_put(const struct pool *p
 }
 
 static inline void *
-pr_item_notouch_get(const struct pool *pp, struct pool_item_header *ph)
+pr_item_bitmap_get(const struct pool *pp, struct pool_item_header *ph)
 {
 	pool_item_bitmap_t *bitmap = ph->ph_bitmap;
 	unsigned int idx;
@@ -311,7 +313,7 @@ pr_item_notouch_get(const struct pool *p
 }
 
 static inline void
-pr_item_notouch_init(const struct pool *pp, struct pool_item_header *ph)
+pr_item_bitmap_init(const struct pool *pp, struct pool_item_header *ph)
 {
 	pool_item_bitmap_t *bitmap = ph->ph_bitmap;
 	const int n = howmany(pp->pr_itemsperpage, BITMAP_SIZE);
@@ -322,6 +324,60 @@ pr_item_notouch_init(const struct pool *
 	}
 }
 
+/* -------------------------------------------------------------------------- */
+
+static inline void
+pr_item_linkedlist_put(const struct pool *pp, struct pool_item_header *ph,
+    void *obj)
+{
+	struct pool_item *pi = obj;
+
+#ifdef POOL_CHECK_MAGIC
+	pi->pi_magic = PI_MAGIC;
+#endif
+
+	if (pp->pr_redzone) {
+		/*
+		 * Mark the pool_item as valid. The rest is already
+		 * invalid.
+		 */
+		kasan_mark(pi, sizeof(*pi), sizeof(*pi));
+	}
+
+	LIST_INSERT_HEAD(&ph->ph_itemlist, pi, pi_list);
+}
+
+static inline void *
+pr_item_linkedlist_get(struct pool *pp, struct pool_item_header *ph)
+{
+	struct pool_item *pi;
+	void *v;
+
+	v = pi = LIST_FIRST(&ph->ph_itemlist);
+	if (__predict_false(v == NULL)) {
+		mutex_exit(&pp->pr_lock);
+		panic("%s: [%s] page empty", __func__, pp->pr_wchan);
+	}
+	KASSERTMSG((pp->pr_nitems > 0),
+	    "%s: [%s] nitems %u inconsistent on itemlist",
+	    __func__, pp->pr_wchan, pp->pr_nitems);
+#ifdef POOL_CHECK_MAGIC
+	KASSERTMSG((pi->pi_magic == PI_MAGIC),
+	    "%s: [%s] free list modified: "
+	    "magic=%x; page %p; item addr %p", __func__,
+	    pp->pr_wchan, pi->pi_magic, ph->ph_page, pi);
+#endif
+
+	/*
+	 * Remove from item list.
+	 */
+	LIST_REMOVE(pi, pi_list);
+
+	return v;
+}
+
+/* -------------------------------------------------------------------------- */
+
 static inline int
 phtree_compare(struct pool_item_header *a, struct pool_item_header *b)
 {
@@ -777,7 +833,6 @@ pool_alloc_item_header(struct pool *pp, 
 void *
 pool_get(struct pool *pp, int flags)
 {
-	struct pool_item *pi;
 	struct pool_item_header *ph;
 	void *v;
 
@@ -892,27 +947,9 @@ pool_get(struct pool *pp, int flags)
 	if (pp->pr_roflags & PR_NOTOUCH) {
 		KASSERTMSG((ph->ph_nmissing < pp->pr_itemsperpage),
 		    "%s: %s: page empty", __func__, pp->pr_wchan);
-		v = pr_item_notouch_get(pp, ph);
+		v = pr_item_bitmap_get(pp, ph);
 	} else {
-		v = pi = LIST_FIRST(&ph->ph_itemlist);
-		if (__predict_false(v == NULL)) {
-			mutex_exit(&pp->pr_lock);
-			panic("%s: [%s] page empty", __func__, pp->pr_wchan);
-		}
-		KASSERTMSG((pp->pr_nitems > 0),
-		    "%s: [%s] nitems %u inconsistent on itemlist",
-		    __func__, pp->pr_wchan, pp->pr_nitems);
-#ifdef POOL_CHECK_MAGIC
-		KASSERTMSG((pi->pi_magic == PI_MAGIC),
-		    "%s: [%s] free list modified: "
-		    "magic=%x; page %p; item addr %p", __func__,
-		    pp->pr_wchan, pi->pi_magic, ph->ph_page, pi);
-#endif
-
-		/*
-		 * Remove from item list.
-		 */
-		LIST_REMOVE(pi, pi_list);
+		v = pr_item_linkedlist_get(pp, ph);
 	}
 	pp->pr_nitems--;
 	pp->pr_nout++;
@@ -973,7 +1010,6 @@ pool_get(struct pool *pp, int flags)
 static void
 pool_do_put(struct pool *pp, void *v, struct pool_pagelist *pq)
 {
-	struct pool_item *pi = v;
 	struct pool_item_header *ph;
 
 	KASSERT(mutex_owned(&pp->pr_lock));
@@ -992,21 +1028,9 @@ pool_do_put(struct pool *pp, void *v, st
 	 * Return to item list.
 	 */
 	if (pp->pr_roflags & PR_NOTOUCH) {
-		pr_item_notouch_put(pp, ph, v);
+		pr_item_bitmap_put(pp, ph, v);
 	} else {
-#ifdef POOL_CHECK_MAGIC
-		pi->pi_magic = PI_MAGIC;
-#endif
-
-		if (pp->pr_redzone) {
-			/*
-			 * Mark the pool_item as valid. The rest is already
-			 * invalid.
-			 */
-			kasan_mark(pi, sizeof(*pi), sizeof(*pi));
-		}
-
-		LIST_INSERT_HEAD(&ph->ph_itemlist, pi, pi_list);
+		pr_item_linkedlist_put(pp, ph, v);
 	}
 	KDASSERT(ph->ph_nmissing != 0);
 	ph->ph_nmissing--;
@@ -1244,7 +1268,7 @@ pool_prime_page(struct pool *pp, void *s
 	pp->pr_nitems += n;
 
 	if (pp->pr_roflags & PR_NOTOUCH) {
-		pr_item_notouch_init(pp, ph);
+		pr_item_bitmap_init(pp, ph);
 	} else {
 		while (n--) {
 			pi = (struct pool_item *)cp;
@@ -2982,7 +3006,7 @@ pool_allocated(struct pool *pp, struct p
 {
 
 	if ((pp->pr_roflags & PR_NOTOUCH) != 0) {
-		unsigned int idx = pr_item_notouch_index(pp, ph, (void *)addr);
+		unsigned int idx = pr_item_bitmap_index(pp, ph, (void *)addr);
 		pool_item_bitmap_t *bitmap =
 		    ph->ph_bitmap + (idx / BITMAP_SIZE);
 		pool_item_bitmap_t mask = 1 << (idx & BITMAP_MASK);

Reply via email to