Skip to content

Commit

Permalink
ipv4: gso: send_check() & segment() cleanups
Browse files Browse the repository at this point in the history
inet_gso_segment() and inet_gso_send_check() are called by
skb_mac_gso_segment() under rcu lock, no need to use
rcu_read_lock() / rcu_read_unlock()

Avoid calling ip_hdr() twice per function.

We can use ip_send_check() helper.

Signed-off-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Eric Dumazet authored and David S. Miller committed Oct 19, 2013
1 parent a729e83 commit 47d27aa
Showing 1 changed file with 11 additions and 13 deletions.
24 changes: 11 additions & 13 deletions net/ipv4/af_inet.c
Original file line number Diff line number Diff line change
Expand Up @@ -1254,20 +1254,19 @@ static int inet_gso_send_check(struct sk_buff *skb)
if (ihl < sizeof(*iph))
goto out;

proto = iph->protocol;

/* Warning: after this point, iph might be no longer valid */
if (unlikely(!pskb_may_pull(skb, ihl)))
goto out;

__skb_pull(skb, ihl);

skb_reset_transport_header(skb);
iph = ip_hdr(skb);
proto = iph->protocol;
err = -EPROTONOSUPPORT;

rcu_read_lock();
ops = rcu_dereference(inet_offloads[proto]);
if (likely(ops && ops->callbacks.gso_send_check))
err = ops->callbacks.gso_send_check(skb);
rcu_read_unlock();

out:
return err;
Expand Down Expand Up @@ -1305,23 +1304,23 @@ static struct sk_buff *inet_gso_segment(struct sk_buff *skb,
if (ihl < sizeof(*iph))
goto out;

id = ntohs(iph->id);
proto = iph->protocol;

/* Warning: after this point, iph might be no longer valid */
if (unlikely(!pskb_may_pull(skb, ihl)))
goto out;
__skb_pull(skb, ihl);

tunnel = !!skb->encapsulation;

__skb_pull(skb, ihl);
skb_reset_transport_header(skb);
iph = ip_hdr(skb);
id = ntohs(iph->id);
proto = iph->protocol;

segs = ERR_PTR(-EPROTONOSUPPORT);

rcu_read_lock();
ops = rcu_dereference(inet_offloads[proto]);
if (likely(ops && ops->callbacks.gso_segment))
segs = ops->callbacks.gso_segment(skb, features);
rcu_read_unlock();

if (IS_ERR_OR_NULL(segs))
goto out;
Expand All @@ -1339,8 +1338,7 @@ static struct sk_buff *inet_gso_segment(struct sk_buff *skb,
iph->id = htons(id++);
}
iph->tot_len = htons(skb->len - skb->mac_len);
iph->check = 0;
iph->check = ip_fast_csum(skb_network_header(skb), iph->ihl);
ip_send_check(iph);
} while ((skb = skb->next));

out:
Expand Down

0 comments on commit 47d27aa

Please sign in to comment.