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/ipv6 | |
parent | fe33147a58e7d1d3086bf823aabfd491d843be82 (diff) | |
download | op-kernel-dev-1789a640f55658d9a54c1868cc3405e4d85dbd8e.zip op-kernel-dev-1789a640f55658d9a54c1868cc3405e4d85dbd8e.tar.gz |
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/ipv6')
-rw-r--r-- | net/ipv6/raw.c | 12 |
1 files changed, 7 insertions, 5 deletions
diff --git a/net/ipv6/raw.c b/net/ipv6/raw.c index 864eb8e..968b964 100644 --- a/net/ipv6/raw.c +++ b/net/ipv6/raw.c @@ -602,13 +602,14 @@ out: } static int rawv6_send_hdrinc(struct sock *sk, void *from, int length, - struct flowi *fl, struct rt6_info *rt, + struct flowi *fl, struct dst_entry **dstp, unsigned int flags) { struct ipv6_pinfo *np = inet6_sk(sk); struct ipv6hdr *iph; struct sk_buff *skb; int err; + struct rt6_info *rt = (struct rt6_info *)*dstp; if (length > rt->u.dst.dev->mtu) { ipv6_local_error(sk, EMSGSIZE, fl, rt->u.dst.dev->mtu); @@ -626,7 +627,8 @@ static int rawv6_send_hdrinc(struct sock *sk, void *from, int 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); + *dstp = NULL; skb_put(skb, length); skb_reset_network_header(skb); @@ -886,9 +888,9 @@ static int rawv6_sendmsg(struct kiocb *iocb, struct sock *sk, goto do_confirm; back_from_confirm: - if (inet->hdrincl) { - err = rawv6_send_hdrinc(sk, msg->msg_iov, len, &fl, (struct rt6_info*)dst, msg->msg_flags); - } else { + if (inet->hdrincl) + err = rawv6_send_hdrinc(sk, msg->msg_iov, len, &fl, &dst, msg->msg_flags); + else { lock_sock(sk); err = ip6_append_data(sk, ip_generic_getfrag, msg->msg_iov, len, 0, hlimit, tclass, opt, &fl, (struct rt6_info*)dst, |