From mboxrd@z Thu Jan 1 00:00:00 1970 Authentication-Results: mail.toke.dk; spf=none smtp.mailfrom=mojatatu.com; dkim=pass header.d=mojatatu-com.20230601.gappssmtp.com; arc=pass; dmarc=none Received: from mail-qt1-x830.google.com (mail-qt1-x830.google.com [IPv6:2607:f8b0:4864:20::830]) by mail.toke.dk (Postfix) with ESMTPS id 051BCE0FCAB for ; Sun, 15 Mar 2026 18:40:30 +0100 (CET) Received: by mail-qt1-x830.google.com with SMTP id d75a77b69052e-50902b1006cso34431741cf.3 for ; Sun, 15 Mar 2026 10:40:30 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1773596429; cv=none; d=google.com; s=arc-20240605; b=WjSEnw4Bl+u5h4j0/p4r5bnY5rZ9QK8eAPPIF3I68Npzg5Bn6NtwrKEEfdDfzbfltS hLyeSHEA7jXh/ye3lrnrVVGy+xl4Io+KI6MnDCaDZkP7FkMjasvmgDHkAFrHhAhmLCQ1 vvxvpfqLBauoCBGSlhjpkkJpFzJN57VRVQoCLlx6wtakKCWAt6V1aOBzidnh5hYos6zi GQiDsDZqVQcES0mXPYcLII3ergLJv+TMZElD9Cyb/3acImKZqfHFg43WptXCp+uFN7iO /mlGrUijWyqLO8plY4mvutEwsZUB6qQau9pvO+Nvv+XL9bHjHnQ9ZYVkEfeSZQi5DQiM BWbQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:dkim-signature; bh=SKiLs1RyC55du9pBc4TcXHWFicF13Mvzo2PvrfgLqag=; fh=yd7dXrYUBzpZYZOcqKyizC4jJsO/8FJ0ch0qt7sEfbY=; b=JVmoe0JspN7KKOcwhpB9zI5/pHLCkVbV9S/5eysw6wd3voTeuQXrMn59M/Wjpv+lW8 QIcHxys4VIrj0gjKhKwoy02BLCcMmg3I0+I9DH5FlEQS6GXHii9aAdSwdO9eQlrhgtM8 ZPF5dGgZvuq0zz3/So1eGMXQWwOdo85CMQRznrn+uI8YgXB4+MFWftEyYUJwshPGa/Ea S+x75lZtKSmj/7ohzkFpuh7QxYPGiJGy6C4EdEn/9B4tUJGholCuFHvtQx6Cy+W8hDdw xM6KwGKiYkSPre5vONgiMvVg11DnAAgrxt4svbv+/HYKv2/M6CXaPBmVEtRK71aqNTAW IU6w==; darn=lists.bufferbloat.net ARC-Authentication-Results: i=1; mx.google.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=mojatatu-com.20230601.gappssmtp.com; s=20230601; t=1773596429; x=1774201229; darn=lists.bufferbloat.net; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:from:to:cc:subject:date :message-id:reply-to; bh=SKiLs1RyC55du9pBc4TcXHWFicF13Mvzo2PvrfgLqag=; b=DXocNiLQeEqHZDTIP8tCw5E6JVXjUfgQFGHV8QrYkiocJBfYFg1ROlSc5FpFvxN2fC yQRYE1naYDXXUDOf2kga+ByZX4cZ9wQ5LLEqk22yBELL7FfAbVQVF4Q0lJheP0VzHsfm vZJOOvycoXs0fMk9sYmCXI5OgJVAjffk168bTHq2MRBtW7PskCguSldaUKBKe3b0iT3Z RqquSuvhMo16mXC6qV0ZJudsdK/1tySphs0tnPevn0Gu5n0z1hY4F3XwLqeayaPZ+K6K 7hn1PtBtd/hOXMU6XFS/vB6bROMzNJYzV79hxRXg11WWmWq3dFzBn9cgx9cEDy/pYtBl VRfg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773596429; x=1774201229; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=SKiLs1RyC55du9pBc4TcXHWFicF13Mvzo2PvrfgLqag=; b=lKGMfw2xAOSG7Vx8KuK6nUFu92t4vcN2jhai5GJJ+dO2M9vObuV5VK385Q2QDZHTcT iPRcQxgFnAxOakQbigY9A5Wh4/AkRKWZLWNT1LPUTfoQdtOUJS+ur6yh3tAny7EhwcX1 IsDmekp1oA6sd69h931OuVNuR/jQS76FBjvyEzzwpaQyQsso/rUI9XUlxZJJMWIMZwIP lT1ZLsN7VqZVznZ9wROsy9YQYbOEVhl7kquDyETgenhP0ZPi2HEP7mnigMJUT21P5dIw 19CLOTV5YQDPqUldB0hXRs7EZDIK9PEXj4eGCAUQUC2jTUbC2TlnosXUEt6r0sL+QEQw jrmg== X-Forwarded-Encrypted: i=1; AJvYcCUb/XetyazkJkghEtt6K9/GvYYKVUEHPAg+EHFsXDTKBcsb9XBTqKc6BYiwGjDL6Gxr+1lI@lists.bufferbloat.net X-Gm-Message-State: AOJu0Yyt4WCep3ITUK+iHPF2qopBnxFcJVbFJZozlq7KDq2alM1WPNdC OEbcZmUjzXJk/ZPrnf4dLquQM+ZoS0DC4cBnxbw1uthzOWb4sO22OZKaV9HcwJhYLkYzyQB3O1t FwJHKxcXa2tjOR+axRPacl81ij2mFYRvms31dGtTndL8bwx14BYg= X-Gm-Gg: ATEYQzxJTNbQFZGhcavNAsLluJETUwNUtKV6xJdPU5yiCcr4+9J3yjkRFFqwkMLz3nT XLEoVjVFV8+FwyHJG3mUA427zjBHM9XcDToRgM1czObOy4DPflCmK7i9lq76Jp/nvfxhilm5Ztl 1Rurxlz6P4XTPxMCU1xmHIC3PatizJQ8RywrmkNO4Q6KV2O+F2uOs+w4+FozXyxBlUweyYwO1KC 76nZVS2W3sEiJHNfeWaO+5ZtB2V5CBEEvsEAwr1gnJ5eygMdQE/zF9mPSSxTbIX2yIUw91/exX0 n7zRjVfxL0FrmiM= X-Received: by 2002:a05:6a00:854:b0:81e:81fb:b392 with SMTP id d2e1a72fcca58-82a196d9795mr9102209b3a.11.1773590227286; Sun, 15 Mar 2026 08:57:07 -0700 (PDT) MIME-Version: 1.0 References: <20260307212058.169511-1-jhs@mojatatu.com> <20260310184713.7e810431@kernel.org> <20260311175249.54abe1b6@kernel.org> <20260312165113.773a5f44@kernel.org> <20260314080004.3e8575d8@kernel.org> In-Reply-To: <20260314080004.3e8575d8@kernel.org> From: Jamal Hadi Salim Date: Sun, 15 Mar 2026 11:56:56 -0400 X-Gm-Features: AaiRm51rmZBzVnloy_8xdC3vuhjPorclFaCvP3TTlZ3O1BeMklnatfJOc6SBkho Message-ID: To: Jakub Kicinski Cc: netdev@vger.kernel.org, davem@davemloft.net, edumazet@google.com, pabeni@redhat.com, horms@kernel.org, jiri@resnulli.us, toke@toke.dk, vinicius.gomes@intel.com, stephen@networkplumber.org, vladbu@nvidia.com, cake@lists.bufferbloat.net, bpf@vger.kernel.org, ghandatmanas@gmail.com, km.kim1503@gmail.com, security@kernel.org, Victor Nogueira Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Message-ID-Hash: XHAXTAEIVBVZAYJLI75CCE6DZW2GKV4M X-Message-ID-Hash: XHAXTAEIVBVZAYJLI75CCE6DZW2GKV4M X-MailFrom: jhs@mojatatu.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; emergency; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header X-Mailman-Version: 3.3.10 Precedence: list Subject: [Cake] Re: [PATCH net] net/sched: Mark qdisc for deletion if graft cannot delete List-Id: Cake - FQ_codel the next generation Archived-At: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: On Sat, Mar 14, 2026 at 11:00=E2=80=AFAM Jakub Kicinski w= rote: > > On Fri, 13 Mar 2026 15:36:28 -0400 Jamal Hadi Salim wrote: > > In this specific example, the issue is that the classifier code path > > can't release the rtnl_lock while the qdisc's refcnt is bigger than 1. > > > > Does this make more sense? > > The reason we went with the "mark for delete" approach is at time x+3 > > the "qdisc add" wont be able to find this qdisc. This is the common > > observed pattern - for example described in the commit message where > > we get have a slightly different flow with "qdisc del" before "filter > > add". > > Maybe a (completely untested) diff will help illustrate my thinking > better than words: > Dont have much time today - but will try in the upcoming days. cheers, jamal > diff --git a/include/net/pkt_cls.h b/include/net/pkt_cls.h > index 99ac747b7906..c13c9e8619e4 100644 > --- a/include/net/pkt_cls.h > +++ b/include/net/pkt_cls.h > @@ -27,6 +27,9 @@ void unregister_tcf_proto_ops(struct tcf_proto_ops *ops= ); > #define NET_CLS_ALIAS_PREFIX "net-cls-" > #define MODULE_ALIAS_NET_CLS(kind) MODULE_ALIAS(NET_CLS_ALIAS_PREFIX= kind) > > +extern char *rtnl_load_mod; > +void rtnl_load_mod_check(void); > + > struct tcf_block_ext_info { > enum flow_block_binder_type binder_type; > tcf_chain_head_change_t *chain_head_change; > diff --git a/net/sched/act_api.c b/net/sched/act_api.c > index 332fd9695e54..c21dd2e36592 100644 > --- a/net/sched/act_api.c > +++ b/net/sched/act_api.c > @@ -1368,11 +1368,15 @@ struct tc_action_ops *tc_action_load_ops(struct n= lattr *nla, u32 flags, > #ifdef CONFIG_MODULES > bool rtnl_held =3D !(flags & TCA_ACT_FLAGS_NO_RTNL); > > - if (rtnl_held) > - rtnl_unlock(); > + if (rtnl_held) { > + if (WARN_ON_ONCE(rtnl_load_mod)) > + return ERR_PTR(-EINVAL); > + rtnl_load_mod =3D kasprintf(GFP_KERNEL, > + NET_ACT_ALIAS_PREFIX "%= s", > + act_name); > + return ERR_PTR(-EAGAIN); > + } > request_module(NET_ACT_ALIAS_PREFIX "%s", act_name); > - if (rtnl_held) > - rtnl_lock(); > > a_o =3D tc_lookup_action_n(act_name); > > @@ -2107,6 +2111,9 @@ static int tcf_action_add(struct net *net, struct n= lattr *nla, > &attr_size, flags, 0, extack); > if (ret !=3D -EAGAIN) > break; > + rtnl_unlock(); > + rtnl_load_mod_check(); > + rtnl_lock(); > } > > if (ret < 0) > diff --git a/net/sched/cls_api.c b/net/sched/cls_api.c > index 4829c27446e3..1b0f762d6e4b 100644 > --- a/net/sched/cls_api.c > +++ b/net/sched/cls_api.c > @@ -46,6 +46,19 @@ > /* The list of all installed classifier types */ > static LIST_HEAD(tcf_proto_base); > > +char *rtnl_load_mod; > + > +void rtnl_load_mod_check(void) > +{ > + char *mod =3D rtnl_load_mod; > + > + if (mod) { > + rtnl_load_mod =3D NULL; > + request_module("%s", mod); > + kfree(mod); > + } > +} > + > /* Protects list of registered TC modules. It is pure SMP lock. */ > static DEFINE_RWLOCK(cls_mod_lock); > > @@ -255,17 +268,15 @@ tcf_proto_lookup_ops(const char *kind, bool rtnl_he= ld, > if (ops) > return ops; > #ifdef CONFIG_MODULES > - if (rtnl_held) > - rtnl_unlock(); > + if (rtnl_held) { > + if (WARN_ON_ONCE(rtnl_load_mod)) > + return ERR_PTR(-EINVAL); > + rtnl_load_mod =3D kasprintf(GFP_KERNEL, > + NET_CLS_ALIAS_PREFIX "%s", kind= ); > + return ERR_PTR(-EAGAIN); > + } > request_module(NET_CLS_ALIAS_PREFIX "%s", kind); > - if (rtnl_held) > - rtnl_lock(); > ops =3D __tcf_proto_lookup_ops(kind); > - /* We dropped the RTNL semaphore in order to perform > - * the module load. So, even if we succeeded in loading > - * the module we have to replay the request. We indicate > - * this using -EAGAIN. > - */ > if (ops) { > module_put(ops->owner); > return ERR_PTR(-EAGAIN); > @@ -2459,6 +2470,7 @@ static int tc_new_tfilter(struct sk_buff *skb, stru= ct nlmsghdr *n, > * of target chain. > */ > rtnl_held =3D true; > + rtnl_load_mod_check(); > /* Replay the request. */ > goto replay; > } > @@ -3230,9 +3242,13 @@ static int tc_ctl_chain(struct sk_buff *skb, struc= t nlmsghdr *n, > tcf_chain_put(chain); > errout_block: > tcf_block_release(q, block, true); > - if (err =3D=3D -EAGAIN) > + if (err =3D=3D -EAGAIN) { > + rtnl_unlock(); > + rtnl_load_mod_check(); > + rtnl_lock(); > /* Replay the request. */ > goto replay; > + } > return err; > > errout_block_locked: