diff options
author | Eric Dumazet <eric.dumazet@gmail.com> | 2010-06-03 22:23:57 +0000 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2010-06-07 01:08:10 -0700 |
commit | 1789a640f55658d9a54c1868cc3405e4d85dbd8e (patch) | |
tree | 4ff0efbe06c9f8ab2ff715bfcda91dc31d7c7f65 /net/ipv4/raw.c | |
parent | fe33147a58e7d1d3086bf823aabfd491d843be82 (diff) | |
download | lwn-1789a640f55658d9a54c1868cc3405e4d85dbd8e.tar.gz lwn-1789a640f55658d9a54c1868cc3405e4d85dbd8e.zip |
raw: avoid two atomics in xmit
Avoid two atomic ops per raw_send_hdrinc() call
Avoid two atomic ops per raw6_send_hdrinc() call
Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv4/raw.c')
-rw-r--r-- | net/ipv4/raw.c | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/net/ipv4/raw.c b/net/ipv4/raw.c index 2c7a1639388a..66cc3befcd44 100644 --- a/net/ipv4/raw.c +++ b/net/ipv4/raw.c @@ -314,7 +314,7 @@ int raw_rcv(struct sock *sk, struct sk_buff *skb) } static int raw_send_hdrinc(struct sock *sk, void *from, size_t length, - struct rtable *rt, + struct rtable **rtp, unsigned int flags) { struct inet_sock *inet = inet_sk(sk); @@ -323,6 +323,7 @@ static int raw_send_hdrinc(struct sock *sk, void *from, size_t length, struct sk_buff *skb; unsigned int iphlen; int err; + struct rtable *rt = *rtp; if (length > rt->u.dst.dev->mtu) { ip_local_error(sk, EMSGSIZE, rt->rt_dst, inet->inet_dport, @@ -341,7 +342,8 @@ static int raw_send_hdrinc(struct sock *sk, void *from, size_t length, skb->priority = sk->sk_priority; skb->mark = sk->sk_mark; - skb_dst_set(skb, dst_clone(&rt->u.dst)); + skb_dst_set(skb, &rt->u.dst); + *rtp = NULL; skb_reset_network_header(skb); iph = ip_hdr(skb); @@ -576,7 +578,7 @@ back_from_confirm: if (inet->hdrincl) err = raw_send_hdrinc(sk, msg->msg_iov, len, - rt, msg->msg_flags); + &rt, msg->msg_flags); else { if (!ipc.addr) |