From mboxrd@z Thu Jan 1 00:00:00 1970 Authentication-Results: mail.toke.dk; dkim=pass header.d=toke.dk; arc=none (Message is not ARC signed); dmarc=pass (Used From Domain Record) header.from=toke.dk policy.dmarc=reject From: Toke =?utf-8?Q?H=C3=B8iland-J=C3=B8rgensen?= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=toke.dk; s=20161023; t=1764672082; bh=AB/YV5FgeN7iiVMR16ByeM4aMGMDjBYkKLdys2MDF4w=; h=From:To:Cc:Subject:In-Reply-To:References:Date:From; b=ECameLACubzq7uw8LYTKmDrujVAzjZXphpHiQXk8+ht8wMQCSjwj+CoL6lrcWvm/4 4GgRsHvbt94d03UCDIQwc3fSBgj7PFJYHazD7jmESSEeoVz4PhaXhH+CBfVHUxbPNP wcTGcfs2UO5uakbFYOV8aa7cpsvBGBUsw6uOyoBfXIexVHrXLuSruXe7riOkhy2yOX 9uS31u6hEIl6AcbUIt5vvq8DD9xdr0vIsDyL5ipC+WggmpKe2EL0jXjp1UbzUE0vc0 BJz0zblUqq6CCt4j4qgbID5ly91PjRZceZRabn+jVU8kPQQBied1ShMcV9ixDa0OAr CRYibzFUMkQIw== To: Willem de Bruijn , Jamal Hadi Salim , Cong Wang , Jiri Pirko , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman Cc: Jonas =?utf-8?Q?K=C3=B6ppeler?= , cake@lists.bufferbloat.net, netdev@vger.kernel.org In-Reply-To: References: <20251130-mq-cake-sub-qdisc-v3-0-5f66c548ecdc@redhat.com> <20251130-mq-cake-sub-qdisc-v3-1-5f66c548ecdc@redhat.com> Date: Tue, 02 Dec 2025 11:41:20 +0100 X-Clacks-Overhead: GNU Terry Pratchett Message-ID: <87345t9ne7.fsf@toke.dk> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Message-ID-Hash: BAFWURPQJKH7I3Z6L4DAKQDXOO5CXR2T X-Message-ID-Hash: BAFWURPQJKH7I3Z6L4DAKQDXOO5CXR2T X-MailFrom: toke@toke.dk 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-next v3 1/5] net/sched: Export mq functions for reuse List-Id: Cake - FQ_codel the next generation Archived-At: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: Willem de Bruijn writes: > Toke H=C3=B8iland-J=C3=B8rgensen wrote: >> To enable the cake_mq qdisc to reuse code from the mq qdisc, export a >> bunch of functions from sch_mq. Split common functionality out from some >> functions so it can be composed with other code, and export other >> functions wholesale. >>=20 >> No functional change intended. >>=20 >> Signed-off-by: Toke H=C3=B8iland-J=C3=B8rgensen >> --- >> include/net/sch_generic.h | 19 +++++++++++++ >> net/sched/sch_mq.c | 69 ++++++++++++++++++++++++++++++++--------= ------- >> 2 files changed, 67 insertions(+), 21 deletions(-) >>=20 >> diff --git a/include/net/sch_generic.h b/include/net/sch_generic.h >> index c3a7268b567e..f2281914d962 100644 >> --- a/include/net/sch_generic.h >> +++ b/include/net/sch_generic.h > > We probably want to avoid random users. This may be better suited to a > local header, similar to net/core/devmem.h. Hmm, right; I just put them in sch_generic.h because that's where the existing mq_change_real_num_tx() was. I can move them, though, don't feel strongly about it either way :) > I don't mean to derail this feature if these are the only concerns. > This can be revised later in -rcX too. Sure, let's see if our benevolent maintainers decide to merge this before or after the merge window; I'll follow up as appropriate. >> @@ -1419,7 +1419,26 @@ void mini_qdisc_pair_init(struct mini_Qdisc_pair = *miniqp, struct Qdisc *qdisc, >> void mini_qdisc_pair_block_init(struct mini_Qdisc_pair *miniqp, >> struct tcf_block *block); >>=20=20 >> +struct mq_sched { >> + struct Qdisc **qdiscs; >> +}; >> + >> +int mq_init_common(struct Qdisc *sch, struct nlattr *opt, >> + struct netlink_ext_ack *extack, >> + const struct Qdisc_ops *qdisc_ops); >> +void mq_destroy_common(struct Qdisc *sch); >> +void mq_attach(struct Qdisc *sch); >> void mq_change_real_num_tx(struct Qdisc *sch, unsigned int new_real_tx); >> +void mq_dump_common(struct Qdisc *sch, struct sk_buff *skb); >> +struct netdev_queue *mq_select_queue(struct Qdisc *sch, >> + struct tcmsg *tcm); >> +struct Qdisc *mq_leaf(struct Qdisc *sch, unsigned long cl); >> +unsigned long mq_find(struct Qdisc *sch, u32 classid); >> +int mq_dump_class(struct Qdisc *sch, unsigned long cl, >> + struct sk_buff *skb, struct tcmsg *tcm); >> +int mq_dump_class_stats(struct Qdisc *sch, unsigned long cl, >> + struct gnet_dump *d); >> +void mq_walk(struct Qdisc *sch, struct qdisc_walker *arg); >>=20=20 >> int sch_frag_xmit_hook(struct sk_buff *skb, int (*xmit)(struct sk_buff = *skb)); >>=20=20 >> diff --git a/net/sched/sch_mq.c b/net/sched/sch_mq.c >> index c860119a8f09..0bcabdcd1f44 100644 >> --- a/net/sched/sch_mq.c >> +++ b/net/sched/sch_mq.c >> @@ -17,10 +17,6 @@ >> #include >> #include >>=20=20 >> -struct mq_sched { >> - struct Qdisc **qdiscs; >> -}; >> - >> static int mq_offload(struct Qdisc *sch, enum tc_mq_command cmd) >> { >> struct net_device *dev =3D qdisc_dev(sch); >> @@ -49,23 +45,29 @@ static int mq_offload_stats(struct Qdisc *sch) >> return qdisc_offload_dump_helper(sch, TC_SETUP_QDISC_MQ, &opt); >> } >>=20=20 >> -static void mq_destroy(struct Qdisc *sch) >> +void mq_destroy_common(struct Qdisc *sch) >> { >> struct net_device *dev =3D qdisc_dev(sch); >> struct mq_sched *priv =3D qdisc_priv(sch); >> unsigned int ntx; >>=20=20 >> - mq_offload(sch, TC_MQ_DESTROY); >> - >> if (!priv->qdiscs) >> return; >> for (ntx =3D 0; ntx < dev->num_tx_queues && priv->qdiscs[ntx]; ntx++) >> qdisc_put(priv->qdiscs[ntx]); >> kfree(priv->qdiscs); >> } >> +EXPORT_SYMBOL(mq_destroy_common); > > On a similar note, this would be a good use of EXPORT_SYMBOL_NS_GPL. > > Maybe not even NETDEV_INTERNAL but a dedicated NET_SCHED_MQ. Huh, didn't know about namespaced exports, neat. Can do that too :) -Toke