| 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; |