diff options
author | David S. Miller <davem@davemloft.net> | 2005-07-06 02:17:25 +0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2005-07-06 02:17:25 +0400 |
commit | c65f7f00c587828e3d50737805a78f74804972de (patch) | |
tree | 160f85e7d9ec1df2432b4dd3fae315812558bd10 /net | |
parent | b8259d9ad1d0f8d0c5ea0e37bb15080b0bd395b5 (diff) | |
download | linux-c65f7f00c587828e3d50737805a78f74804972de.tar.xz |
[TCP]: Simplify SKB data portion allocation with NETIF_F_SG.
The ideal and most optimal layout for an SKB when doing
scatter-gather is to put all the headers at skb->data, and
all the user data in the page array.
This makes SKB splitting and combining extremely simple,
especially before a packet goes onto the wire the first
time.
So, when sk_stream_alloc_pskb() is given a zero size, make
sure there is no skb_tailroom(). This is achieved by applying
SKB_DATA_ALIGN() to the header length used here.
Next, make select_size() in TCP output segmentation use a
length of zero when NETIF_F_SG is true on the outgoing
interface.
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net')
-rw-r--r-- | net/ipv4/tcp.c | 13 |
1 files changed, 2 insertions, 11 deletions
diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c index 882436da9a3a..be354155b2f9 100644 --- a/net/ipv4/tcp.c +++ b/net/ipv4/tcp.c @@ -756,13 +756,9 @@ static inline int select_size(struct sock *sk, struct tcp_sock *tp) { int tmp = tp->mss_cache_std; - if (sk->sk_route_caps & NETIF_F_SG) { - int pgbreak = SKB_MAX_HEAD(MAX_TCP_HEADER); + if (sk->sk_route_caps & NETIF_F_SG) + tmp = 0; - if (tmp >= pgbreak && - tmp <= pgbreak + (MAX_SKB_FRAGS - 1) * PAGE_SIZE) - tmp = pgbreak; - } return tmp; } @@ -872,11 +868,6 @@ new_segment: tcp_mark_push(tp, skb); goto new_segment; } else if (page) { - /* If page is cached, align - * offset to L1 cache boundary - */ - off = (off + L1_CACHE_BYTES - 1) & - ~(L1_CACHE_BYTES - 1); if (off == PAGE_SIZE) { put_page(page); TCP_PAGE(sk) = page = NULL; |