All of lore.kernel.org
 help / color / mirror / Atom feed
From: Pedro Tammela <pctammela@mojatatu.com>
To: Victor Nogueira <victor@mojatatu.com>,
	davem@davemloft.net, edumazet@google.com, kuba@kernel.org,
	pabeni@redhat.com, jhs@mojatatu.com, jiri@resnulli.us
Cc: horms@kernel.org, baowen.zheng@corigine.com,
	louis.peens@corigine.com, netdev@vger.kernel.org
Subject: Re: [PATCH net 3/4] net/sched: act_api: fix skb sizing and action leak on reoffload delete
Date: Tue, 25 Aug 2026 12:36:59 -0300	[thread overview]
Message-ID: <9506fd63-b0fe-45bb-b160-e2b10ee7775b@mojatatu.com> (raw)
In-Reply-To: <20260824153903.4143642-4-victor@mojatatu.com>

On 24/08/2026 12:39, Victor Nogueira wrote:
> tcf_reoffload_del_notify_msg() sizes the RTM_DELACTION skb with
> tcf_action_fill_size(action) alone.  Unlike every other notification path
> it never wraps that in tcf_action_full_attrs_size(), so the nlmsg_put()
> header, struct tcamsg and the TCA_ACT_TAB nest that tca_get_fill() emits -
> 24 bytes on x86_64 - are not budgeted.  As long as the single action stays
> well under NLMSG_GOODSIZE the floor in alloc_skb() hides this, but once its
> fill size crosses NLMSG_GOODSIZE the allocation is exactly 24 bytes short
> and tca_get_fill() runs out of tailroom.  That is now easy to reach for an
> offloadable act_pedit with a large tcfp_nkeys, which commit 8e2efb3f45a5
> ("net/sched: add get_fill_size callbacks for actions missing them") started
> accounting for properly.
> 
> When that happens tcf_reoffload_del_notify() returns early, before
> tcf_idr_release_unsafe(), and tcf_action_reoffload_cb() discards the return
> value:
> 
> 	if (tc_act_skip_sw(p->tcfa_flags) && !tc_act_in_hw(p))
> 		tcf_reoffload_del_notify(net, p);
> 
> The action has just lost its last hardware instance and is skip_sw, so it
> is left installed while processing no packets, and with no notification to
> tell userspace about it.  An -ENOBUFS from alloc_skb() gets the same
> treatment.
> 
> Fix this by budgeting the message header the way the add and delete paths
> do, and release the action even when the notification cannot be built -
> dropping the notification is strictly better than leaking a dead action,
> and there is no caller left to report the error to.
> 
> Fixes: 13926d19a11e ("flow_offload: add reoffload process to update hw_count")
> Reported-by: Sashiko <sashiko-bot@kernel.org>
> Closes: https://netdev-ai.bots.linux.dev/sashiko/#/patchset/20260810164357.1653956-1-victor%40mojatatu.com
> Acked-by: Jamal Hadi Salim <jhs@mojatatu.com>

Reviewed-by: Pedro Tammela <pctammela@mojatatu.com>

> Signed-off-by: Victor Nogueira <victor@mojatatu.com>
> ---
>   net/sched/act_api.c | 17 +++++++++++------
>   1 file changed, 11 insertions(+), 6 deletions(-)
> 
> diff --git a/net/sched/act_api.c b/net/sched/act_api.c
> index 20b6501fd33b..37eced84dfa5 100644
> --- a/net/sched/act_api.c
> +++ b/net/sched/act_api.c
> @@ -1867,11 +1867,13 @@ static int tcf_action_delete(struct net *net, struct tc_action *actions[])
>   static struct sk_buff *tcf_reoffload_del_notify_msg(struct net *net,
>   						    struct tc_action *action)
>   {
> -	size_t attr_size = tcf_action_fill_size(action);
>   	struct tc_action *actions[TCA_ACT_MAX_PRIO] = {
>   		[0] = action,
>   	};
>   	struct sk_buff *skb;
> +	size_t attr_size;
> +
> +	attr_size = tcf_action_full_attrs_size(tcf_action_fill_size(action));
>   
>   	skb = alloc_skb(max(attr_size, NLMSG_GOODSIZE), GFP_KERNEL);
>   	if (!skb)
> @@ -1888,15 +1890,18 @@ static struct sk_buff *tcf_reoffload_del_notify_msg(struct net *net,
>   static int tcf_reoffload_del_notify(struct net *net, struct tc_action *action)
>   {
>   	const struct tc_action_ops *ops = action->ops;
> -	struct sk_buff *skb;
> +	struct sk_buff *skb = NULL;
>   	int ret;
>   
> -	if (!rtnl_notify_needed(net, 0, RTNLGRP_TC)) {
> -		skb = NULL;
> -	} else {
> +	if (rtnl_notify_needed(net, 0, RTNLGRP_TC)) {
>   		skb = tcf_reoffload_del_notify_msg(net, action);
> +		/* The action has already lost its hardware instance and is
> +		 * skip_sw, so it must be released whether or not the
> +		 * notification can be built.  Drop the notification rather
> +		 * than leave an action behind that processes no packets.
> +		 */
>   		if (IS_ERR(skb))
> -			return PTR_ERR(skb);
> +			skb = NULL;
>   	}
>   
>   	ret = tcf_idr_release_unsafe(action);


  reply	other threads:[~2026-08-25 15:37 UTC|newest]

Thread overview: 15+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-08-24 15:38 [PATCH net 0/4] net/sched: Fix remaining actions notification accounting issues Victor Nogueira
2026-08-24 15:39 ` [PATCH net 1/4] net/sched: act_api: budget all shared attributes in notify skbs Victor Nogueira
2026-08-27  8:44   ` Simon Horman
2026-08-27 18:37     ` Victor Nogueira
2026-08-24 15:39 ` [PATCH net 2/4] net/sched: act_api: size the RTM_GETACTION reply from the actions Victor Nogueira
2026-08-27  8:49   ` Simon Horman
2026-08-27 18:38     ` Victor Nogueira
2026-08-24 15:39 ` [PATCH net 3/4] net/sched: act_api: fix skb sizing and action leak on reoffload delete Victor Nogueira
2026-08-25 15:36   ` Pedro Tammela [this message]
2026-08-24 15:39 ` [PATCH net 4/4] net/sched: act_mirred: account for TCA_MIRRED_BLOCKID in get_fill_size Victor Nogueira
2026-08-27  8:53   ` Simon Horman
2026-08-27 18:39     ` Victor Nogueira
2026-08-27  9:24   ` Paolo Abeni
2026-08-27 18:40     ` Victor Nogueira
2026-08-28 23:10 ` [PATCH net 0/4] net/sched: Fix remaining actions notification accounting issues patchwork-bot+netdevbpf

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=9506fd63-b0fe-45bb-b160-e2b10ee7775b@mojatatu.com \
    --to=pctammela@mojatatu.com \
    --cc=baowen.zheng@corigine.com \
    --cc=davem@davemloft.net \
    --cc=edumazet@google.com \
    --cc=horms@kernel.org \
    --cc=jhs@mojatatu.com \
    --cc=jiri@resnulli.us \
    --cc=kuba@kernel.org \
    --cc=louis.peens@corigine.com \
    --cc=netdev@vger.kernel.org \
    --cc=pabeni@redhat.com \
    --cc=victor@mojatatu.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.