From 22064e8f5fad6763a507bea0a7a43980b95e26eb Mon Sep 17 00:00:00 2001 From: Samuel J. Greear Date: Mon, 8 Feb 2010 16:01:09 -0700 Subject: [PATCH 4/4] Dynamically allocate sf_buf's --- sys/kern/kern_sfbuf.c | 20 ++++++++++++++++++++ 1 files changed, 20 insertions(+), 0 deletions(-) diff --git a/sys/kern/kern_sfbuf.c b/sys/kern/kern_sfbuf.c index 4630ba3..0123f99 100644 --- a/sys/kern/kern_sfbuf.c +++ b/sys/kern/kern_sfbuf.c @@ -158,6 +158,26 @@ sf_buf_alloc(struct vm_page *m, int flags) */ for (;;) { if ((sf = TAILQ_FIRST(&sf_buf_freelist)) == NULL) { + /* + * No available freelist entries, allocate a new one + * if we are allowed. + */ + if (nsfalloc < maxsfbufs) { + sf = kmalloc(sizeof(struct sf_buf), M_TEMP, + M_WAITOK | M_ZERO); + if (sf != NULL) { + sf->kva = + kmem_alloc_nofault(&kernel_map, + PAGE_SIZE); + if (sf->kva != 0) { + ++nsfalloc; + break; + } + + kfree(sf, M_TEMP); + } + } + pflags = (flags & SFB_CATCH) ? PCATCH : 0; ++sf_buf_alloc_want; error = ssleep(&sf_buf_freelist, &sf_buf_spin, pflags, -- 1.6.4