Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/kern Misc changes:



details:   https://anonhg.NetBSD.org/src/rev/92a61dfbd4d1
branches:  trunk
changeset: 449683:92a61dfbd4d1
user:      maxv <maxv%NetBSD.org@localhost>
date:      Sat Mar 16 13:33:10 2019 +0000

description:
Misc changes:

 - Turn two KASSERTs to real panics, they are useful and not expensive.
 - Rename a few variables for clarity.
 - Add a new panic, to make sure a freed item is in the item space.

diffstat:

 sys/kern/subr_pool.c |  49 ++++++++++++++++++++++++++++++++-----------------
 1 files changed, 32 insertions(+), 17 deletions(-)

diffs (137 lines):

diff -r 2f127fdff4c5 -r 92a61dfbd4d1 sys/kern/subr_pool.c
--- a/sys/kern/subr_pool.c      Sat Mar 16 12:52:47 2019 +0000
+++ b/sys/kern/subr_pool.c      Sat Mar 16 13:33:10 2019 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: subr_pool.c,v 1.236 2019/03/13 20:56:33 maxv Exp $     */
+/*     $NetBSD: subr_pool.c,v 1.237 2019/03/16 13:33:10 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.236 2019/03/13 20:56:33 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: subr_pool.c,v 1.237 2019/03/16 13:33:10 maxv Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_ddb.h"
@@ -269,7 +269,12 @@
 
        KASSERT(pp->pr_roflags & PR_NOTOUCH);
        idx = (cp - (char *)ph->ph_page - ph->ph_off) / pp->pr_size;
-       KASSERT(idx < pp->pr_itemsperpage);
+
+       if (__predict_false(idx >= pp->pr_itemsperpage)) {
+               panic("%s: [%s] %u >= %u", __func__, pp->pr_wchan, idx,
+                   pp->pr_itemsperpage);
+       }
+
        return idx;
 }
 
@@ -281,7 +286,10 @@
        pool_item_bitmap_t *bitmap = ph->ph_bitmap + (idx / BITMAP_SIZE);
        pool_item_bitmap_t mask = 1U << (idx & BITMAP_MASK);
 
-       KASSERT((*bitmap & mask) == 0);
+       if (__predict_false((*bitmap & mask) != 0)) {
+               panic("%s: [%s] %p already freed", __func__, pp->pr_wchan, obj);
+       }
+
        *bitmap |= mask;
 }
 
@@ -433,8 +441,13 @@
                        ph = (struct pool_item_header *)
                            ((char *)page + pp->pr_phoffset);
                        if (__predict_false((void *)ph->ph_page != page)) {
-                               panic("%s: [%s] item not part of pool",
-                                   __func__, pp->pr_wchan);
+                               panic("%s: [%s] item %p not part of pool",
+                                   __func__, pp->pr_wchan, v);
+                       }
+                       if (__predict_false((char *)v < (char *)page +
+                           ph->ph_off)) {
+                               panic("%s: [%s] item %p below item space",
+                                   __func__, pp->pr_wchan, v);
                        }
                } else {
                        tmp.ph_page = page;
@@ -565,7 +578,7 @@
 {
        struct pool *pp1;
        size_t trysize, phsize, prsize;
-       int off, slack;
+       int itemspace, slack;
 
 #ifdef DEBUG
        if (__predict_true(!cold))
@@ -674,11 +687,12 @@
            trysize / pp->pr_size == (trysize - phsize) / pp->pr_size))) {
                /* Use the end of the page for the page header */
                pp->pr_roflags |= PR_PHINPAGE;
-               pp->pr_phoffset = off = palloc->pa_pagesz - phsize;
+               itemspace = palloc->pa_pagesz - phsize;
+               pp->pr_phoffset = itemspace;
        } else {
                /* The page header will be taken from our page header pool */
+               itemspace = palloc->pa_pagesz;
                pp->pr_phoffset = 0;
-               off = palloc->pa_pagesz;
                SPLAY_INIT(&pp->pr_phtree);
        }
 
@@ -687,7 +701,8 @@
         * we must reserve up to `align - 1' bytes on the page to allow
         * appropriate positioning of each item.
         */
-       pp->pr_itemsperpage = (off - ((align - ioff) % align)) / pp->pr_size;
+       pp->pr_itemsperpage =
+           (itemspace - ((align - ioff) % align)) / pp->pr_size;
        KASSERT(pp->pr_itemsperpage != 0);
        if ((pp->pr_roflags & PR_NOTOUCH)) {
                int idx;
@@ -719,7 +734,7 @@
         * Use the slack between the chunks and the page header
         * for "cache coloring".
         */
-       slack = off - pp->pr_itemsperpage * pp->pr_size;
+       slack = itemspace - pp->pr_itemsperpage * pp->pr_size;
        pp->pr_maxcolor = (slack / align) * align;
        pp->pr_curcolor = 0;
 
@@ -1125,7 +1140,7 @@
 pool_grow(struct pool *pp, int flags)
 {
        struct pool_item_header *ph;
-       char *cp;
+       char *storage;
 
        /*
         * If there's a pool_grow in progress, wait for it to complete
@@ -1158,19 +1173,19 @@
        else
                pp->pr_flags |= PR_GROWINGNOWAIT;
 
-       cp = pool_allocator_alloc(pp, flags);
-       if (__predict_false(cp == NULL))
+       storage = pool_allocator_alloc(pp, flags);
+       if (__predict_false(storage == NULL))
                goto out;
 
-       ph = pool_alloc_item_header(pp, cp, flags);
+       ph = pool_alloc_item_header(pp, storage, flags);
        if (__predict_false(ph == NULL)) {
-               pool_allocator_free(pp, cp);
+               pool_allocator_free(pp, storage);
                goto out;
        }
 
        if (flags & PR_WAITOK)
                mutex_enter(&pp->pr_lock);
-       pool_prime_page(pp, cp, ph);
+       pool_prime_page(pp, storage, ph);
        pp->pr_npagealloc++;
        KASSERT(pp->pr_flags & PR_GROWING);
        pp->pr_flags &= ~(PR_GROWING|PR_GROWINGNOWAIT);



Home | Main Index | Thread Index | Old Index