Skip to content

Commit 7214bcf

Browse files
Jon Paul Maloydavem330
authored andcommitted
tipc: eliminate redundant buffer cloning at transmission
Since all packet transmitters (link, bcast, discovery) are now sending consumable buffer clones to the bearer layer, we can remove the redundant buffer cloning that is perfomed in the lower level functions tipc_l2_send_msg() and tipc_udp_send_msg(). Signed-off-by: Jon Maloy <[email protected]> Reviewed-by: Ying Xue <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 60852d6 commit 7214bcf

File tree

2 files changed

+15
-28
lines changed

2 files changed

+15
-28
lines changed

net/tipc/bearer.c

Lines changed: 10 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -414,34 +414,29 @@ void tipc_disable_l2_media(struct tipc_bearer *b)
414414
* @b_ptr: the bearer through which the packet is to be sent
415415
* @dest: peer destination address
416416
*/
417-
int tipc_l2_send_msg(struct net *net, struct sk_buff *buf,
417+
int tipc_l2_send_msg(struct net *net, struct sk_buff *skb,
418418
struct tipc_bearer *b, struct tipc_media_addr *dest)
419419
{
420-
struct sk_buff *clone;
421420
struct net_device *dev;
422421
int delta;
423422

424423
dev = (struct net_device *)rcu_dereference_rtnl(b->media_ptr);
425424
if (!dev)
426425
return 0;
427426

428-
clone = skb_clone(buf, GFP_ATOMIC);
429-
if (!clone)
430-
return 0;
431-
432-
delta = dev->hard_header_len - skb_headroom(buf);
427+
delta = dev->hard_header_len - skb_headroom(skb);
433428
if ((delta > 0) &&
434-
pskb_expand_head(clone, SKB_DATA_ALIGN(delta), 0, GFP_ATOMIC)) {
435-
kfree_skb(clone);
429+
pskb_expand_head(skb, SKB_DATA_ALIGN(delta), 0, GFP_ATOMIC)) {
430+
kfree_skb(skb);
436431
return 0;
437432
}
438433

439-
skb_reset_network_header(clone);
440-
clone->dev = dev;
441-
clone->protocol = htons(ETH_P_TIPC);
442-
dev_hard_header(clone, dev, ETH_P_TIPC, dest->value,
443-
dev->dev_addr, clone->len);
444-
dev_queue_xmit(clone);
434+
skb_reset_network_header(skb);
435+
skb->dev = dev;
436+
skb->protocol = htons(ETH_P_TIPC);
437+
dev_hard_header(skb, dev, ETH_P_TIPC, dest->value,
438+
dev->dev_addr, skb->len);
439+
dev_queue_xmit(skb);
445440
return 0;
446441
}
447442

@@ -491,8 +486,6 @@ void tipc_bearer_xmit_skb(struct net *net, u32 bearer_id,
491486
if (likely(b))
492487
b->media->send_msg(net, skb, b, dest);
493488
rcu_read_unlock();
494-
/* Until we remove cloning in tipc_l2_send_msg(): */
495-
kfree_skb(skb);
496489
}
497490

498491
/* tipc_bearer_xmit() -send buffer to destination over bearer
@@ -514,8 +507,6 @@ void tipc_bearer_xmit(struct net *net, u32 bearer_id,
514507
skb_queue_walk_safe(xmitq, skb, tmp) {
515508
__skb_dequeue(xmitq);
516509
b->media->send_msg(net, skb, b, dst);
517-
/* Until we remove cloning in tipc_l2_send_msg(): */
518-
kfree_skb(skb);
519510
}
520511
}
521512
rcu_read_unlock();
@@ -541,8 +532,6 @@ void tipc_bearer_bc_xmit(struct net *net, u32 bearer_id,
541532
msg_set_mc_netid(hdr, net_id);
542533
__skb_dequeue(xmitq);
543534
b->media->send_msg(net, skb, b, &b->bcast_addr);
544-
/* Until we remove cloning in tipc_l2_send_msg(): */
545-
kfree_skb(skb);
546535
}
547536
}
548537
rcu_read_unlock();

net/tipc/udp_media.c

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -155,14 +155,12 @@ static int tipc_udp_send_msg(struct net *net, struct sk_buff *skb,
155155
struct udp_bearer *ub;
156156
struct udp_media_addr *dst = (struct udp_media_addr *)&dest->value;
157157
struct udp_media_addr *src = (struct udp_media_addr *)&b->addr.value;
158-
struct sk_buff *clone;
159158
struct rtable *rt;
160159

161160
if (skb_headroom(skb) < UDP_MIN_HEADROOM)
162161
pskb_expand_head(skb, UDP_MIN_HEADROOM, 0, GFP_ATOMIC);
163162

164-
clone = skb_clone(skb, GFP_ATOMIC);
165-
skb_set_inner_protocol(clone, htons(ETH_P_TIPC));
163+
skb_set_inner_protocol(skb, htons(ETH_P_TIPC));
166164
ub = rcu_dereference_rtnl(b->media_ptr);
167165
if (!ub) {
168166
err = -ENODEV;
@@ -172,7 +170,7 @@ static int tipc_udp_send_msg(struct net *net, struct sk_buff *skb,
172170
struct flowi4 fl = {
173171
.daddr = dst->ipv4.s_addr,
174172
.saddr = src->ipv4.s_addr,
175-
.flowi4_mark = clone->mark,
173+
.flowi4_mark = skb->mark,
176174
.flowi4_proto = IPPROTO_UDP
177175
};
178176
rt = ip_route_output_key(net, &fl);
@@ -181,7 +179,7 @@ static int tipc_udp_send_msg(struct net *net, struct sk_buff *skb,
181179
goto tx_error;
182180
}
183181
ttl = ip4_dst_hoplimit(&rt->dst);
184-
err = udp_tunnel_xmit_skb(rt, ub->ubsock->sk, clone,
182+
err = udp_tunnel_xmit_skb(rt, ub->ubsock->sk, skb,
185183
src->ipv4.s_addr,
186184
dst->ipv4.s_addr, 0, ttl, 0,
187185
src->udp_port, dst->udp_port,
@@ -204,7 +202,7 @@ static int tipc_udp_send_msg(struct net *net, struct sk_buff *skb,
204202
if (err)
205203
goto tx_error;
206204
ttl = ip6_dst_hoplimit(ndst);
207-
err = udp_tunnel6_xmit_skb(ndst, ub->ubsock->sk, clone,
205+
err = udp_tunnel6_xmit_skb(ndst, ub->ubsock->sk, skb,
208206
ndst->dev, &src->ipv6,
209207
&dst->ipv6, 0, ttl, src->udp_port,
210208
dst->udp_port, false);
@@ -213,7 +211,7 @@ static int tipc_udp_send_msg(struct net *net, struct sk_buff *skb,
213211
return err;
214212

215213
tx_error:
216-
kfree_skb(clone);
214+
kfree_skb(skb);
217215
return err;
218216
}
219217

0 commit comments

Comments
 (0)