From: Gunter Woytowitz <gunter@vcinity.io>
To: Simon Horman <horms@kernel.org>
Cc: "K. Y. Srinivasan" <kys@microsoft.com>,
Haiyang Zhang <haiyangz@microsoft.com>,
Wei Liu <wei.liu@kernel.org>, Dexuan Cui <decui@microsoft.com>,
Long Li <longli@microsoft.com>,
Andrew Lunn <andrew+netdev@lunn.ch>,
"David S. Miller" <davem@davemloft.net>,
Eric Dumazet <edumazet@google.com>,
Jakub Kicinski <kuba@kernel.org>, Paolo Abeni <pabeni@redhat.com>,
Alexei Starovoitov <ast@kernel.org>,
Daniel Borkmann <daniel@iogearbox.net>,
Jesper Dangaard Brouer <hawk@kernel.org>,
John Fastabend <john.fastabend@gmail.com>,
Stanislav Fomichev <sdf@fomichev.me>,
"open list:Hyper-V/Azure CORE AND DRIVERS"
<linux-hyperv@vger.kernel.org>,
"open list:NETWORKING DRIVERS" <netdev@vger.kernel.org>,
open list <linux-kernel@vger.kernel.org>,
"open list:XDP eXpress Data Path:Keyword:?:b|_xdp?:b|_"
<bpf@vger.kernel.org>
Subject: Re: [PATCH net] net: mana: never hand a non-page_pool buffer to XDP
Date: Fri, 11 Sep 2026 14:31:39 +0000 [thread overview]
Message-ID: <E180DC24-B376-48A5-AD9D-08427E69F312@vcinity.io> (raw)
In-Reply-To: <20260911111221.GE48209@horms.kernel.org>
I had a very hard time creating the request I submitted, and don’t have the time to try and do that again.
If you think it is a worthy change you can incorporate it some other way.
> On Sep 11, 2026, at 7:12 AM, Simon Horman <horms@kernel.org> wrote:
>
> On Thu, Sep 10, 2026 at 11:17:47AM -0400, Gunter Woytowitz wrote:
>> mana_create_rxq() registers MEM_TYPE_PAGE_POOL for the rxq
>> unconditionally, so every buffer XDP can see must be owned by that
>> page_pool: on XDP_REDIRECT the frame is freed through __xdp_return()
>> -> page_pool_put_full_page().
>>
>> mana_xdp_set() assigns apc->bpf_prog before calling
>> mana_pre_alloc_rxbufs(), which allocates with dev_alloc_pages(), and
>> mana_fill_rx_oob() prefers those buffers whenever mpc->rxbufs_pre is
>> set, leaving from_pool false. So for a port that is up when a program
>> is attached, the entire re-created ring is filled with pages the
>> page_pool does not own.
>>
>> The page_pool then sees pp_ref_count == 0 when such a frame is
>> returned, so the atomic_long_sub_return() in page_pool_unref_netmem()
>> goes negative and trips its WARN_ON(ret < 0), once per redirected
>> frame. Observed on a 5.14-based distro kernel, where that warning sits
>> at helpers.h:269:
>>
>> WARNING: CPU: 3 PID: 0 at include/net/page_pool/helpers.h:269
>> __xdp_return+0x2b3/0x2c0
>> mana_process_rx_cqe -> mana_run_xdp -> mana_rx_skb -> xsk_map_redirect
>> -> __xdp_return
>>
>> On a VM booted with console=ttyS0 the resulting stack traces peg the
>> console thread and the machine becomes unusable.
>>
>> Fill from the page_pool when a program is attached, using
>> mana_xdp_get() -- the predicate mana_get_rxbuf_cfg() already uses to
>> choose the XDP buffer geometry. With no program attached nothing
>> changes, so the pre-allocation still does its job of keeping
>> mana_attach() from failing on allocation.
>>
>> Leaving the pre-allocated buffers unconsumed is safe:
>> mana_pre_dealloc_rxbufs() dma-unmaps and put_page()s the remainder,
>> and every caller (mana_xdp_set(), mana_change_mtu(), and both ethtool
>> ring and channel paths) already runs it after mana_attach().
>>
>> The rxq->xdp_save_va reuse in mana_get_rxfrag() also leaves from_pool
>> false, but that cache is fed only by the drop path's non-pool branch,
>> which this change makes unreachable while a program is attached, so
>> it needs no fix.
>>
>> Found and fixed on a 5.14-based distro kernel running AF_XDP over
>> MANA in copy mode: 24M+ redirected frames with no warnings, where the
>> unpatched driver warned on essentially every redirected frame. All of
>> the code involved is unchanged in mainline.
>>
>> Fixes: b1d13f7a3b53 ("net: mana: Add page pool for RX buffers")
>> Signed-off-by: Gunter Woytowitz <gunter@vcinity.io>
>
> Unfortunately the CI failed to apply this patch to net.
> Which is curious, because I am able to apply it locally.
>
> But perhaps it would be best to (rebase and?) repost
> after waiting for the usual 24h[*] to elapse.
>
> [*] https://docs.kernel.org/process/maintainer-netdev.html
>
> --
> pw-bot: changes-requested
This email may contain confidential and privileged information and is intended solely for the use of the addressee(s). Unless you are the addressee or are authorized to receive messages for the addressee, you may not use, copy, disseminate, or disclose the information or any attachments to any third party. If you have received this correspondence in error, please notify the sender immediately and delete this email. Your cooperation and understanding are greatly appreciated. Attention Federal Customers: Please note this email platform is NOT approved to communicate (send or receive) CUI. For questions on the approved system to communicate CUI, please contact your designated Vcinity Representative.
next prev parent reply other threads:[~2026-09-11 14:32 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-10 15:17 [PATCH net] net: mana: never hand a non-page_pool buffer to XDP Gunter Woytowitz via B4 Relay
2026-09-11 11:12 ` Simon Horman
2026-09-11 14:31 ` Gunter Woytowitz [this message]
2026-09-11 15:18 ` sashiko-bot
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=E180DC24-B376-48A5-AD9D-08427E69F312@vcinity.io \
--to=gunter@vcinity.io \
--cc=andrew+netdev@lunn.ch \
--cc=ast@kernel.org \
--cc=bpf@vger.kernel.org \
--cc=daniel@iogearbox.net \
--cc=davem@davemloft.net \
--cc=decui@microsoft.com \
--cc=edumazet@google.com \
--cc=haiyangz@microsoft.com \
--cc=hawk@kernel.org \
--cc=horms@kernel.org \
--cc=john.fastabend@gmail.com \
--cc=kuba@kernel.org \
--cc=kys@microsoft.com \
--cc=linux-hyperv@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=longli@microsoft.com \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.com \
--cc=sdf@fomichev.me \
--cc=wei.liu@kernel.org \
/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