[DECNET]: Tidy send side socket SKB allocation.

Patch from Steve Whitehouse which I've vetted and tested:

"This patch is really intended has a move towards fixing the
sendmsg/recvmsg functions in various ways so that we will finally
have working nagle. Also reduces code duplication."

Signed-off-by: Patrick Caulfield <patrick@tykepenguin.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Patrick Caulfield
2005-09-01 17:43:45 -07:00
committed by David S. Miller
parent eb6f1160dd
commit 12a49ffd84
2 changed files with 33 additions and 70 deletions

View File

@ -136,69 +136,6 @@ struct sk_buff *dn_alloc_skb(struct sock *sk, int size, int pri)
return skb;
}
/*
* Wrapper for the above, for allocs of data skbs. We try and get the
* whole size thats been asked for (plus 11 bytes of header). If this
* fails, then we try for any size over 16 bytes for SOCK_STREAMS.
*/
struct sk_buff *dn_alloc_send_skb(struct sock *sk, size_t *size, int noblock, long timeo, int *err)
{
int space;
int len;
struct sk_buff *skb = NULL;
*err = 0;
while(skb == NULL) {
if (signal_pending(current)) {
*err = sock_intr_errno(timeo);
break;
}
if (sk->sk_shutdown & SEND_SHUTDOWN) {
*err = EINVAL;
break;
}
if (sk->sk_err)
break;
len = *size + 11;
space = sk->sk_sndbuf - atomic_read(&sk->sk_wmem_alloc);
if (space < len) {
if ((sk->sk_socket->type == SOCK_STREAM) &&
(space >= (16 + 11)))
len = space;
}
if (space < len) {
set_bit(SOCK_ASYNC_NOSPACE, &sk->sk_socket->flags);
if (noblock) {
*err = EWOULDBLOCK;
break;
}
clear_bit(SOCK_ASYNC_WAITDATA, &sk->sk_socket->flags);
SOCK_SLEEP_PRE(sk)
if ((sk->sk_sndbuf - atomic_read(&sk->sk_wmem_alloc)) <
len)
schedule();
SOCK_SLEEP_POST(sk)
continue;
}
if ((skb = dn_alloc_skb(sk, len, sk->sk_allocation)) == NULL)
continue;
*size = len - 11;
}
return skb;
}
/*
* Calculate persist timer based upon the smoothed round
* trip time and the variance. Backoff according to the