export some of sosend loan routines for nfsd.

This commit is contained in:
yamt 2003-05-03 17:53:17 +00:00
parent cdb561065e
commit b2479414be
2 changed files with 51 additions and 25 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: uipc_socket.c,v 1.79 2003/04/09 18:38:03 thorpej Exp $ */
/* $NetBSD: uipc_socket.c,v 1.80 2003/05/03 17:53:17 yamt Exp $ */
/*-
* Copyright (c) 2002 The NetBSD Foundation, Inc.
@ -72,7 +72,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: uipc_socket.c,v 1.79 2003/04/09 18:38:03 thorpej Exp $");
__KERNEL_RCSID(0, "$NetBSD: uipc_socket.c,v 1.80 2003/05/03 17:53:17 yamt Exp $");
#include "opt_sock_counters.h"
#include "opt_sosend_loan.h"
@ -153,6 +153,43 @@ int sokvawaiters;
#define SOCK_LOAN_THRESH 4096
#define SOCK_LOAN_CHUNK 65536
static size_t sodopendfree(struct socket *);
vaddr_t
sokvaalloc(vsize_t len, struct socket *so)
{
vaddr_t lva;
int s;
while (socurkva + len > somaxkva) {
if (sodopendfree(so))
continue;
SOSEND_COUNTER_INCR(&sosend_kvalimit);
s = splvm();
sokvawaiters++;
(void) tsleep(&socurkva, PVM, "sokva", 0);
sokvawaiters--;
splx(s);
}
lva = uvm_km_valloc_wait(kernel_map, len);
if (lva == 0)
return (0);
socurkva += len;
return lva;
}
void
sokvafree(vaddr_t sva, vsize_t len)
{
uvm_km_free(kernel_map, sva, len);
socurkva -= len;
if (sokvawaiters)
wakeup(&socurkva);
}
static void
sodoloanfree(struct vm_page **pgs, caddr_t buf, size_t size)
{
@ -179,10 +216,7 @@ sodoloanfree(struct vm_page **pgs, caddr_t buf, size_t size)
pmap_kremove(sva, len);
pmap_update(pmap_kernel());
uvm_unloan(pgs, npgs, UVM_LOAN_TOPAGE);
uvm_km_free(kernel_map, sva, len);
socurkva -= len;
if (sokvawaiters)
wakeup(&socurkva);
sokvafree(sva, len);
}
static size_t
@ -228,7 +262,7 @@ sodopendfree(struct socket *so)
return (rv);
}
static void
void
soloanfree(struct mbuf *m, caddr_t buf, size_t size, void *arg)
{
struct socket *so = arg;
@ -254,7 +288,7 @@ sosend_loan(struct socket *so, struct uio *uio, struct mbuf *m, long space)
vaddr_t sva, eva;
vsize_t len;
vaddr_t lva, va;
int npgs, s, i, error;
int npgs, i, error;
if (uio->uio_segflg != UIO_USERSPACE)
return (0);
@ -272,27 +306,14 @@ sosend_loan(struct socket *so, struct uio *uio, struct mbuf *m, long space)
/* XXX KDASSERT */
KASSERT(npgs <= M_EXT_MAXPAGES);
while (socurkva + len > somaxkva) {
if (sodopendfree(so))
continue;
SOSEND_COUNTER_INCR(&sosend_kvalimit);
s = splvm();
sokvawaiters++;
(void) tsleep(&socurkva, PVM, "sokva", 0);
sokvawaiters--;
splx(s);
}
lva = uvm_km_valloc_wait(kernel_map, len);
lva = sokvaalloc(len, so);
if (lva == 0)
return (0);
socurkva += len;
return 0;
error = uvm_loan(&uio->uio_procp->p_vmspace->vm_map, sva, len,
m->m_ext.ext_pgs, UVM_LOAN_TOPAGE);
if (error) {
uvm_km_free(kernel_map, lva, len);
socurkva -= len;
sokvafree(lva, len);
return (0);
}

View File

@ -1,4 +1,4 @@
/* $NetBSD: socketvar.h,v 1.59 2003/03/21 21:13:50 dsl Exp $ */
/* $NetBSD: socketvar.h,v 1.60 2003/05/03 17:53:18 yamt Exp $ */
/*-
* Copyright (c) 1982, 1986, 1990, 1993
@ -352,6 +352,11 @@ void sblastmbufchk(struct sockbuf *, const char *);
#define SBLASTMBUFCHK(sb, where) /* nothing */
#endif /* SOCKBUF_DEBUG */
/* sosend loan */
vaddr_t sokvaalloc(vsize_t, struct socket *);
void sokvafree(vaddr_t, vsize_t);
void soloanfree(struct mbuf *, caddr_t, size_t, void *);
#endif /* _KERNEL */
#endif /* !_SYS_SOCKETVAR_H_ */