From: Alessandro Decina <alessandro.d@gmail.com>
To: Jason Xing <kerneljasonxing@gmail.com>
Cc: Alessandro Decina <alessandro.d@gmail.com>,
netdev@vger.kernel.org,
Maciej Fijalkowski <maciej.fijalkowski@intel.com>,
"David S. Miller" <davem@davemloft.net>,
Alexei Starovoitov <ast@kernel.org>,
Andrew Lunn <andrew+netdev@lunn.ch>,
Daniel Borkmann <daniel@iogearbox.net>,
Eric Dumazet <edumazet@google.com>,
Jakub Kicinski <kuba@kernel.org>,
Jesper Dangaard Brouer <hawk@kernel.org>,
John Fastabend <john.fastabend@gmail.com>,
Paolo Abeni <pabeni@redhat.com>,
Przemek Kitszel <przemyslaw.kitszel@intel.com>,
Stanislav Fomichev <sdf@fomichev.me>,
Tirthendu Sarkar <tirthendu.sarkar@intel.com>,
Tony Nguyen <anthony.l.nguyen@intel.com>,
bpf@vger.kernel.org, intel-wired-lan@lists.osuosl.org,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH net v2 1/1] i40e: xsk: advance next_to_clean on status descriptors
Date: Thu, 23 Oct 2025 03:17:58 +1100 [thread overview]
Message-ID: <aPkDtuVgbS4J-Og_@lima-default> (raw)
In-Reply-To: <CAL+tcoCwGQyNSv9BZ_jfsia6YFoyT790iknqxG7bB7wVi3C_vQ@mail.gmail.com>
On Wed, Oct 22, 2025 at 11:11:01AM +0800, Jason Xing wrote:
> On Wed, Oct 22, 2025 at 1:33 AM Alessandro Decina
> <alessandro.d@gmail.com> wrote:
> > diff --git a/drivers/net/ethernet/intel/i40e/i40e_xsk.c b/drivers/net/ethernet/intel/i40e/i40e_xsk.c
> > index 9f47388eaba5..dbc19083bbb7 100644
> > --- a/drivers/net/ethernet/intel/i40e/i40e_xsk.c
> > +++ b/drivers/net/ethernet/intel/i40e/i40e_xsk.c
> > @@ -441,13 +441,18 @@ int i40e_clean_rx_irq_zc(struct i40e_ring *rx_ring, int budget)
> > dma_rmb();
> >
> > if (i40e_rx_is_programming_status(qword)) {
> > + u16 ntp;
> > +
> > i40e_clean_programming_status(rx_ring,
> > rx_desc->raw.qword[0],
> > qword);
> > bi = *i40e_rx_bi(rx_ring, next_to_process);
> > xsk_buff_free(bi);
> > - if (++next_to_process == count)
> > + ntp = next_to_process++;
> > + if (next_to_process == count)
> > next_to_process = 0;
> > + if (next_to_clean == ntp)
> > + next_to_clean = next_to_process;
> > continue;
> > }
> >
> > --
> > 2.43.0
> >
> >
>
> I'm copying your reply from v1 as shown below so that we can continue
> with the discussion :)
>
> > It really depends on whether a status descriptor can be received in the
> > middle of multi-buffer packet. Based on the existing code, I assumed it
> > can. Therefore, consider this case:
> >
> > [valid_1st_packet][status_descriptor][valid_2nd_packet]
> >
> > In this case you want to skip status_descriptor but keep the existing
> > logic that leads to:
> >
> > first = next_to_clean = valid_1st_packet
> >
> > so then you can go and add valid_2nd_packet as a fragment to the first.
>
> Sorry, honestly, I still don't follow you.
>
> Looking at the case you provided, I think @first always pointing to
> valid_1st_packet is valid which does not bring any trouble. You mean
> the case is what you're trying to handle?
Yes, I mean this case needs to keep working, so we can't move
next_to_clean unconditionally, we can only move it when
next_to_clean == ntp, which is equivalent to checking that
first == NULL. See below.
> You patch updates next_to_clean that is only used at the very
> beginning, so it will not affect @first. Imaging the following case:
>
> [status_descriptor][valid_1st_packet][valid_2nd_packet]
>
> Even if the next_to_clean is updated, the @first still points to
> [status_descriptor] that is invalid and that will later cause the
> panic when constructing the skb.
Exactly - the key is to make sure we never get into this state :)
At the beginning of the function - outside the loop - first is only
assigned if (next_to_process != next_to_clean). This condition means: if
we previously exited the function in the middle of a multi-buffer
packet, we must resume from the start of that packet (next_to_clean) and
process the next fragment in it (next_to_process).
Consider the case you just gave:
> [status_descriptor][valid_1st_mb_packet][valid_2nd_mb_packet]
Assume we enter the function and next_to_process == next_to_clean, we
don't assign first, so first = NULL.
We find the status descriptor: without this patch, we increment
next_to_process, don't increment next_to_clean, say we run out of budget
and break the loop, the next time the function is entered we set first =
status_descriptor because next_to_process != next_to_clean. This is
exactly what we want to avoid.
With this patch upon processing the status descriptor, we see
next_to_clean == ntp, we increment next_to_clean, the next time the
function is entered next_to_process == next_to_clean, first is correctly
set to NULL and the next packet starts from valid_1st_mb_packet.
So I've covered both the scenarios:
a) [status][mb_packet1][mb_packet2]
b) [mb_packet1][status][mb_packet2]
The last case
c) [packet1][packet2][status] is actually just a), because at packet2
we'd find the EOP marker and close off the previous multi-buffer packet.
I hope I was more clear and please check my logic :)
Ciao,
Alessandro
WARNING: multiple messages have this Message-ID (diff)
From: Alessandro Decina <alessandro.d@gmail.com>
To: Jason Xing <kerneljasonxing@gmail.com>
Cc: Alessandro Decina <alessandro.d@gmail.com>,
netdev@vger.kernel.org,
Maciej Fijalkowski <maciej.fijalkowski@intel.com>,
"David S. Miller" <davem@davemloft.net>,
Alexei Starovoitov <ast@kernel.org>,
Andrew Lunn <andrew+netdev@lunn.ch>,
Daniel Borkmann <daniel@iogearbox.net>,
Eric Dumazet <edumazet@google.com>,
Jakub Kicinski <kuba@kernel.org>,
Jesper Dangaard Brouer <hawk@kernel.org>,
John Fastabend <john.fastabend@gmail.com>,
Paolo Abeni <pabeni@redhat.com>,
Przemek Kitszel <przemyslaw.kitszel@intel.com>,
Stanislav Fomichev <sdf@fomichev.me>,
Tirthendu Sarkar <tirthendu.sarkar@intel.com>,
Tony Nguyen <anthony.l.nguyen@intel.com>,
bpf@vger.kernel.org, intel-wired-lan@lists.osuosl.org,
linux-kernel@vger.kernel.org
Subject: Re: [Intel-wired-lan] [PATCH net v2 1/1] i40e: xsk: advance next_to_clean on status descriptors
Date: Thu, 23 Oct 2025 03:17:58 +1100 [thread overview]
Message-ID: <aPkDtuVgbS4J-Og_@lima-default> (raw)
In-Reply-To: <CAL+tcoCwGQyNSv9BZ_jfsia6YFoyT790iknqxG7bB7wVi3C_vQ@mail.gmail.com>
On Wed, Oct 22, 2025 at 11:11:01AM +0800, Jason Xing wrote:
> On Wed, Oct 22, 2025 at 1:33 AM Alessandro Decina
> <alessandro.d@gmail.com> wrote:
> > diff --git a/drivers/net/ethernet/intel/i40e/i40e_xsk.c b/drivers/net/ethernet/intel/i40e/i40e_xsk.c
> > index 9f47388eaba5..dbc19083bbb7 100644
> > --- a/drivers/net/ethernet/intel/i40e/i40e_xsk.c
> > +++ b/drivers/net/ethernet/intel/i40e/i40e_xsk.c
> > @@ -441,13 +441,18 @@ int i40e_clean_rx_irq_zc(struct i40e_ring *rx_ring, int budget)
> > dma_rmb();
> >
> > if (i40e_rx_is_programming_status(qword)) {
> > + u16 ntp;
> > +
> > i40e_clean_programming_status(rx_ring,
> > rx_desc->raw.qword[0],
> > qword);
> > bi = *i40e_rx_bi(rx_ring, next_to_process);
> > xsk_buff_free(bi);
> > - if (++next_to_process == count)
> > + ntp = next_to_process++;
> > + if (next_to_process == count)
> > next_to_process = 0;
> > + if (next_to_clean == ntp)
> > + next_to_clean = next_to_process;
> > continue;
> > }
> >
> > --
> > 2.43.0
> >
> >
>
> I'm copying your reply from v1 as shown below so that we can continue
> with the discussion :)
>
> > It really depends on whether a status descriptor can be received in the
> > middle of multi-buffer packet. Based on the existing code, I assumed it
> > can. Therefore, consider this case:
> >
> > [valid_1st_packet][status_descriptor][valid_2nd_packet]
> >
> > In this case you want to skip status_descriptor but keep the existing
> > logic that leads to:
> >
> > first = next_to_clean = valid_1st_packet
> >
> > so then you can go and add valid_2nd_packet as a fragment to the first.
>
> Sorry, honestly, I still don't follow you.
>
> Looking at the case you provided, I think @first always pointing to
> valid_1st_packet is valid which does not bring any trouble. You mean
> the case is what you're trying to handle?
Yes, I mean this case needs to keep working, so we can't move
next_to_clean unconditionally, we can only move it when
next_to_clean == ntp, which is equivalent to checking that
first == NULL. See below.
> You patch updates next_to_clean that is only used at the very
> beginning, so it will not affect @first. Imaging the following case:
>
> [status_descriptor][valid_1st_packet][valid_2nd_packet]
>
> Even if the next_to_clean is updated, the @first still points to
> [status_descriptor] that is invalid and that will later cause the
> panic when constructing the skb.
Exactly - the key is to make sure we never get into this state :)
At the beginning of the function - outside the loop - first is only
assigned if (next_to_process != next_to_clean). This condition means: if
we previously exited the function in the middle of a multi-buffer
packet, we must resume from the start of that packet (next_to_clean) and
process the next fragment in it (next_to_process).
Consider the case you just gave:
> [status_descriptor][valid_1st_mb_packet][valid_2nd_mb_packet]
Assume we enter the function and next_to_process == next_to_clean, we
don't assign first, so first = NULL.
We find the status descriptor: without this patch, we increment
next_to_process, don't increment next_to_clean, say we run out of budget
and break the loop, the next time the function is entered we set first =
status_descriptor because next_to_process != next_to_clean. This is
exactly what we want to avoid.
With this patch upon processing the status descriptor, we see
next_to_clean == ntp, we increment next_to_clean, the next time the
function is entered next_to_process == next_to_clean, first is correctly
set to NULL and the next packet starts from valid_1st_mb_packet.
So I've covered both the scenarios:
a) [status][mb_packet1][mb_packet2]
b) [mb_packet1][status][mb_packet2]
The last case
c) [packet1][packet2][status] is actually just a), because at packet2
we'd find the EOP marker and close off the previous multi-buffer packet.
I hope I was more clear and please check my logic :)
Ciao,
Alessandro
next prev parent reply other threads:[~2025-10-22 16:18 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-10-21 17:31 [PATCH net v2 0/1] i40e: xsk: advance next_to_clean on status descriptors Alessandro Decina
2025-10-21 17:31 ` [Intel-wired-lan] " Alessandro Decina
2025-10-21 17:32 ` [PATCH net v2 1/1] " Alessandro Decina
2025-10-21 17:32 ` [Intel-wired-lan] " Alessandro Decina
2025-10-22 3:11 ` Jason Xing
2025-10-22 3:11 ` [Intel-wired-lan] " Jason Xing
2025-10-22 5:41 ` Sarkar, Tirthendu
2025-10-22 5:41 ` [Intel-wired-lan] " Sarkar, Tirthendu
2025-10-22 7:28 ` Jason Xing
2025-10-22 7:28 ` [Intel-wired-lan] " Jason Xing
2025-10-22 16:28 ` Your Name
2025-10-22 16:28 ` [Intel-wired-lan] " Your Name
2025-10-23 6:11 ` Sarkar, Tirthendu
2025-10-23 6:11 ` [Intel-wired-lan] " Sarkar, Tirthendu
2025-10-22 16:17 ` Alessandro Decina [this message]
2025-10-22 16:17 ` Alessandro Decina
2025-10-22 6:41 ` Loktionov, Aleksandr
2025-10-22 6:41 ` Loktionov, Aleksandr
2025-10-22 17:17 ` Maciej Fijalkowski
2025-10-22 17:17 ` [Intel-wired-lan] " Maciej Fijalkowski
2025-10-22 17:39 ` Your Name
2025-10-22 17:39 ` [Intel-wired-lan] " Your Name
2025-11-03 15:14 ` Maciej Fijalkowski
2025-11-03 15:14 ` [Intel-wired-lan] " Maciej Fijalkowski
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=aPkDtuVgbS4J-Og_@lima-default \
--to=alessandro.d@gmail.com \
--cc=andrew+netdev@lunn.ch \
--cc=anthony.l.nguyen@intel.com \
--cc=ast@kernel.org \
--cc=bpf@vger.kernel.org \
--cc=daniel@iogearbox.net \
--cc=davem@davemloft.net \
--cc=edumazet@google.com \
--cc=hawk@kernel.org \
--cc=intel-wired-lan@lists.osuosl.org \
--cc=john.fastabend@gmail.com \
--cc=kerneljasonxing@gmail.com \
--cc=kuba@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=maciej.fijalkowski@intel.com \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.com \
--cc=przemyslaw.kitszel@intel.com \
--cc=sdf@fomichev.me \
--cc=tirthendu.sarkar@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.