[NET]: Implement SKB fast cloning.
Protocols that make extensive use of SKB cloning, for example TCP, eat at least 2 allocations per packet sent as a result. To cut the kmalloc() count in half, we implement a pre-allocation scheme wherein we allocate 2 sk_buff objects in advance, then use a simple reference count to free up the memory at the correct time. Based upon an initial patch by Thomas Graf and suggestions from Herbert Xu. Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
e92ae93a8a
commit
d179cd1292
@ -1582,7 +1582,7 @@ void tcp_send_fin(struct sock *sk)
|
||||
} else {
|
||||
/* Socket is locked, keep trying until memory is available. */
|
||||
for (;;) {
|
||||
skb = alloc_skb(MAX_TCP_HEADER, GFP_KERNEL);
|
||||
skb = alloc_skb_fclone(MAX_TCP_HEADER, GFP_KERNEL);
|
||||
if (skb)
|
||||
break;
|
||||
yield();
|
||||
@ -1804,7 +1804,7 @@ int tcp_connect(struct sock *sk)
|
||||
|
||||
tcp_connect_init(sk);
|
||||
|
||||
buff = alloc_skb(MAX_TCP_HEADER + 15, sk->sk_allocation);
|
||||
buff = alloc_skb_fclone(MAX_TCP_HEADER + 15, sk->sk_allocation);
|
||||
if (unlikely(buff == NULL))
|
||||
return -ENOBUFS;
|
||||
|
||||
|
Reference in New Issue
Block a user