Netdev List
 help / color / mirror / Atom feed
From: netdev-bot+sashiko@kernel.org
To: linusw@kernel.org
Cc: ulli.kroll@googlemail.com, andrew+netdev@lunn.ch,
	davem@davemloft.net, kuba@kernel.org, pabeni@redhat.com,
	mirq-linux@rere.qmqm.pl, mhun512@gmail.com, edumazet@kernel.org,
	netdev@vger.kernel.org
Subject: Re: [PATCH net-next v3 08/12] net: ethernet: cortina: Rotate free queue page allocation
Date: Tue, 06 Oct 2026 17:19:10 +0000	[thread overview]
Message-ID: <179130715044.434549.12317966263867256368@kernel.org> (raw)
In-Reply-To: <20261002-gemini-ethernet-fixes-3-v3-8-3e1f25890ae8@kernel.org>

Thank you for your contribution! Sashiko AI review found 3 potential
issue(s) to consider.

Critical: 0 · High: 0 · Medium: 1 · Low: 2

If you believe none of the issues are legitimate, please reply to each
issue of Medium severity or higher and explain why the AI is wrong.
If any of them are legitimate and you plan to respin, please let patchwork
know by including "pw-bot: cr" as a separate line at the end of your reply
(one such reply per series is enough).

- [Medium] The commit "net: ethernet: cortina: Rotate free queue page
  allocation" carries `Fixes: 4d5ae32f5e1e ("net: ethernet: Add a driver…
- [Low] The commit message carries a Fixes tag and `Assisted-by: LLM`, so
  it presents itself as a netdev bug fix.
- [Low] `geth_cleanup_freeq()` and the error labels in
  `geth_setup_freeq()` (`err_freeq_bitmap` / `err_freeq_pages`) free the…

--

net: ethernet: cortina: Rotate free queue page allocation

This patch changes geth_freeq_alloc_slot() to start each bitmap search
just after the most recently allocated slot, wrapping at the end, instead
of always starting from zero. A new freeq_page_cursor field holds the
position, and geth_setup_freeq() resets it to 0.

> The free queue metadata bitmap currently searches for a free slot from
> zero for every page allocation. Under sustained traffic this repeatedly
> scans occupied low-numbered slots.

[ ... ]

> Fixes: 4d5ae32f5e1e ("net: ethernet: Add a driver for Gemini gigabit ethernet")

[Severity: Medium]
Is this Fixes tag pointing at the right commit? The freeq_page_bitmap,
geth_freeq_alloc_slot() and its find_first_zero_bit() search are not in
4d5ae32f5e1e. They were added earlier in this series by "net: ethernet:
cortina: Preserve in-flight free queue pages".

The change also doesn't seem to alter behavior beyond where the search
starts. The old code returned -ENOSPC only when there was no zero bit in
[0, num_freeq_pages). The new code returns -ENOSPC only when both searches
fail, which is the same condition. A free slot is still found whenever one
exists.

This looks like an optimization of code added in the same unmerged series.
Could it be folded into "Preserve in-flight free queue pages", or sent
without a Fixes tag?

> Assisted-by: LLM
> Signed-off-by: Linus Walleij <linusw@kernel.org>

[Severity: Low]
The patch carries a Fixes tag, but the commit message doesn't say how the
scan cost was found or measured, or how the change was tested.
Documentation/process/maintainer-netdev.rst asks for this:

  All bug fixes must state how the issue was discovered and validated,
  and how the fix was tested.

For hardware drivers, it also asks that the testing statement name the
hardware the fix was tested on. Could that be added, including which
Gemini board was used?

Also, the message says the bitmap "currently searches for a free slot from
zero", but that behavior was added two patches earlier in this series.
Could the message say so?

> diff --git a/drivers/net/ethernet/cortina/gemini.c b/drivers/net/ethernet/cortina/gemini.c
> index 2345d582cb597..87c537ae83e7a 100644
> --- a/drivers/net/ethernet/cortina/gemini.c
> +++ b/drivers/net/ethernet/cortina/gemini.c

[ ... ]

