[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <aNFlzBjGfG9A7RDa@boxer>
Date: Mon, 22 Sep 2025 17:05:48 +0200
From: Maciej Fijalkowski <maciej.fijalkowski@...el.com>
To: Amery Hung <ameryhung@...il.com>
CC: <bpf@...r.kernel.org>, <netdev@...r.kernel.org>,
<alexei.starovoitov@...il.com>, <andrii@...nel.org>, <daniel@...earbox.net>,
<paul.chaignon@...il.com>, <kuba@...nel.org>, <stfomichev@...il.com>,
<martin.lau@...nel.org>, <mohsin.bashr@...il.com>, <noren@...dia.com>,
<dtatulea@...dia.com>, <saeedm@...dia.com>, <tariqt@...dia.com>,
<mbloch@...dia.com>, <kernel-team@...a.com>
Subject: Re: [PATCH bpf-next v6 1/7] bpf: Clear pfmemalloc flag when freeing
all fragments
On Fri, Sep 19, 2025 at 04:09:46PM -0700, Amery Hung wrote:
> It is possible for bpf_xdp_adjust_tail() to free all fragments. The
> kfunc currently clears the XDP_FLAGS_HAS_FRAGS bit, but not
> XDP_FLAGS_FRAGS_PF_MEMALLOC. So far, this has not caused a issue when
> building sk_buff from xdp_buff since all readers of xdp_buff->flags
> use the flag only when there are fragments. Clear the
> XDP_FLAGS_FRAGS_PF_MEMALLOC bit as well to make the flags correct.
>
> Signed-off-by: Amery Hung <ameryhung@...il.com>
Reviewed-by: Maciej Fijalkowski <maciej.fijalkowski@...el.com>
> ---
> include/net/xdp.h | 5 +++++
> net/core/filter.c | 1 +
> 2 files changed, 6 insertions(+)
>
> diff --git a/include/net/xdp.h b/include/net/xdp.h
> index b40f1f96cb11..f288c348a6c1 100644
> --- a/include/net/xdp.h
> +++ b/include/net/xdp.h
> @@ -115,6 +115,11 @@ static __always_inline void xdp_buff_set_frag_pfmemalloc(struct xdp_buff *xdp)
> xdp->flags |= XDP_FLAGS_FRAGS_PF_MEMALLOC;
> }
>
> +static __always_inline void xdp_buff_clear_frag_pfmemalloc(struct xdp_buff *xdp)
> +{
> + xdp->flags &= ~XDP_FLAGS_FRAGS_PF_MEMALLOC;
> +}
> +
> static __always_inline void
> xdp_init_buff(struct xdp_buff *xdp, u32 frame_sz, struct xdp_rxq_info *rxq)
> {
> diff --git a/net/core/filter.c b/net/core/filter.c
> index 63f3baee2daf..5837534f4352 100644
> --- a/net/core/filter.c
> +++ b/net/core/filter.c
> @@ -4210,6 +4210,7 @@ static int bpf_xdp_frags_shrink_tail(struct xdp_buff *xdp, int offset)
>
> if (unlikely(!sinfo->nr_frags)) {
> xdp_buff_clear_frags_flag(xdp);
> + xdp_buff_clear_frag_pfmemalloc(xdp);
> xdp->data_end -= offset;
> }
>
> --
> 2.47.3
>
Powered by blists - more mailing lists