[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-ID:
<CH0PR18MB4339EC12A4676BEE41039F74CDE4A@CH0PR18MB4339.namprd18.prod.outlook.com>
Date: Fri, 3 Oct 2025 10:40:30 +0000
From: Geethasowjanya Akula <gakula@...vell.com>
To: Jakub Sitnicki <jakub@...udflare.com>,
Sunil Kovvuri Goutham
<sgoutham@...vell.com>,
Subbaraya Sundeep Bhatta <sbhatta@...vell.com>,
Hariprasad Kelam <hkelam@...vell.com>,
Bharat Bhushan <bbhushan2@...vell.com>
CC: "netdev@...r.kernel.org" <netdev@...r.kernel.org>
Subject: RE: [EXTERNAL] marvell/octeontx2: XDP vs skb headroom reservation
Hi,
>-----Original Message-----
>From: Jakub Sitnicki <jakub@...udflare.com>
>Sent: Thursday, October 2, 2025 5:16 PM
>To: Sunil Kovvuri Goutham <sgoutham@...vell.com>; Geethasowjanya Akula
><gakula@...vell.com>; Subbaraya Sundeep Bhatta <sbhatta@...vell.com>;
>Hariprasad Kelam <hkelam@...vell.com>; Bharat Bhushan
><bbhushan2@...vell.com>
>Cc: netdev@...r.kernel.org
>Subject: [EXTERNAL] marvell/octeontx2: XDP vs skb headroom reservation
>
>Hi,
>
>I'm auditing calls to skb_metadata_set() in drivers and something seems off in
>oceontx2. I may be completely misreading the code. I'm a total stranger to that
>driver.
>
>It would seem that there is a difference between the amount of headroom that
>the driver reserves for the XDP buffer vs the skb that is built from on that
>buffer, while the two should match.
>
>In the receive handler we have:
>
>otx2_rcv_pkt_handler
> otx2_xdp_rcv_pkt_handler if pfvf->xdp_prog
> xdp_prepare_buff(..., OTX2_HEAD_ROOM, ...)
> where OTX2_HEAD_ROOM = OTX2_ALIGN = 128
> skb = napi_get_frags
> napi_alloc_skb
> skb_reserve(NET_SKB_PAD + NET_IP_ALIGN)
> where NET_SKB_PAD = 64, NET_IP_ALIGN = 0 on x86
> napi_gro_frags
>
>There are no other calls to skb_reserve there, so we seem to have a mismatch.
>128B of headroom in XDP buff, and only 64B of headroom in skb head.
>
>Again, I could be totally wrong about this, I'm not familiar with the driver, but I
>thought you might want to double check this.
>
The otx2 netdev driver calculates the receive buffer size to accommodate the full network
packet as follows:
hw.buf_len = mtu + OTX2_ETH_HLEN + OTX2_HW_TIMESTAMP_LEN;
In addition, it reserves OTX2_HEAD_ROOM (128 bytes). The hardware actually copies
the packet starting at (u64*)bufptr + OTX2_HEAD_ROOM. This means the SKB has
128 bytes of headroom available, which is especially useful in the XDP case for adding any extra headers.
static int otx2_get_rbuf_size(struct otx2_nic *pf, int mtu)
{
int frame_size;
int total_size;
int rbuf_size;
if (pf->hw.rbuf_len)
return ALIGN(pf->hw.rbuf_len, OTX2_ALIGN) + OTX2_HEAD_ROOM;
Thanks,
Geetha.
>Thanks,
>-jkbs
Powered by blists - more mailing lists