From nobody Sun Jun 14 06:07:15 2026 Received: from mail-pl1-f171.google.com (mail-pl1-f171.google.com [209.85.214.171]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6EFA62E6CB3 for ; Sat, 2 May 2026 21:54:08 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.171 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777758849; cv=none; b=F/CDtr3PEg5vGEEJvrmY4r4fwQKhcaHwVbps7GYFlrBAcVWQNXrzW+cAj8MbXzLt2aAsI6wqVgwZV+O86woYEqQCoB/r7/XnuhTPWekr2cyaCz+XpkO5LtDphR2mhhO9esXy55rAj91HMZWZzQ0yuyS9f6/odSp4nnk6qp1QQPQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777758849; c=relaxed/simple; bh=3STGZFIGp1QI0P9KYESK3j78npCaPdnySXuzfK9UW/E=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=IW4xNaNfoN+5kFF2Nszd3tEvzOiPQ5PgtY2In3DNsoArZwza7WgV/wC+9Ad4z/rvpyawgNlSbudNEKTxszpKe4Ybj31Ky8xQr1B2z4LUen2qiiINk6/ZwAzRHI2ImyHccc2lCb7SWxDPHw1ry1FFs75FLJwvBjukRD5xkHRFf2o= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=Co0PlfAJ; arc=none smtp.client-ip=209.85.214.171 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="Co0PlfAJ" Received: by mail-pl1-f171.google.com with SMTP id d9443c01a7336-2ab39b111b9so12151265ad.1 for ; Sat, 02 May 2026 14:54:08 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1777758848; x=1778363648; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=XVeN/tIgR68DwC5ZYD/OpJgnTRgKD56zUbPN+aZwxQg=; b=Co0PlfAJodc+S/IC6WbjtuoV2PvcRiz6jN7dkIZkbpx9mJ1qso55n9H/LfbmSmCebY nqNvwDQL5b+QPFDG3UuGyGcQpa6c+GFshsQUEv2XJpYJFuNyNXjT7G7J5gZHLsilZEyy JELvIv5jllXseDzUAFpIpXzgjowe5XB3lW/TOrxd9oW8oLPDALcwbWAGH4XJONN2+iiW gq1hYVi8bKqDzVD1K0TuecIf7VvV/fNGJfqDankawMQZdjmQU8uq5bFAPlJB6DdEVjyY Pp5MZjeAhk6Z7aXKtXymVw5aB9YMML8IH0C3pbJCZaisTIyn2hGFEtBIH8BiyJ7F5FSN yJ5A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1777758848; x=1778363648; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=XVeN/tIgR68DwC5ZYD/OpJgnTRgKD56zUbPN+aZwxQg=; b=HGV91nVOX4eLy/SLUTeamxOgSbWP1dUvkdjIkhLADKtKnFRSMMaa+De+BGRvGEwvqG 7Ry0MbvvDskc9kEkpFBpAp9tFRFu49vM17ViAy5us7qH987xdO02aUY9nS0tBujsXIGY TQuAEls8BqSKyzuHhTqEU/HTcUApDXKVSu09tr8YL1ADrYilN2mca2Pye5AntunQ8798 JcEAKYTPSygB5k+yGCbNyX2cXcaQ+sG72LbHXu/lOb3jHMWydBOHImGp1aybJljF9Bwk qZa4zrCXdia/4W0aEf00iOzmqhRtFrwSDQe/dSTTcxHVfSL3apgXf3u+Zeen4sbV0nms nmuw== X-Forwarded-Encrypted: i=1; AFNElJ/6LYFaImjGYV6c44JFTO2MswRSSonIW9LRBRhaYYnvFe98mDBETxupVhro4+yZWtjEPt/u7dsJgRILskI=@vger.kernel.org X-Gm-Message-State: AOJu0Yw3giQOByyczMcj/NgE7J0vgidzWzLoV/DkZCaRUKE+Xubz7D50 q6wHDdlt/rPaQF8nhKVqU5sIhQkdp3oN1h/3k3NR41RApBgcii0UIDee X-Gm-Gg: AeBDieujBu5UrxzzqQN0YCRPd7I9uXaW+GuAc8Gl6DfHIFT50vpEWN4mtTCyou0jMCj u5RBRkrV8fK9FZr/T8oTOjdYoGcR/7/L2iHvz7IIpgsx5XUwEsdlhKvscw8FaS4BBhT0dKPrUr/ AYfsg9AeTtGre31bvAXy581GMMIxu9Xup4oFXHoVkZl/OCkMfX9RU6gLitdT8tVK9vtPcZMkPwj bGBB3r2YmqEEoj9WaAw5X95/TmdS9Xw4eXuoFYWwAHBAjg4o2RpAcofVtMyVvBGbyZjKbyJGtA/ JlEjhTxWxozzuNko+6YYr8jrdEnt1byDVYUgtcIVcMCwKoFY7vAlf4prmFV/LPq4gA4qtoZ6N4z 8V1nlyEpk/5r1Wge7qBPKcXEZUGBb8j5ZaegXFR102LSYu0ywEBMk7kFIGwiHQOi9dFAye+WvY2 uQ3mGUgRwSny81JuKY850wMEQUHl0h+Xh0EWEdfWKXSwFw1iDhbuEw4wmg1SEW X-Received: by 2002:a17:902:d58b:b0:2b7:af0e:5942 with SMTP id d9443c01a7336-2b9f25dfb17mr39796375ad.26.1777758847700; Sat, 02 May 2026 14:54:07 -0700 (PDT) Received: from d.home.yangfl.dn42 ([2a09:bac5:6619:3046::4cf:90]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2b9cae1e293sm60508315ad.45.2026.05.02.14.54.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 02 May 2026 14:54:07 -0700 (PDT) From: David Yang To: netdev@vger.kernel.org Cc: David Yang , Andrew Lunn , Vladimir Oltean , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Jamal Hadi Salim , Jiri Pirko , Simon Horman , linux-kernel@vger.kernel.org Subject: [PATCH net-next 1/3] net: sched: tbf: add extack to offload params Date: Sun, 3 May 2026 05:53:08 +0800 Message-ID: <20260502215314.917687-2-mmyangfl@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260502215314.917687-1-mmyangfl@gmail.com> References: <20260502215314.917687-1-mmyangfl@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Drivers might have error messages to propagate to user space. Propagate the netlink extack so that they can inform user space in a verbal way of their limitations. Signed-off-by: David Yang --- include/net/pkt_cls.h | 1 + net/sched/sch_tbf.c | 9 +++++++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/include/net/pkt_cls.h b/include/net/pkt_cls.h index 99ac747b7906..3bd08d7f39c1 100644 --- a/include/net/pkt_cls.h +++ b/include/net/pkt_cls.h @@ -1046,6 +1046,7 @@ struct tc_tbf_qopt_offload_replace_params { }; =20 struct tc_tbf_qopt_offload { + struct netlink_ext_ack *extack; enum tc_tbf_command command; u32 handle; u32 parent; diff --git a/net/sched/sch_tbf.c b/net/sched/sch_tbf.c index f2340164f579..4576111fe075 100644 --- a/net/sched/sch_tbf.c +++ b/net/sched/sch_tbf.c @@ -139,7 +139,8 @@ static u64 psched_ns_t2l(const struct psched_ratecfg *r, return len; } =20 -static void tbf_offload_change(struct Qdisc *sch) +static void tbf_offload_change(struct Qdisc *sch, + struct netlink_ext_ack *extack) { struct tbf_sched_data *q =3D qdisc_priv(sch); struct net_device *dev =3D qdisc_dev(sch); @@ -148,6 +149,7 @@ static void tbf_offload_change(struct Qdisc *sch) if (!tc_can_offload(dev) || !dev->netdev_ops->ndo_setup_tc) return; =20 + qopt.extack =3D extack; qopt.command =3D TC_TBF_REPLACE; qopt.handle =3D sch->handle; qopt.parent =3D sch->parent; @@ -166,6 +168,7 @@ static void tbf_offload_destroy(struct Qdisc *sch) if (!tc_can_offload(dev) || !dev->netdev_ops->ndo_setup_tc) return; =20 + qopt.extack =3D NULL; qopt.command =3D TC_TBF_DESTROY; qopt.handle =3D sch->handle; qopt.parent =3D sch->parent; @@ -176,6 +179,7 @@ static int tbf_offload_dump(struct Qdisc *sch) { struct tc_tbf_qopt_offload qopt; =20 + qopt.extack =3D NULL; qopt.command =3D TC_TBF_STATS; qopt.handle =3D sch->handle; qopt.parent =3D sch->parent; @@ -193,6 +197,7 @@ static void tbf_offload_graft(struct Qdisc *sch, struct= Qdisc *new, .parent =3D sch->parent, .child_handle =3D new->handle, .command =3D TC_TBF_GRAFT, + .extack =3D extack, }; =20 qdisc_offload_graft_helper(qdisc_dev(sch), sch, new, old, @@ -477,7 +482,7 @@ static int tbf_change(struct Qdisc *sch, struct nlattr = *opt, qdisc_put(old); err =3D 0; =20 - tbf_offload_change(sch); + tbf_offload_change(sch, extack); done: return err; } --=20 2.53.0 From nobody Sun Jun 14 06:07:15 2026 Received: from mail-pj1-f45.google.com (mail-pj1-f45.google.com [209.85.216.45]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 1EA5430EF91 for ; Sat, 2 May 2026 21:54:11 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.45 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777758853; cv=none; b=pDZw7g58FUxjX3Ec3etl/IeOh8qfITR1tlVdckz8tT43DaWgBiz1eErZHLGF9eqqSH8EVJBR6RPC+cNKwDucbWcL2NsT8fkIj9W4XQ4F5VpqNCGcLXWL1Grn3qoMEFRpIqmTLf4nWHqbEQU5iSFxOHIG7mv6Mg+c3t+u0cqnquU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777758853; c=relaxed/simple; bh=GBdaPFRBndABu+g6xyTPCYH9U8koFL/3jkPmvZnpAtQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=OsVF2h9uVJdOWLqhgNjzwsCk+Ow+pLJZyk2tEGh6jQIen8ZrsF+g5FwW+ne24MHJW0TLWYISF/FPx4d1Z0WzM/EsdlZ31LpGfJ8W0ALFUQS56+dlEU4fLNbV7j4NF7bHWD7D38038o2hgd8Wizpd3mQip3Ba4pZgZpS4CAOekWo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=o5hfW5gO; arc=none smtp.client-ip=209.85.216.45 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="o5hfW5gO" Received: by mail-pj1-f45.google.com with SMTP id 98e67ed59e1d1-3652546e41aso193442a91.1 for ; Sat, 02 May 2026 14:54:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1777758851; x=1778363651; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=h/HtMUR8y8tNvQTsqYRM6w8nnbZCwy6OiBJMOowLZxI=; b=o5hfW5gOG21dH4qgHm11/f5yasqoj160VqW7W0DSF6xbtUll/tmqQP2V95O/R2p6jj 1KG3TZf+DK8JQGGyouNAVTaphpQG4BbVMY9H8tbjtKxeCqNlt4jPdNCQ2dcic5LrgsNq POaJ1Bzsf4CqD74n248hGF49O1YGBF9jAdpvyZXQ+cKdesiOCskB3CFHNuDVE/PoLvZa Hp9EsFziMqe3U1IY0DEbEQlecsIdI6K9VSXv9C9YG3h1plFVBlPSMdkvC6wUPA5lRfYD SfGWErFmS+sYuocpII6hN4EFAZo1lcBUXmscpoaEX49OLrqmtGtEbhUh3/Jn9ysbwrGa 0/Yw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1777758851; x=1778363651; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=h/HtMUR8y8tNvQTsqYRM6w8nnbZCwy6OiBJMOowLZxI=; b=Uq4Ysgq+Php/56XUYMUmAGwQ088WdoT2PDSdTmxyo19eRmtUhKCfproYWp3qgkHmx/ eHILFuLdSN00hxBglGstKGH2AqmmTZVew2u6vkHfYKm7Y40xwvs65tNW/yPs17rApG5B LpP4fKuADps96S7SV7W4t8GScFJSFwgxhStRjrWifsRJjAfzM1S8qpBZC1OMwfGfYFj4 0elsbppQaXWcX4PtIR7jpmw+Z8sQnLD09IquEsfz1KiPXylWzCb5kHVHPZlCEeFDYHNL kq27L6SCMOhPEIuZUejor7BTUoP7nY2DUYJ8C7dHPjg5E9qAyHDSCTMSc6OsEb2YuD2k 3mxw== X-Forwarded-Encrypted: i=1; AFNElJ8e0Le9KLE0CpFi6eBuyzjAqSdBA+FwmoHvof4UQ7zZGNu9+anKPCrx8FLsTiRWqPcmIGDEk6ABwhSPbFo=@vger.kernel.org X-Gm-Message-State: AOJu0YyDtFDf2gRx07MfepQihehYs1i23N6SJ0uqrEDjYUH1PlCAhPHm mSmh5AARVlBtYomzM1OmsAm+qgslvfMlrbFZEseDv/IIn05wXjibyScR X-Gm-Gg: AeBDieubgvSRyyOTOD9tzK2TYblD1eeS9KhC+whrbwWCqpfetqxcJalUH2dTt3Wi7WW Wp+j0KC5Th5JbvmU96XTbDkEcJc5szr7McC/UVmb1666gQ/A+8rjga23nwCpZkEJR5Ei39I5w9/ SZyFeUr486AeF5H38tCwffjVGwbqVhYtKRmjQ4e3sjtQ7rOgukGWcWb+s8pqxGy3M4yl8nVypBZ Wx0MUWJVcr/X5d5vJwU/jidBNCgh26e9XG5G/uvj4ErcnVgp6yYPFnEqDjZ2TwRGp9zXcnuwn60 mfWyr20AZ1P+GBTnBul1aP/5facZijo0aLj8FCLEDq+i2AZKm+XYWMBYuoLTz9m8a0KuekuO+Y7 uNOhA2RpepP50ZpVXcNzRv8AlTbBeCgD/KrpZ6IIL7Pgz7VqzRu430XeP1PxUaQnmMr85noo/8m 5j/K+kw7BY/lWdpO2LPNNIXBGlIZAlG4fNrU4vXXK1rBO4unk7CqaqDdOj4Gnt X-Received: by 2002:a17:90b:2888:b0:35e:5ae3:2993 with SMTP id 98e67ed59e1d1-3650cecebbdmr4147392a91.15.1777758851385; Sat, 02 May 2026 14:54:11 -0700 (PDT) Received: from d.home.yangfl.dn42 ([2a09:bac5:6619:3046::4cf:90]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2b9cae1e293sm60508315ad.45.2026.05.02.14.54.08 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 02 May 2026 14:54:11 -0700 (PDT) From: David Yang To: netdev@vger.kernel.org Cc: David Yang , Andrew Lunn , Vladimir Oltean , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Jamal Hadi Salim , Jiri Pirko , Simon Horman , linux-kernel@vger.kernel.org Subject: [PATCH net-next 2/3] net: sched: tbf: pass all params to offload users Date: Sun, 3 May 2026 05:53:09 +0800 Message-ID: <20260502215314.917687-3-mmyangfl@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260502215314.917687-1-mmyangfl@gmail.com> References: <20260502215314.917687-1-mmyangfl@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Drivers might have fine-grained control over queues. Pass all available params so they can make use of them. Signed-off-by: David Yang --- include/net/pkt_cls.h | 6 +++++- net/sched/sch_tbf.c | 6 +++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/include/net/pkt_cls.h b/include/net/pkt_cls.h index 3bd08d7f39c1..d73c04e3d919 100644 --- a/include/net/pkt_cls.h +++ b/include/net/pkt_cls.h @@ -1040,8 +1040,12 @@ enum tc_tbf_command { }; =20 struct tc_tbf_qopt_offload_replace_params { + u32 limit; + u32 max_size; + s64 buffer; + s64 mtu; struct psched_ratecfg rate; - u32 max_size; + struct psched_ratecfg peak; struct gnet_stats_queue *qstats; }; =20 diff --git a/net/sched/sch_tbf.c b/net/sched/sch_tbf.c index 4576111fe075..8a1110d59dec 100644 --- a/net/sched/sch_tbf.c +++ b/net/sched/sch_tbf.c @@ -153,8 +153,12 @@ static void tbf_offload_change(struct Qdisc *sch, qopt.command =3D TC_TBF_REPLACE; qopt.handle =3D sch->handle; qopt.parent =3D sch->parent; - qopt.replace_params.rate =3D q->rate; + qopt.replace_params.limit =3D q->limit; qopt.replace_params.max_size =3D q->max_size; + qopt.replace_params.buffer =3D q->buffer; + qopt.replace_params.mtu =3D q->mtu; + qopt.replace_params.rate =3D q->rate; + qopt.replace_params.peak =3D q->peak; qopt.replace_params.qstats =3D &sch->qstats; =20 dev->netdev_ops->ndo_setup_tc(dev, TC_SETUP_QDISC_TBF, &qopt); --=20 2.53.0 From nobody Sun Jun 14 06:07:15 2026 Received: from mail-pl1-f178.google.com (mail-pl1-f178.google.com [209.85.214.178]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E13FB3A383A for ; Sat, 2 May 2026 21:54:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.178 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777758857; cv=none; b=E7K9SD/nvsIL8QB3ZSe3HJwKBJ0DOyB51K315wt6kIwLgMpl9XIDgoYWTrn7E3Vg06mLd3Ks0ITDjzlT24Yt0EkHovxYVhqFPUeANoRWiFPCctNsZwH1NY8OnI5B2dcjZFbrUj6AV9yU4sOqREiTBj5uwaiSBdZV/kEeTsL1SDI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777758857; c=relaxed/simple; bh=cRnWCMQ88GSHrKRzoEl4e2//bkZFdnLonj7I/X92Vlc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=WeAdW9582qEEXbPwq3CMR5OISEe2fu9Vz65Hbrye0uARfDZdUVLD2YDn82ZOCQgCqiHZKO0v2/PKmh03y0IqRnc9XfFNiYhk6BCLSaUAS7NIYGm2OeDyRmW+jbh0ayZrMK+UqP3ybKyCd9ciI64uRhetO0ifhZ5F72WCjjGQtws= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=c4L/sLbC; arc=none smtp.client-ip=209.85.214.178 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="c4L/sLbC" Received: by mail-pl1-f178.google.com with SMTP id d9443c01a7336-2b24fdac394so23784965ad.3 for ; Sat, 02 May 2026 14:54:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1777758855; x=1778363655; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=jTLIWvyiu4EREhHJ+YnuwMmWukQlgS0TtUJWhXuNCiw=; b=c4L/sLbCVLrA+BpVC1i4lO/G+UpE6dp7fBJiUYbxldKSYUFxK5zvI6ekBPRTOoGhy2 41YBhYaA3VrIF8sWyEg/iRsEGE65Eo5lPPvMMngsCT+AtQqorCb+rtYs1KJCHa6JcNLq HhGDJq6JULqcJCA4F6+7KixnFifXu+CLIpPOQZEHQ0IsF2PswEulaEBqZ7b/pVNY/2HY Rw07NVTy1E0WWSRL+uGhV5FcQ+GDCsakqs3KtpcJnqshCFxsEHdGJn2mbvE5AMx+AhoG si5IzmhfLEJukaylWcVLKHeNTtZOE7wuDEIRq9IAflkoWlMLxa1ZQ7C1XM6/nTX2P57Y ImLQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1777758855; x=1778363655; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=jTLIWvyiu4EREhHJ+YnuwMmWukQlgS0TtUJWhXuNCiw=; b=imk1Cc4Kb4NBDvw+ECrGOBxUQ7U/9JHEzxBPXHtivQU37d+SbVZ2nmj6P4WPmoYUrG gKjPewBd1dbkBQphC2n/Smo8oRGom0BzPErjNUMULVLi82M4Teot0FXu3Z01sLwOQ21Y pIIIsIH1RcODdppqQtN/dXEsLIedZs/aZMQTlZbjZ5x0QzEY5+704Kh7ujs0t1ZkaXx7 06UwbZebaVv86EPIEFWtmIiLkOz1wnjip2O5ToPuGzzuL+zEqn6IC08Jd4v+ir0Bmanj SLqf9ZsLBUaT8XOhXpAH6Mr/bm8w7VeryT90S6V8mmyDptsDooSJ6AJhyfJKskh+8jIj VxEA== X-Forwarded-Encrypted: i=1; AFNElJ9wTvGaNEExlXidPlqAnyg9PXsslT9iTqA6Bn+J8UtZZM7nsGPSWU1mHi2c3pKlz1qP4WgK514OveI8+2w=@vger.kernel.org X-Gm-Message-State: AOJu0Yws7sNYBmB1t8heG5MVmMeJJHlA13cynR7aq8C4V9Qc2+E2Wt+S hbww+d7vKyolbubvyfuZ5VTobl+9hhJpR3WdbbBLe8QLq2H7HlwtHDnC X-Gm-Gg: AeBDieueqwgaIWAA9BqmXPG2Hvjdjl6EIGOTgt1KAvuM6W5oeAcD9aw9MfshOOYcjnY 7WXYqYI1lqjnS+vTm13XSp9tfkpcXK/p1YUf3arAbpWRPJ8NlULSCcvVjl9pYOMTyXmEqxTZ1ty xDiFD2b1TNllgHCQH2z4qXXztNlaUWBfniEg6UaVH/CrpXmFrMod6Hn8H9LbcbBt/yE1Ol6NwN8 hY90oZ2Y0Bkg1RkrB/cD5L0pCcpbupyIKZ+mYh4GwAXI+dJvsXNOjpSvq44lzOVR/9FnPnttTGS IX0jbsui1oFR0O7MG6biClJQUgtEZfMJTz65772I1t6ve8JZVx53NK2Nbu/IfLhDFlY2+CL3HfB jylYfwDE6wRdiJDQQwqVIuKcejGN/g5HwnhVFeliIZwl3N5HMRguHH6Xzu/dKWj6g272Qepbvu5 9KDd7Gi9fltVpjAeH2zz/dvAgBNCDgRcwqLyr2pSYGfb7m4NHzSrrj4n+0iAy/ X-Received: by 2002:a17:903:2f4f:b0:2b9:cd2d:6f14 with SMTP id d9443c01a7336-2b9f25343e2mr43703005ad.2.1777758855137; Sat, 02 May 2026 14:54:15 -0700 (PDT) Received: from d.home.yangfl.dn42 ([2a09:bac5:6619:3046::4cf:90]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2b9cae1e293sm60508315ad.45.2026.05.02.14.54.11 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 02 May 2026 14:54:14 -0700 (PDT) From: David Yang To: netdev@vger.kernel.org Cc: David Yang , Andrew Lunn , Vladimir Oltean , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Jamal Hadi Salim , Jiri Pirko , Simon Horman , linux-kernel@vger.kernel.org Subject: [PATCH net-next 3/3] net: dsa: yt921x: Add port qdisc tbf support Date: Sun, 3 May 2026 05:53:10 +0800 Message-ID: <20260502215314.917687-4-mmyangfl@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260502215314.917687-1-mmyangfl@gmail.com> References: <20260502215314.917687-1-mmyangfl@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Enable port shaping and support limiting the rate of outgoing traffic. Signed-off-by: David Yang --- drivers/net/dsa/yt921x.c | 138 +++++++++++++++++++++++++++++++++++++++ drivers/net/dsa/yt921x.h | 66 ++++++++++++++++++- 2 files changed, 203 insertions(+), 1 deletion(-) diff --git a/drivers/net/dsa/yt921x.c b/drivers/net/dsa/yt921x.c index fd1fdcd5f9a3..9560fb2b8657 100644 --- a/drivers/net/dsa/yt921x.c +++ b/drivers/net/dsa/yt921x.c @@ -24,6 +24,7 @@ #include #include #include +#include =20 #include "yt921x.h" =20 @@ -1272,6 +1273,19 @@ yt921x_marker_tfm_police(struct yt921x_marker *marke= r, priv, port, extack); } =20 +static int +yt921x_marker_tfm_shape(struct yt921x_marker *marker, u64 rate, u64 burst, + unsigned int flags, bool queue, + struct yt921x_priv *priv, int port, + struct netlink_ext_ack *extack) +{ + return yt921x_marker_tfm(marker, rate, burst, flags, + queue ? priv->queue_shape_slot_ns : + priv->port_shape_slot_ns, YT921X_SHAPE_CIR_MAX, + YT921X_SHAPE_CBS_MAX, YT921X_SHAPE_UNIT_MAX, + priv, port, extack); +} + static int yt921x_police_validate(const struct flow_action_police *police, const struct flow_action *action, @@ -1378,6 +1392,115 @@ yt921x_dsa_port_policer_add(struct dsa_switch *ds, = int port, return res; } =20 +static int +yt921x_tbf_validate(struct yt921x_priv *priv, + const struct tc_tbf_qopt_offload *qopt, int *queuep) +{ + struct netlink_ext_ack *extack =3D qopt->extack; + int queue =3D -1; + + /* TODO: queue support */ + if (qopt->parent !=3D TC_H_ROOT) { + NL_SET_ERR_MSG_MOD(extack, "Parent should be \"root\""); + return -EOPNOTSUPP; + } + + switch (qopt->command) { + case TC_TBF_REPLACE: { + const struct tc_tbf_qopt_offload_replace_params *p; + + p =3D &qopt->replace_params; + + if (p->mtu || p->peak.rate_bytes_ps) { + NL_SET_ERR_MSG_MOD(extack, + "Offload not supported when mtu/peakrate is configured"); + return -EOPNOTSUPP; + } + + if (!p->rate.mpu) { + NL_SET_ERR_MSG_MOD(extack, "Assuming mpu =3D 64"); + } else if (p->rate.mpu !=3D 64) { + NL_SET_ERR_MSG_MOD(extack, + "Offload not supported when mpu is other than 64"); + return -EOPNOTSUPP; + } + + break; + } + default: + break; + } + + *queuep =3D queue; + return 0; +} + +static int +yt921x_dsa_port_setup_tc_tbf_port(struct dsa_switch *ds, int port, + const struct tc_tbf_qopt_offload *qopt) +{ + struct yt921x_priv *priv =3D to_yt921x_priv(ds); + u32 ctrls[2]; + int res; + + switch (qopt->command) { + case TC_TBF_DESTROY: + ctrls[0] =3D 0; + ctrls[1] =3D 0; + break; + case TC_TBF_REPLACE: { + const struct tc_tbf_qopt_offload_replace_params *p; + struct yt921x_marker marker; + + p =3D &qopt->replace_params; + + res =3D yt921x_marker_tfm_shape(&marker, p->rate.rate_bytes_ps, + p->max_size, + YT921X_MARKER_SINGLE_BUCKET, + false, priv, port, NULL); + if (res) + return res; + + ctrls[0] =3D YT921X_PORT_SHAPE_CTRLa_CIR(marker.cir) | + YT921X_PORT_SHAPE_CTRLa_CBS(marker.cbs); + ctrls[1] =3D YT921X_PORT_SHAPE_CTRLb_UNIT(marker.unit) | + YT921X_PORT_SHAPE_CTRLb_EN; + break; + } + default: + return -EOPNOTSUPP; + } + + mutex_lock(&priv->reg_lock); + res =3D yt921x_reg64_write(priv, YT921X_PORTn_SHAPE_CTRL(port), ctrls); + mutex_unlock(&priv->reg_lock); + + return res; +} + +static int +yt921x_dsa_port_setup_tc(struct dsa_switch *ds, int port, + enum tc_setup_type type, void *type_data) +{ + struct yt921x_priv *priv =3D to_yt921x_priv(ds); + int res; + + switch (type) { + case TC_SETUP_QDISC_TBF: { + const struct tc_tbf_qopt_offload *qopt =3D type_data; + int queue; + + res =3D yt921x_tbf_validate(priv, qopt, &queue); + if (res) + return res; + + return yt921x_dsa_port_setup_tc_tbf_port(ds, port, qopt); + } + default: + return -EOPNOTSUPP; + } +} + static int yt921x_mirror_del(struct yt921x_priv *priv, int port, bool ingress) { @@ -3524,6 +3647,20 @@ static int yt921x_chip_setup_tc(struct yt921x_priv *= priv) return res; priv->meter_slot_ns =3D ctrl * op_ns; =20 + ctrl =3D max(priv->port_shape_slot_ns / op_ns, + YT921X_PORT_SHAPE_SLOT_MIN); + res =3D yt921x_reg_write(priv, YT921X_PORT_SHAPE_SLOT, ctrl); + if (res) + return res; + priv->port_shape_slot_ns =3D ctrl * op_ns; + + ctrl =3D max(priv->queue_shape_slot_ns / op_ns, + YT921X_QUEUE_SHAPE_SLOT_MIN); + res =3D yt921x_reg_write(priv, YT921X_QUEUE_SHAPE_SLOT, ctrl); + if (res) + return res; + priv->queue_shape_slot_ns =3D ctrl * op_ns; + return 0; } =20 @@ -3680,6 +3817,7 @@ static const struct dsa_switch_ops yt921x_dsa_switch_= ops =3D { /* rate */ .port_policer_del =3D yt921x_dsa_port_policer_del, .port_policer_add =3D yt921x_dsa_port_policer_add, + .port_setup_tc =3D yt921x_dsa_port_setup_tc, /* hsr */ .port_hsr_leave =3D dsa_port_simple_hsr_leave, .port_hsr_join =3D dsa_port_simple_hsr_join, diff --git a/drivers/net/dsa/yt921x.h b/drivers/net/dsa/yt921x.h index 546b12a8994a..0114a89b58b8 100644 --- a/drivers/net/dsa/yt921x.h +++ b/drivers/net/dsa/yt921x.h @@ -521,6 +521,12 @@ enum yt921x_app_selector { #define YT921X_PORT_VLAN_CTRL1_CVLAN_DROP_TAGGED BIT(1) #define YT921X_PORT_VLAN_CTRL1_CVLAN_DROP_UNTAGGED BIT(0) =20 +#define YT921X_PORTn_PRIO_UCAST_QUEUE(port) (0x300200 + 4 * (port)) +#define YT921X_PORT_PRIOm_UCAST_QUEUE_M(m) (7 << (3 * (m))) +#define YT921X_PORT_PRIOm_UCAST_QUEUE(m, x) ((x) << (3 * (m))) +#define YT921X_PORTn_PRIO_MCAST_QUEUE(port) (0x300280 + 4 * (port)) +#define YT921X_PORT_PRIOm_MCAST_QUEUE_M(m) (3 << (2 * (m))) +#define YT921X_PORT_PRIOm_MCAST_QUEUE(m, x) ((x) << (2 * (m))) #define YT921X_MIRROR 0x300300 #define YT921X_MIRROR_IGR_PORTS_M GENMASK(26, 16) #define YT921X_MIRROR_IGR_PORTS(x) FIELD_PREP(YT921X_MIRROR_IGR_PORTS_= M, (x)) @@ -531,6 +537,48 @@ enum yt921x_app_selector { #define YT921X_MIRROR_PORT_M GENMASK(3, 0) #define YT921X_MIRROR_PORT(x) FIELD_PREP(YT921X_MIRROR_PORT_M, (x)) =20 +#define YT921X_QUEUE_SHAPE_SLOT 0x340008 +#define YT921X_QUEUE_SHAPE_SLOT_SLOT_M GENMASK(11, 0) +#define YT921X_PORT_SHAPE_SLOT 0x34000c +#define YT921X_PORT_SHAPE_SLOT_SLOT_M GENMASK(11, 0) +#define YT921X_QUEUEn_SCH(x) (0x341000 + 4 * (x)) +#define YT921X_QUEUE_SCH_E_DWRR_M GENMASK(27, 18) +#define YT921X_QUEUE_SCH_E_DWRR(x) FIELD_PREP(YT921X_QUEUE_SCH_E_DWRR_= M, (x)) +#define YT921X_QUEUE_SCH_C_DWRR_M GENMASK(17, 8) +#define YT921X_QUEUE_SCH_C_DWRR(x) FIELD_PREP(YT921X_QUEUE_SCH_C_DWRR_= M, (x)) +#define YT921X_QUEUE_SCH_E_PRIO_M GENMASK(7, 4) +#define YT921X_QUEUE_SCH_E_PRIO(x) FIELD_PREP(YT921X_QUEUE_SCH_E_PRIO_= M, (x)) +#define YT921X_QUEUE_SCH_C_PRIO_M GENMASK(3, 0) +#define YT921X_QUEUE_SCH_C_PRIO(x) FIELD_PREP(YT921X_QUEUE_SCH_C_PRIO_= M, (x)) +#define YT921X_C_DWRRn(x) (0x342000 + 4 * (x)) +#define YT921X_E_DWRRn(x) (0x343000 + 4 * (x)) +#define YT921X_DWRR_PKT_MODE BIT(0) /* 0: byte rate mode */ +#define YT921X_QUEUEn_SHAPE_CTRL(x) (0x34c000 + 0x10 * (x)) +#define YT921X_QUEUE_SHAPE_CTRLc_TOKEN_OVERFLOW_EN BIT(6) +#define YT921X_QUEUE_SHAPE_CTRLc_E_EN BIT(5) +#define YT921X_QUEUE_SHAPE_CTRLc_C_EN BIT(4) +#define YT921X_QUEUE_SHAPE_CTRLc_PKT_MODE BIT(3) /* 0: byte rate mode */ +#define YT921X_QUEUE_SHAPE_CTRLc_UNIT_M GENMASK(2, 0) +#define YT921X_QUEUE_SHAPE_CTRLc_UNIT(x) FIELD_PREP(YT921X_QUEUE_SHAPE_= CTRLc_UNIT_M, (x)) +#define YT921X_QUEUE_SHAPE_CTRLb_EBS_M GENMASK(31, 18) +#define YT921X_QUEUE_SHAPE_CTRLb_EBS(x) FIELD_PREP(YT921X_QUEUE_SHAPE_C= TRLb_EBS_M, (x)) +#define YT921X_QUEUE_SHAPE_CTRLb_EIR_M GENMASK(17, 0) +#define YT921X_QUEUE_SHAPE_CTRLb_EIR(x) FIELD_PREP(YT921X_QUEUE_SHAPE_C= TRLb_EIR_M, (x)) +#define YT921X_QUEUE_SHAPE_CTRLa_CBS_M GENMASK(31, 18) +#define YT921X_QUEUE_SHAPE_CTRLa_CBS(x) FIELD_PREP(YT921X_QUEUE_SHAPE_C= TRLa_CBS_M, (x)) +#define YT921X_QUEUE_SHAPE_CTRLa_CIR_M GENMASK(17, 0) +#define YT921X_QUEUE_SHAPE_CTRLa_CIR(x) FIELD_PREP(YT921X_QUEUE_SHAPE_C= TRLa_CIR_M, (x)) +#define YT921X_PORTn_SHAPE_CTRL(port) (0x354000 + 8 * (port)) +#define YT921X_PORT_SHAPE_CTRLb_EN BIT(4) +#define YT921X_PORT_SHAPE_CTRLb_PKT_MODE BIT(3) /* 0: byte rate mode */ +#define YT921X_PORT_SHAPE_CTRLb_UNIT_M GENMASK(2, 0) +#define YT921X_PORT_SHAPE_CTRLb_UNIT(x) FIELD_PREP(YT921X_PORT_SHAPE_CT= RLb_UNIT_M, (x)) +#define YT921X_PORT_SHAPE_CTRLa_CBS_M GENMASK(31, 18) +#define YT921X_PORT_SHAPE_CTRLa_CBS(x) FIELD_PREP(YT921X_PORT_SHAPE_CTR= La_CBS_M, (x)) +#define YT921X_PORT_SHAPE_CTRLa_CIR_M GENMASK(17, 0) +#define YT921X_PORT_SHAPE_CTRLa_CIR(x) FIELD_PREP(YT921X_PORT_SHAPE_CTR= La_CIR_M, (x)) +#define YT921X_PORTn_SHAPE_STAT(port) (0x356000 + 4 * (port)) + #define YT921X_EDATA_EXTMODE 0xfb #define YT921X_EDATA_LEN 0x100 =20 @@ -556,6 +604,11 @@ enum yt921x_fdb_entry_status { #define YT921X_METER_UNIT_MAX ((1 << 3) - 1) #define YT921X_METER_CIR_MAX ((1 << 18) - 1) #define YT921X_METER_CBS_MAX ((1 << 16) - 1) +#define YT921X_PORT_SHAPE_SLOT_MIN 80 +#define YT921X_QUEUE_SHAPE_SLOT_MIN 132 +#define YT921X_SHAPE_UNIT_MAX ((1 << 3) - 1) +#define YT921X_SHAPE_CIR_MAX ((1 << 18) - 1) +#define YT921X_SHAPE_CBS_MAX ((1 << 14) - 1) =20 #define YT921X_LAG_NUM 2 #define YT921X_LAG_PORT_NUM 4 @@ -573,7 +626,16 @@ enum yt921x_fdb_entry_status { #define YT921X_TAG_LEN 8 =20 /* 8 internal + 2 external + 1 mcu */ -#define YT921X_PORT_NUM 11 +#define YT921X_PORT_NUM 11 +#define YT921X_UCAST_QUEUE_NUM 8 +#define YT921X_MCAST_QUEUE_NUM 4 +#define YT921X_PORT_QUEUE_NUM \ + (YT921X_UCAST_QUEUE_NUM + YT921X_MCAST_QUEUE_NUM) +#define YT921X_UCAST_QUEUE_ID(port, queue) \ + (YT921X_UCAST_QUEUE_NUM * (port) + (queue)) +#define YT921X_MCAST_QUEUE_ID(port, queue) \ + (YT921X_UCAST_QUEUE_NUM * YT921X_PORT_NUM + \ + YT921X_MCAST_QUEUE_NUM * (port) + (queue)) =20 #define yt921x_port_is_internal(port) ((port) < 8) #define yt921x_port_is_external(port) (8 <=3D (port) && (port) < 9) @@ -652,6 +714,8 @@ struct yt921x_priv { =20 const struct yt921x_info *info; unsigned int meter_slot_ns; + unsigned int port_shape_slot_ns; + unsigned int queue_shape_slot_ns; /* cache of dsa_cpu_ports(ds) */ u16 cpu_ports_mask; unsigned char cycle_ns; --=20 2.53.0