aboutsummaryrefslogtreecommitdiff
path: root/sys/kern/uipc_syscalls.c
diff options
context:
space:
mode:
authorBosko Milekic <bmilekic@FreeBSD.org>2000-11-04 21:55:25 +0000
committerBosko Milekic <bmilekic@FreeBSD.org>2000-11-04 21:55:25 +0000
commitfe27eea9d1dcedda59c68388e2a9b027db3c58eb (patch)
tree7aa9c79fed7dec7070699ce53de449dd98cef6d0 /sys/kern/uipc_syscalls.c
parent86d42bbdbe7262b36b836500753915b4a78ef269 (diff)
downloadsrc-fe27eea9d1dcedda59c68388e2a9b027db3c58eb.tar.gz
src-fe27eea9d1dcedda59c68388e2a9b027db3c58eb.zip
Change the sf_bufs wakeups to be wakeup_one(), because we don't want to
wakeup all of the sleeping threads when we free only one buffer. This avoids us having to needlessly try again (and fail, and go back to sleep) for all the threads sleeping. We will now only wakeup the thread we know will succeed. Reviewed by: green
Notes
Notes: svn path=/head/; revision=68331
Diffstat (limited to 'sys/kern/uipc_syscalls.c')
-rw-r--r--sys/kern/uipc_syscalls.c9
1 files changed, 5 insertions, 4 deletions
diff --git a/sys/kern/uipc_syscalls.c b/sys/kern/uipc_syscalls.c
index 8cfbf80b785f..e3edad8e1f13 100644
--- a/sys/kern/uipc_syscalls.c
+++ b/sys/kern/uipc_syscalls.c
@@ -95,7 +95,7 @@ static struct {
static vm_offset_t sf_base;
static struct sf_buf *sf_bufs;
-static int sf_buf_alloc_want;
+static u_int sf_buf_alloc_want;
/*
* System call interface to the socket abstraction.
@@ -1345,6 +1345,7 @@ sf_buf_init(void *arg)
sf_bufs[i].kva = sf_base + i * PAGE_SIZE;
SLIST_INSERT_HEAD(&sf_freelist, &sf_bufs[i], free_list);
}
+ sf_buf_alloc_want = 0;
mtx_exit(&sf_freelist.sf_lock, MTX_DEF);
}
@@ -1358,7 +1359,7 @@ sf_buf_alloc()
mtx_enter(&sf_freelist.sf_lock, MTX_DEF);
while ((sf = SLIST_FIRST(&sf_freelist)) == NULL) {
- sf_buf_alloc_want = 1;
+ sf_buf_alloc_want++;
msleep(&sf_freelist, &sf_freelist.sf_lock, PVM, "sfbufa", 0);
}
SLIST_REMOVE_HEAD(&sf_freelist, free_list);
@@ -1395,8 +1396,8 @@ sf_buf_free(caddr_t addr, void *args)
mtx_enter(&sf_freelist.sf_lock, MTX_DEF);
SLIST_INSERT_HEAD(&sf_freelist, sf, free_list);
if (sf_buf_alloc_want) {
- sf_buf_alloc_want = 0;
- wakeup(&sf_freelist);
+ sf_buf_alloc_want--;
+ wakeup_one(&sf_freelist);
}
mtx_exit(&sf_freelist.sf_lock, MTX_DEF);
}