Skip to content

Commit 1789a64

Browse files
Eric Dumazetdavem330
Eric Dumazet
authored andcommitted
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 <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent fe33147 commit 1789a64

File tree

2 files changed

+12
-8
lines changed

2 files changed

+12
-8
lines changed

net/ipv4/raw.c

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -314,7 +314,7 @@ int raw_rcv(struct sock *sk, struct sk_buff *skb)
314314
}
315315

316316
static int raw_send_hdrinc(struct sock *sk, void *from, size_t length,
317-
struct rtable *rt,
317+
struct rtable **rtp,
318318
unsigned int flags)
319319
{
320320
struct inet_sock *inet = inet_sk(sk);
@@ -323,6 +323,7 @@ static int raw_send_hdrinc(struct sock *sk, void *from, size_t length,
323323
struct sk_buff *skb;
324324
unsigned int iphlen;
325325
int err;
326+
struct rtable *rt = *rtp;
326327

327328
if (length > rt->u.dst.dev->mtu) {
328329
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,
341342

342343
skb->priority = sk->sk_priority;
343344
skb->mark = sk->sk_mark;
344-
skb_dst_set(skb, dst_clone(&rt->u.dst));
345+
skb_dst_set(skb, &rt->u.dst);
346+
*rtp = NULL;
345347

346348
skb_reset_network_header(skb);
347349
iph = ip_hdr(skb);
@@ -576,7 +578,7 @@ static int raw_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,
576578

577579
if (inet->hdrincl)
578580
err = raw_send_hdrinc(sk, msg->msg_iov, len,
579-
rt, msg->msg_flags);
581+
&rt, msg->msg_flags);
580582

581583
else {
582584
if (!ipc.addr)

net/ipv6/raw.c

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -602,13 +602,14 @@ static int rawv6_push_pending_frames(struct sock *sk, struct flowi *fl,
602602
}
603603

604604
static int rawv6_send_hdrinc(struct sock *sk, void *from, int length,
605-
struct flowi *fl, struct rt6_info *rt,
605+
struct flowi *fl, struct dst_entry **dstp,
606606
unsigned int flags)
607607
{
608608
struct ipv6_pinfo *np = inet6_sk(sk);
609609
struct ipv6hdr *iph;
610610
struct sk_buff *skb;
611611
int err;
612+
struct rt6_info *rt = (struct rt6_info *)*dstp;
612613

613614
if (length > rt->u.dst.dev->mtu) {
614615
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,
626627

627628
skb->priority = sk->sk_priority;
628629
skb->mark = sk->sk_mark;
629-
skb_dst_set(skb, dst_clone(&rt->u.dst));
630+
skb_dst_set(skb, &rt->u.dst);
631+
*dstp = NULL;
630632

631633
skb_put(skb, length);
632634
skb_reset_network_header(skb);
@@ -886,9 +888,9 @@ static int rawv6_sendmsg(struct kiocb *iocb, struct sock *sk,
886888
goto do_confirm;
887889

888890
back_from_confirm:
889-
if (inet->hdrincl) {
890-
err = rawv6_send_hdrinc(sk, msg->msg_iov, len, &fl, (struct rt6_info*)dst, msg->msg_flags);
891-
} else {
891+
if (inet->hdrincl)
892+
err = rawv6_send_hdrinc(sk, msg->msg_iov, len, &fl, &dst, msg->msg_flags);
893+
else {
892894
lock_sock(sk);
893895
err = ip6_append_data(sk, ip_generic_getfrag, msg->msg_iov,
894896
len, 0, hlimit, tclass, opt, &fl, (struct rt6_info*)dst,

0 commit comments

Comments
 (0)