summaryrefslogtreecommitdiff
path: root/sys/kern
diff options
context:
space:
mode:
authorDavid Gwynne <dlg@cvs.openbsd.org>2014-10-13 00:12:52 +0000
committerDavid Gwynne <dlg@cvs.openbsd.org>2014-10-13 00:12:52 +0000
commit033f2fdcab3333931c21db5ccde1df93a7e5188f (patch)
tree33b18a01eaaf7d3d3161defd8d35d5a4aa4db4a1 /sys/kern
parenteb3a60751d717adceb4ef55587ae1a28df9222f5 (diff)
take the pool_item pi_magic touching out from under #ifdef DIAGNOSTIC.
i couldnt measure a significant performance difference with or without it. this is likely a function of the memory involved being close to bits that are already being touched, the implemention being simple macros that mean registers can stay hot, and a lack of conditionals that would cause a cpu pipeline to crash. this means we're unconditionally poisoning the first two u_longs of pool items on all kernels. i think it also makes the code easier to read. discussed with deraadt@
Diffstat (limited to 'sys/kern')
-rw-r--r--sys/kern/subr_pool.c20
1 files changed, 4 insertions, 16 deletions
diff --git a/sys/kern/subr_pool.c b/sys/kern/subr_pool.c
index d49ac7e03d9..23d244e192a 100644
--- a/sys/kern/subr_pool.c
+++ b/sys/kern/subr_pool.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: subr_pool.c,v 1.162 2014/10/10 00:48:58 dlg Exp $ */
+/* $OpenBSD: subr_pool.c,v 1.163 2014/10/13 00:12:51 dlg Exp $ */
/* $NetBSD: subr_pool.c,v 1.61 2001/09/26 07:14:56 chs Exp $ */
/*-
@@ -566,14 +566,12 @@ pool_do_get(struct pool *pp, int flags)
if (__predict_false(pi == NULL))
panic("%s: %s: page empty", __func__, pp->pr_wchan);
-#ifdef DIAGNOSTIC
if (__predict_false(pi->pi_magic != POOL_IMAGIC(ph, pi))) {
panic("%s: %s free list modified: "
"page %p; item addr %p; offset 0x%x=0x%lx != 0x%lx",
__func__, pp->pr_wchan, ph->ph_page, pi,
0, pi->pi_magic, POOL_IMAGIC(ph, pi));
}
-#endif /* DIAGNOSTIC */
XSIMPLEQ_REMOVE_HEAD(&ph->ph_itemlist, pi_list);
@@ -648,9 +646,7 @@ pool_put(struct pool *pp, void *v)
}
#endif /* DIAGNOSTIC */
-#ifdef DIAGNOSTIC
pi->pi_magic = POOL_IMAGIC(ph, pi);
-#endif /* DIAGNOSTIC */
XSIMPLEQ_INSERT_HEAD(&ph->ph_itemlist, pi, pi_list);
#ifdef DIAGNOSTIC
if (POOL_PHPOISON(ph))
@@ -767,9 +763,7 @@ pool_p_alloc(struct pool *pp, int flags)
n = pp->pr_itemsperpage;
while (n--) {
pi = (struct pool_item *)addr;
-#ifdef DIAGNOSTIC
pi->pi_magic = POOL_IMAGIC(ph, pi);
-#endif
XSIMPLEQ_INSERT_TAIL(&ph->ph_itemlist, pi, pi_list);
#ifdef DIAGNOSTIC
@@ -786,14 +780,11 @@ pool_p_alloc(struct pool *pp, int flags)
void
pool_p_free(struct pool *pp, struct pool_item_header *ph)
{
-#ifdef DIAGNOSTIC
struct pool_item *pi;
-#endif
MUTEX_ASSERT_UNLOCKED(&pp->pr_mtx);
KASSERT(ph->ph_nmissing == 0);
-#ifdef DIAGNOSTIC
XSIMPLEQ_FOREACH(pi, &ph->ph_itemlist, pi_list) {
if (__predict_false(pi->pi_magic != POOL_IMAGIC(ph, pi))) {
panic("%s: %s free list modified: "
@@ -802,6 +793,7 @@ pool_p_free(struct pool *pp, struct pool_item_header *ph)
0, pi->pi_magic);
}
+#ifdef DIAGNOSTIC
if (POOL_PHPOISON(ph)) {
size_t pidx;
uint32_t pval;
@@ -814,8 +806,8 @@ pool_p_free(struct pool *pp, struct pool_item_header *ph)
pidx * sizeof(int), ip[pidx]);
}
}
- }
#endif
+ }
pool_allocator_free(pp, ph->ph_page);
@@ -1001,21 +993,17 @@ pool_print_pagelist(struct pool_pagelist *pl,
int (*pr)(const char *, ...) __attribute__((__format__(__kprintf__,1,2))))
{
struct pool_item_header *ph;
-#ifdef DIAGNOSTIC
struct pool_item *pi;
-#endif
LIST_FOREACH(ph, pl, ph_pagelist) {
(*pr)("\t\tpage %p, nmissing %d\n",
ph->ph_page, ph->ph_nmissing);
-#ifdef DIAGNOSTIC
XSIMPLEQ_FOREACH(pi, &ph->ph_itemlist, pi_list) {
if (pi->pi_magic != POOL_IMAGIC(ph, pi)) {
(*pr)("\t\t\titem %p, magic 0x%lx\n",
pi, pi->pi_magic);
}
}
-#endif
}
}
@@ -1162,7 +1150,6 @@ pool_chk_page(struct pool *pp, struct pool_item_header *ph, int expected)
for (pi = XSIMPLEQ_FIRST(&ph->ph_itemlist), n = 0;
pi != NULL;
pi = XSIMPLEQ_NEXT(&ph->ph_itemlist, pi, pi_list), n++) {
-#ifdef DIAGNOSTIC
if (pi->pi_magic != POOL_IMAGIC(ph, pi)) {
printf("%s: ", label);
printf("pool(%p:%s): free list modified: "
@@ -1172,6 +1159,7 @@ pool_chk_page(struct pool *pp, struct pool_item_header *ph, int expected)
0, pi->pi_magic);
}
+#ifdef DIAGNOSTIC
if (POOL_PHPOISON(ph)) {
size_t pidx;
uint32_t pval;