version 1.64, 2002/05/02 17:55:51 |
version 1.65, 2002/05/03 00:35:14 |
|
|
} |
} |
|
|
#ifdef SOSEND_LOAN |
#ifdef SOSEND_LOAN |
|
int use_sosend_loan = 1; |
|
#else |
|
int use_sosend_loan = 0; |
|
#endif |
|
|
struct mbuf *so_pendfree; |
struct mbuf *so_pendfree; |
|
|
Line 303 sosend_loan(struct socket *so, struct ui |
|
Line 307 sosend_loan(struct socket *so, struct ui |
|
return (space); |
return (space); |
} |
} |
|
|
#endif /* SOSEND_LOAN */ |
|
|
|
/* |
/* |
* Socket operation routines. |
* Socket operation routines. |
* These routines are called by the routines in |
* These routines are called by the routines in |
Line 390 solisten(struct socket *so, int backlog) |
|
Line 392 solisten(struct socket *so, int backlog) |
|
void |
void |
sofree(struct socket *so) |
sofree(struct socket *so) |
{ |
{ |
#ifdef SOSEND_LOAN |
|
struct mbuf *m; |
struct mbuf *m; |
#endif |
|
|
|
if (so->so_pcb || (so->so_state & SS_NOFDREF) == 0) |
if (so->so_pcb || (so->so_state & SS_NOFDREF) == 0) |
return; |
return; |
Line 407 sofree(struct socket *so) |
|
Line 407 sofree(struct socket *so) |
|
} |
} |
sbrelease(&so->so_snd); |
sbrelease(&so->so_snd); |
sorflush(so); |
sorflush(so); |
#ifdef SOSEND_LOAN |
|
while ((m = so->so_pendfree) != NULL) { |
while ((m = so->so_pendfree) != NULL) { |
so->so_pendfree = m->m_next; |
so->so_pendfree = m->m_next; |
m->m_next = so_pendfree; |
m->m_next = so_pendfree; |
so_pendfree = m; |
so_pendfree = m; |
} |
} |
#endif |
|
pool_put(&socket_pool, so); |
pool_put(&socket_pool, so); |
} |
} |
|
|
Line 569 sodisconnect(struct socket *so) |
|
Line 567 sodisconnect(struct socket *so) |
|
(struct proc *)0); |
(struct proc *)0); |
bad: |
bad: |
splx(s); |
splx(s); |
#ifdef SOSEND_LOAN |
|
sodopendfree(so); |
sodopendfree(so); |
#endif |
|
return (error); |
return (error); |
} |
} |
|
|
Line 602 sosend(struct socket *so, struct mbuf *a |
|
Line 598 sosend(struct socket *so, struct mbuf *a |
|
long space, len, resid, clen, mlen; |
long space, len, resid, clen, mlen; |
int error, s, dontroute, atomic; |
int error, s, dontroute, atomic; |
|
|
#ifdef SOSEND_LOAN |
|
sodopendfree(so); |
sodopendfree(so); |
#endif |
|
|
|
p = curproc; /* XXX */ |
p = curproc; /* XXX */ |
clen = 0; |
clen = 0; |
Line 691 sosend(struct socket *so, struct mbuf *a |
|
Line 685 sosend(struct socket *so, struct mbuf *a |
|
MGET(m, M_WAIT, MT_DATA); |
MGET(m, M_WAIT, MT_DATA); |
mlen = MLEN; |
mlen = MLEN; |
} |
} |
#ifdef SOSEND_LOAN |
if (use_sosend_loan && |
if (uio->uio_iov->iov_len >= SOCK_LOAN_THRESH && |
uio->uio_iov->iov_len >= SOCK_LOAN_THRESH && |
space >= SOCK_LOAN_THRESH && |
space >= SOCK_LOAN_THRESH && |
(len = sosend_loan(so, uio, m, |
(len = sosend_loan(so, uio, m, |
space)) != 0) { |
space)) != 0) { |
Line 700 sosend(struct socket *so, struct mbuf *a |
|
Line 694 sosend(struct socket *so, struct mbuf *a |
|
space -= len; |
space -= len; |
goto have_data; |
goto have_data; |
} |
} |
#endif /* SOSEND_LOAN */ |
|
if (resid >= MINCLSIZE && space >= MCLBYTES) { |
if (resid >= MINCLSIZE && space >= MCLBYTES) { |
SOSEND_COUNTER_INCR(&sosend_copy_big); |
SOSEND_COUNTER_INCR(&sosend_copy_big); |
MCLGET(m, M_WAIT); |
MCLGET(m, M_WAIT); |
Line 728 sosend(struct socket *so, struct mbuf *a |
|
Line 721 sosend(struct socket *so, struct mbuf *a |
|
} |
} |
error = uiomove(mtod(m, caddr_t), (int)len, |
error = uiomove(mtod(m, caddr_t), (int)len, |
uio); |
uio); |
#ifdef SOSEND_LOAN |
|
have_data: |
have_data: |
#endif |
|
resid = uio->uio_resid; |
resid = uio->uio_resid; |
m->m_len = len; |
m->m_len = len; |
*mp = m; |
*mp = m; |
Line 807 soreceive(struct socket *so, struct mbuf |
|
Line 798 soreceive(struct socket *so, struct mbuf |
|
struct protosw *pr; |
struct protosw *pr; |
struct mbuf *nextrecord; |
struct mbuf *nextrecord; |
|
|
#ifdef SOSEND_LOAN |
|
sodopendfree(so); |
sodopendfree(so); |
#endif |
|
|
|
pr = so->so_proto; |
pr = so->so_proto; |
mp = mp0; |
mp = mp0; |