summaryrefslogtreecommitdiffstats
path: root/sys/netgraph
diff options
context:
space:
mode:
authorjulian <julian@FreeBSD.org>2001-01-25 19:48:57 +0000
committerjulian <julian@FreeBSD.org>2001-01-25 19:48:57 +0000
commit7210110be52b821876f4d62c1bd2fe555feb0508 (patch)
tree28a54c9f00d92ed2bd453108f60f20a46a810d7f /sys/netgraph
parent551775d3fbf1942ca76473e3acfd37899e15b054 (diff)
downloadFreeBSD-src-7210110be52b821876f4d62c1bd2fe555feb0508.zip
FreeBSD-src-7210110be52b821876f4d62c1bd2fe555feb0508.tar.gz
Only clear the 'free' bit if we were successful in getting a queue item off the free list.
Found by: Harti Brandt (address unknown)
Diffstat (limited to 'sys/netgraph')
-rw-r--r--sys/netgraph/ng_base.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/sys/netgraph/ng_base.c b/sys/netgraph/ng_base.c
index 78b4aaa..d7370eb 100644
--- a/sys/netgraph/ng_base.c
+++ b/sys/netgraph/ng_base.c
@@ -3027,7 +3027,7 @@ ng_getqblk(void)
* ngqfree is the final arbiter. We have our little reserve
* because we use M_NOWAIT for malloc. This just helps us
* avoid dropping packets while not increasing the time
- * we take to service the interrupt (on average) (we hope).
+ * we take to service the interrupt (on average) (I hope).
*/
for (;;) {
if ((ngqfreesize < ngqfreelow) || (ngqfree == NULL)) {
@@ -3062,15 +3062,19 @@ ng_getqblk(void)
*/
if (atomic_cmpset_ptr(&ngqfree, item, item->el_next)) {
atomic_subtract_int(&ngqfreesize, 1);
+ item->el_flags &= ~NGQF_FREE;
break;
}
+ /*
+ * something got there before we did.. try again
+ * (go around the loop again)
+ */
item = NULL;
} else {
/* We really ran out */
break;
}
}
- item->el_flags &= ~NGQF_FREE;
return (item);
}
OpenPOWER on IntegriCloud