Skip to content

Commit 6612bee

Browse files
mfijalkoKernel Patches Daemon
authored andcommitted
xsk: avoid overwriting skb fields for multi-buffer traffic
We are unnecessarily setting a bunch of skb fields per each processed descriptor, which is redundant for fragmented frames. Let us set these respective members for first fragment only. To address both paths that we have within xsk_build_skb(), move assignments onto xsk_set_destructor_arg() and rename it to xsk_skb_init_misc(). Signed-off-by: Maciej Fijalkowski <[email protected]>
1 parent 4ca3fcf commit 6612bee

File tree

1 file changed

+9
-8
lines changed

1 file changed

+9
-8
lines changed

net/xdp/xsk.c

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -618,11 +618,16 @@ static void xsk_destruct_skb(struct sk_buff *skb)
618618
sock_wfree(skb);
619619
}
620620

621-
static void xsk_set_destructor_arg(struct sk_buff *skb, u64 addr)
621+
static void xsk_skb_init_misc(struct sk_buff *skb, struct xdp_sock *xs,
622+
u64 addr)
622623
{
623624
BUILD_BUG_ON(sizeof(struct xsk_addr_head) > sizeof(skb->cb));
624625
INIT_LIST_HEAD(&XSKCB(skb)->addrs_list);
626+
skb->dev = xs->dev;
627+
skb->priority = READ_ONCE(xs->sk.sk_priority);
628+
skb->mark = READ_ONCE(xs->sk.sk_mark);
625629
XSKCB(skb)->num_descs = 0;
630+
skb->destructor = xsk_destruct_skb;
626631
skb_shinfo(skb)->destructor_arg = (void *)(uintptr_t)addr;
627632
}
628633

@@ -673,7 +678,7 @@ static struct sk_buff *xsk_build_skb_zerocopy(struct xdp_sock *xs,
673678

674679
skb_reserve(skb, hr);
675680

676-
xsk_set_destructor_arg(skb, desc->addr);
681+
xsk_skb_init_misc(skb, xs, desc->addr);
677682
} else {
678683
xsk_addr = kmem_cache_zalloc(xsk_tx_generic_cache, GFP_KERNEL);
679684
if (!xsk_addr)
@@ -757,7 +762,7 @@ static struct sk_buff *xsk_build_skb(struct xdp_sock *xs,
757762
if (unlikely(err))
758763
goto free_err;
759764

760-
xsk_set_destructor_arg(skb, desc->addr);
765+
xsk_skb_init_misc(skb, xs, desc->addr);
761766
} else {
762767
int nr_frags = skb_shinfo(skb)->nr_frags;
763768
struct xsk_addr_node *xsk_addr;
@@ -826,14 +831,10 @@ static struct sk_buff *xsk_build_skb(struct xdp_sock *xs,
826831

827832
if (meta->flags & XDP_TXMD_FLAGS_LAUNCH_TIME)
828833
skb->skb_mstamp_ns = meta->request.launch_time;
834+
xsk_tx_metadata_to_compl(meta, &skb_shinfo(skb)->xsk_meta);
829835
}
830836
}
831837

832-
skb->dev = dev;
833-
skb->priority = READ_ONCE(xs->sk.sk_priority);
834-
skb->mark = READ_ONCE(xs->sk.sk_mark);
835-
skb->destructor = xsk_destruct_skb;
836-
xsk_tx_metadata_to_compl(meta, &skb_shinfo(skb)->xsk_meta);
837838
xsk_inc_num_desc(skb);
838839

839840
return skb;

0 commit comments

Comments
 (0)