--- cvswork/netbsd.org/full/src/sys/kern/uipc_socket.c 2003-09-25 15:42:39.000000000 +0900 +++ uipc_socket.c 2003-10-14 22:25:26.000000000 +0900 @@ -163,21 +163,29 @@ vaddr_t lva; int s; + s = splvm(); while (socurkva + len > somaxkva) { - if (sodopendfree(so)) + splx(s); + if (sodopendfree(so)) { + s = splvm(); continue; + } SOSEND_COUNTER_INCR(&sosend_kvalimit); s = splvm(); sokvawaiters++; (void) tsleep(&socurkva, PVM, "sokva", 0); sokvawaiters--; - splx(s); } + socurkva += len; + splx(s); lva = uvm_km_valloc_wait(kernel_map, len); - if (lva == 0) + if (lva == 0) { + s = splvm(); + socurkva -= len; + splx(s); return (0); - socurkva += len; + } return lva; } @@ -185,11 +193,14 @@ void sokvafree(vaddr_t sva, vsize_t len) { + int s; uvm_km_free(kernel_map, sva, len); + s = splvm(); socurkva -= len; if (sokvawaiters) wakeup(&socurkva); + splx(s); } static void @@ -278,9 +289,9 @@ s = splvm(); m->m_next = so->so_pendfree; so->so_pendfree = m; - splx(s); if (sokvawaiters) wakeup(&socurkva); + splx(s); } static long