[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:
committed by
David S. Miller
parent
eb6f1160dd
commit
12a49ffd84
@ -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
|
||||
|
Reference in New Issue
Block a user