Re: [PATCH net v2 1/2] xsk: defer software checksum until the skb is complete
From: Rongzheng Wang
Date: Mon Oct 26 2026 - 10:30:14 EST
Hi Maciej,
Thanks for the review.
Yes. xsk_skb_metadata() is only called for the first descriptor when
skb is NULL; continuation fragments do not call it. So
skb->ip_summed == CHECKSUM_PARTIAL means the first fragment requested
the checksum.
I'll preserve unlikely() around pool->tx_sw_csum like this:
static int xsk_skb_sw_csum(struct sk_buff *skb,
struct xsk_buff_pool *pool)
{
if (unlikely(pool->tx_sw_csum &&
skb->ip_summed == CHECKSUM_PARTIAL))
return skb_checksum_help(skb);
return 0;
}
For the drop path: xsk_drop_skb() increments tx_invalid_descs and
consumes the skb; sendto() returns the error from skb_checksum_help().
Since the descriptors are already consumed, retrying is not useful. The
current metadata validation makes the malformed-packet path effectively
unreachable, so this is a defensive drop.
I verified the propagation in a local QEMU test kernel. For the test
only, I temporarily changed xsk_skb_sw_csum() to:
static int xsk_skb_sw_csum(struct sk_buff *skb,
struct xsk_buff_pool *pool)
{
if (unlikely(pool->tx_sw_csum &&
skb->ip_summed == CHECKSUM_PARTIAL))
return -EINVAL;
return 0;
}
and ran test_xdp_metadata. It failed at the first generate_packet()
sendto:
generate_packet:FAIL:sendto unexpected sendto: actual -1 < expected 0
Summary: 0/0 PASSED, 0 SKIPPED, 1/0 FAILED
TEST_RC=1
The normal kernel still passes. The test harness does not print errno,
so I can only state that sendto() returned -1; the injected error was
-EINVAL. I restored the source after the test.
Magnus suggested a distinct counter for malformed packets. I agree that
would be more precise than tx_invalid_descs, but I'd prefer to do that
in a separate patch instead of extending the UAPI in this stable fix.
I'll address the remaining feedback and send v3 as a new thread.
Thanks,
Rongzheng