> @@ -743,12 +744,20 @@ static int geth_freeq_alloc_slot(struct gemini_ethernet *geth)
>  
>  	lockdep_assert_held(&geth->freeq_lock);
>  
> -	slot = find_first_zero_bit(geth->freeq_page_bitmap,
> -				   geth->num_freeq_pages);
> -	if (slot == geth->num_freeq_pages)
> -		return -ENOSPC;
> +	slot = find_next_zero_bit(geth->freeq_page_bitmap,
> +				  geth->num_freeq_pages,
> +				  geth->freeq_page_cursor);
> +	if (slot == geth->num_freeq_pages) {
> +		slot = find_first_zero_bit(geth->freeq_page_bitmap,
> +					   geth->freeq_page_cursor);

[Severity: Low]
As far as I can tell this can't be reached today, but the wrap search
now passes freeq_page_cursor as the size argument. That means it relies
on the cursor matching the current bitmap.

geth_cleanup_freeq() and the error unwind in geth_setup_freeq() free the
bitmap and clear the count, but leave the cursor at its last value:

geth_cleanup_freeq() {
    ...
	bitmap_free(geth->freeq_page_bitmap);
	geth->freeq_page_bitmap = NULL;
	kfree(geth->freeq_pages);
	geth->freeq_pages = NULL;
	geth->num_freeq_pages = 0;
    ...
}

If geth_freeq_alloc_slot() ran in that state,
find_next_zero_bit(NULL, 0, cursor) would return 0. Then
find_first_zero_bit(NULL, cursor) with a non-zero cursor would read
through the NULL bitmap. The old find_first_zero_bit(bitmap, 0) returned
-ENOSPC without touching memory.

The current callers of geth_fill_freeq() appear to be guarded:

- geth_setup_freeq() resets the cursor after bitmap_zalloc() succeeds.
- NAPI only runs after a successful geth_resize_freeq().
- The SWFQ_EMPTY source stays masked after a failed resize.

Would it make sense to reset freeq_page_cursor to 0 next to the
num_freeq_pages = 0 assignments? Then the allocator wouldn't depend on
those outside guards.

> +		if (slot == geth->freeq_page_cursor)
> +			return -ENOSPC;
> +	}
>  
>  	__set_bit(slot, geth->freeq_page_bitmap);
> +	geth->freeq_page_cursor = slot + 1;
> +	if (geth->freeq_page_cursor == geth->num_freeq_pages)
> +		geth->freeq_page_cursor = 0;
>  
>  	return slot;
>  }

[ ... ]

-- 
Sashiko AI review · https://netdev-ai.bots.linux.dev/sashiko/#/patchset/20261002-gemini-ethernet-fixes-3-v3-0-3e1f25890ae8%40kernel.org

  reply	other threads:[~2026-10-06 17:19 UTC|newest]

Thread overview: 24+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-10-02 16:24 [PATCH net-next v3 00/12] net: ethernet: cortina: Fix Gemini RX buffer management Linus Walleij
2026-10-02 16:24 ` [PATCH net-next v3 01/12] net: ethernet: cortina: Keep PHY-less port bound for shared IRQ Linus Walleij
2026-10-06 17:19   ` netdev-bot+sashiko
2026-10-02 16:24 ` [PATCH net-next v3 02/12] net: ethernet: cortina: Keep shared free queue parent-owned Linus Walleij
2026-10-06 17:19   ` netdev-bot+sashiko
2026-10-02 16:24 ` [PATCH net-next v3 03/12] net: ethernet: cortina: Drain free queue IRQ before resize Linus Walleij
2026-10-06 17:19   ` netdev-bot+sashiko
2026-10-02 16:24 ` [PATCH net-next v3 04/12] net: ethernet: cortina: Correct free queue DMA mappings Linus Walleij
2026-10-06 17:19   ` netdev-bot+sashiko
2026-10-02 16:24 ` [PATCH net-next v3 05/12] net: ethernet: cortina: Index free queue fragments with XArray Linus Walleij
2026-10-06 17:19   ` netdev-bot+sashiko
2026-10-02 16:24 ` [PATCH net-next v3 06/12] net: ethernet: cortina: Preserve in-flight free queue pages Linus Walleij
2026-10-06 17:19   ` netdev-bot+sashiko
2026-10-02 16:24 ` [PATCH net-next v3 07/12] net: ethernet: cortina: Rebuild free queue metadata for RX ring changes Linus Walleij
2026-10-06 17:19   ` netdev-bot+sashiko
2026-10-02 16:24 ` [PATCH net-next v3 08/12] net: ethernet: cortina: Rotate free queue page allocation Linus Walleij
2026-10-06 17:19   ` netdev-bot+sashiko [this message]
2026-10-02 16:24 ` [PATCH net-next v3 09/12] net: ethernet: cortina: Recycle claimed free queue pages Linus Walleij
2026-10-06 17:19   ` netdev-bot+sashiko
2026-10-02 16:24 ` [PATCH net-next v3 10/12] net: ethernet: cortina: Validate RX fragment lengths Linus Walleij
2026-10-06 17:19   ` netdev-bot+sashiko
2026-10-02 16:24 ` [PATCH net-next v3 11/12] net: ethernet: cortina: Release partial RX frames on stop Linus Walleij
2026-10-06 17:19   ` netdev-bot+sashiko
2026-10-02 16:24 ` [PATCH net-next v3 12/12] net: ethernet: cortina: Scale Gemini RX queues to system memory Linus Walleij

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=179130715044.434549.12317966263867256368@kernel.org \
    --to=netdev-bot+sashiko@kernel.org \
    --cc=andrew+netdev@lunn.ch \
    --cc=davem@davemloft.net \
    --cc=edumazet@kernel.org \
    --cc=kuba@kernel.org \
    --cc=linusw@kernel.org \
    --cc=mhun512@gmail.com \
    --cc=mirq-linux@rere.qmqm.pl \
    --cc=netdev@vger.kernel.org \
    --cc=pabeni@redhat.com \
    --cc=ulli.kroll@googlemail.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox