From 1d5af025949a4363acf31b4d4fdcacf5b24d4ef5 Mon Sep 17 00:00:00 2001 From: Matthew Dillon Date: Thu, 13 May 2004 01:34:03 +0000 Subject: [PATCH] sf_buf_free() requires a critical section to safely manipulate the free list and possibly even the reference count field. ( sf_buf_alloc() is already using a critical section ). --- sys/kern/kern_sfbuf.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/sys/kern/kern_sfbuf.c b/sys/kern/kern_sfbuf.c index 2dedaf50ff..53e6625ac4 100644 --- a/sys/kern/kern_sfbuf.c +++ b/sys/kern/kern_sfbuf.c @@ -22,7 +22,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $DragonFly: src/sys/kern/kern_sfbuf.c,v 1.5 2004/05/13 00:44:12 hmp Exp $ + * $DragonFly: src/sys/kern/kern_sfbuf.c,v 1.6 2004/05/13 01:34:03 dillon Exp $ */ #include @@ -221,6 +221,7 @@ sf_buf_free(struct sf_buf *sf) { if (sf->refcnt == 0) panic("sf_buf_free: freeing free sf_buf"); + crit_enter(); sf->refcnt--; if (sf->refcnt == 0 && (sf->flags & SFBA_ONFREEQ) == 0) { KKASSERT(sf->aux1 == 0 && sf->aux2 == 0); @@ -229,5 +230,6 @@ sf_buf_free(struct sf_buf *sf) if (sf_buf_alloc_want > 0) wakeup_one(&sf_buf_freelist); } + crit_exit(); } -- 2.41.0