* [PATCH net-next v3 0/3] netdevsim: support ETS offload
@ 2026-03-17 15:06 Davide Caratti
2026-03-17 15:06 ` [PATCH net-next v3 1/3] netdevsim: move TC offload code to a dedicated file Davide Caratti
` (2 more replies)
0 siblings, 3 replies; 6+ messages in thread
From: Davide Caratti @ 2026-03-17 15:06 UTC (permalink / raw)
To: Jakub Kicinski, Andrew Lunn, David S. Miller, Eric Dumazet,
Paolo Abeni, Jamal Hadi Salim, Victor Nogueira, Jiri Pirko
Cc: netdev
- patch 1 moves netdevsim tc offloads to a dedicated file
- patch 2 enables ETS offload on netdevsim
- patch 3 is a tdc test for ets offload on netdevsim
v2: don't use x-macro (Jakub Kicinski)
v3: move function declaration from the bottom of netdevsim.h (Jakub Kicinski)
Davide Caratti (3):
netdevsim: move TC offload code to a dedicated file
netdevsim: support tc-ets offload
tc-testing: add a test case for ETS offload
drivers/net/netdevsim/Makefile | 2 +-
drivers/net/netdevsim/netdev.c | 51 ------------
drivers/net/netdevsim/netdevsim.h | 3 +
drivers/net/netdevsim/tc.c | 79 +++++++++++++++++++
.../tc-testing/tc-tests/qdiscs/ets.json | 23 ++++++
5 files changed, 106 insertions(+), 52 deletions(-)
create mode 100644 drivers/net/netdevsim/tc.c
--
2.52.0
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH net-next v3 1/3] netdevsim: move TC offload code to a dedicated file
2026-03-17 15:06 [PATCH net-next v3 0/3] netdevsim: support ETS offload Davide Caratti
@ 2026-03-17 15:06 ` Davide Caratti
2026-03-17 15:06 ` [PATCH net-next v3 2/3] netdevsim: support tc-ets offload Davide Caratti
2026-03-17 15:06 ` [PATCH net-next v3 3/3] tc-testing: add a test case for ETS offload Davide Caratti
2 siblings, 0 replies; 6+ messages in thread
From: Davide Caratti @ 2026-03-17 15:06 UTC (permalink / raw)
To: Jakub Kicinski, Andrew Lunn, David S. Miller, Eric Dumazet,
Paolo Abeni, Jamal Hadi Salim, Victor Nogueira, Jiri Pirko
Cc: netdev
This commit has no functional change.
Reviewed-by: Jamal Hadi Salim <jhs@mojatatu.com>
Signed-off-by: Davide Caratti <dcaratti@redhat.com>
---
drivers/net/netdevsim/Makefile | 2 +-
drivers/net/netdevsim/netdev.c | 51 ---------------------------
drivers/net/netdevsim/netdevsim.h | 3 ++
drivers/net/netdevsim/tc.c | 57 +++++++++++++++++++++++++++++++
4 files changed, 61 insertions(+), 52 deletions(-)
create mode 100644 drivers/net/netdevsim/tc.c
diff --git a/drivers/net/netdevsim/Makefile b/drivers/net/netdevsim/Makefile
index 14a553e000ec..87718204fb4d 100644
--- a/drivers/net/netdevsim/Makefile
+++ b/drivers/net/netdevsim/Makefile
@@ -3,7 +3,7 @@
obj-$(CONFIG_NETDEVSIM) += netdevsim.o
netdevsim-objs := \
- netdev.o dev.o ethtool.o fib.o bus.o health.o hwstats.o udp_tunnels.o
+ netdev.o dev.o ethtool.o fib.o bus.o health.o hwstats.o udp_tunnels.o tc.o
ifeq ($(CONFIG_BPF_SYSCALL),y)
netdevsim-objs += \
diff --git a/drivers/net/netdevsim/netdev.c b/drivers/net/netdevsim/netdev.c
index 5ec028a00c62..1dc2f8c0695d 100644
--- a/drivers/net/netdevsim/netdev.c
+++ b/drivers/net/netdevsim/netdev.c
@@ -199,12 +199,6 @@ static int nsim_change_mtu(struct net_device *dev, int new_mtu)
return 0;
}
-static int
-nsim_setup_tc_block_cb(enum tc_setup_type type, void *type_data, void *cb_priv)
-{
- return nsim_bpf_setup_tc_block_cb(type, type_data, cb_priv);
-}
-
static int nsim_set_vf_mac(struct net_device *dev, int vf, u8 *mac)
{
struct netdevsim *ns = netdev_priv(dev);
@@ -335,51 +329,6 @@ static int nsim_set_vf_link_state(struct net_device *dev, int vf, int state)
return 0;
}
-static void nsim_taprio_stats(struct tc_taprio_qopt_stats *stats)
-{
- stats->window_drops = 0;
- stats->tx_overruns = 0;
-}
-
-static int nsim_setup_tc_taprio(struct net_device *dev,
- struct tc_taprio_qopt_offload *offload)
-{
- int err = 0;
-
- switch (offload->cmd) {
- case TAPRIO_CMD_REPLACE:
- case TAPRIO_CMD_DESTROY:
- break;
- case TAPRIO_CMD_STATS:
- nsim_taprio_stats(&offload->stats);
- break;
- default:
- err = -EOPNOTSUPP;
- }
-
- return err;
-}
-
-static LIST_HEAD(nsim_block_cb_list);
-
-static int
-nsim_setup_tc(struct net_device *dev, enum tc_setup_type type, void *type_data)
-{
- struct netdevsim *ns = netdev_priv(dev);
-
- switch (type) {
- case TC_SETUP_QDISC_TAPRIO:
- return nsim_setup_tc_taprio(dev, type_data);
- case TC_SETUP_BLOCK:
- return flow_block_cb_setup_simple(type_data,
- &nsim_block_cb_list,
- nsim_setup_tc_block_cb,
- ns, ns, true);
- default:
- return -EOPNOTSUPP;
- }
-}
-
static int
nsim_set_features(struct net_device *dev, netdev_features_t features)
{
diff --git a/drivers/net/netdevsim/netdevsim.h b/drivers/net/netdevsim/netdevsim.h
index f767fc8a7505..c904e14f6b3f 100644
--- a/drivers/net/netdevsim/netdevsim.h
+++ b/drivers/net/netdevsim/netdevsim.h
@@ -455,6 +455,9 @@ static inline void
nsim_psp_handle_ext(struct sk_buff *skb, struct skb_ext *psp_ext) {}
#endif
+int nsim_setup_tc(struct net_device *dev, enum tc_setup_type type,
+ void *type_data);
+
struct nsim_bus_dev {
struct device dev;
struct list_head list;
diff --git a/drivers/net/netdevsim/tc.c b/drivers/net/netdevsim/tc.c
new file mode 100644
index 000000000000..8a1960f5f99e
--- /dev/null
+++ b/drivers/net/netdevsim/tc.c
@@ -0,0 +1,57 @@
+// SPDX-License-Identifier: GPL-2.0
+
+#include <linux/netdevice.h>
+#include <net/pkt_sched.h>
+
+#include "netdevsim.h"
+
+static int
+nsim_setup_tc_block_cb(enum tc_setup_type type, void *type_data, void *cb_priv)
+{
+ return nsim_bpf_setup_tc_block_cb(type, type_data, cb_priv);
+}
+
+static void nsim_taprio_stats(struct tc_taprio_qopt_stats *stats)
+{
+ stats->window_drops = 0;
+ stats->tx_overruns = 0;
+}
+
+static int nsim_setup_tc_taprio(struct net_device *dev,
+ struct tc_taprio_qopt_offload *offload)
+{
+ int err = 0;
+
+ switch (offload->cmd) {
+ case TAPRIO_CMD_REPLACE:
+ case TAPRIO_CMD_DESTROY:
+ break;
+ case TAPRIO_CMD_STATS:
+ nsim_taprio_stats(&offload->stats);
+ break;
+ default:
+ err = -EOPNOTSUPP;
+ }
+
+ return err;
+}
+
+static LIST_HEAD(nsim_block_cb_list);
+
+int
+nsim_setup_tc(struct net_device *dev, enum tc_setup_type type, void *type_data)
+{
+ struct netdevsim *ns = netdev_priv(dev);
+
+ switch (type) {
+ case TC_SETUP_QDISC_TAPRIO:
+ return nsim_setup_tc_taprio(dev, type_data);
+ case TC_SETUP_BLOCK:
+ return flow_block_cb_setup_simple(type_data,
+ &nsim_block_cb_list,
+ nsim_setup_tc_block_cb,
+ ns, ns, true);
+ default:
+ return -EOPNOTSUPP;
+ }
+}
--
2.52.0
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH net-next v3 2/3] netdevsim: support tc-ets offload
2026-03-17 15:06 [PATCH net-next v3 0/3] netdevsim: support ETS offload Davide Caratti
2026-03-17 15:06 ` [PATCH net-next v3 1/3] netdevsim: move TC offload code to a dedicated file Davide Caratti
@ 2026-03-17 15:06 ` Davide Caratti
2026-03-17 15:06 ` [PATCH net-next v3 3/3] tc-testing: add a test case for ETS offload Davide Caratti
2 siblings, 0 replies; 6+ messages in thread
From: Davide Caratti @ 2026-03-17 15:06 UTC (permalink / raw)
To: Jakub Kicinski, Andrew Lunn, David S. Miller, Eric Dumazet,
Paolo Abeni, Jamal Hadi Salim, Victor Nogueira, Jiri Pirko
Cc: netdev
Extend netdevsim to accept ndo_setup_tc(TC_SETUP_QDISC_ETS) calls, so that
it's possible to run tdc on ETS offload code path.
Reviewed-by: Jamal Hadi Salim <jhs@mojatatu.com>
Signed-off-by: Davide Caratti <dcaratti@redhat.com>
---
drivers/net/netdevsim/tc.c | 22 ++++++++++++++++++++++
1 file changed, 22 insertions(+)
diff --git a/drivers/net/netdevsim/tc.c b/drivers/net/netdevsim/tc.c
index 8a1960f5f99e..8f013a5895a2 100644
--- a/drivers/net/netdevsim/tc.c
+++ b/drivers/net/netdevsim/tc.c
@@ -2,6 +2,7 @@
#include <linux/netdevice.h>
#include <net/pkt_sched.h>
+#include <net/pkt_cls.h>
#include "netdevsim.h"
@@ -36,6 +37,25 @@ static int nsim_setup_tc_taprio(struct net_device *dev,
return err;
}
+static int nsim_setup_tc_ets(struct net_device *dev,
+ struct tc_ets_qopt_offload *offload)
+{
+ int err = 0;
+
+ switch (offload->command) {
+ case TC_ETS_REPLACE:
+ case TC_ETS_DESTROY:
+ break;
+ case TC_ETS_STATS:
+ _bstats_update(offload->stats.bstats, 0, 0);
+ break;
+ default:
+ err = -EOPNOTSUPP;
+ }
+
+ return err;
+}
+
static LIST_HEAD(nsim_block_cb_list);
int
@@ -46,6 +66,8 @@ nsim_setup_tc(struct net_device *dev, enum tc_setup_type type, void *type_data)
switch (type) {
case TC_SETUP_QDISC_TAPRIO:
return nsim_setup_tc_taprio(dev, type_data);
+ case TC_SETUP_QDISC_ETS:
+ return nsim_setup_tc_ets(dev, type_data);
case TC_SETUP_BLOCK:
return flow_block_cb_setup_simple(type_data,
&nsim_block_cb_list,
--
2.52.0
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH net-next v3 3/3] tc-testing: add a test case for ETS offload
2026-03-17 15:06 [PATCH net-next v3 0/3] netdevsim: support ETS offload Davide Caratti
2026-03-17 15:06 ` [PATCH net-next v3 1/3] netdevsim: move TC offload code to a dedicated file Davide Caratti
2026-03-17 15:06 ` [PATCH net-next v3 2/3] netdevsim: support tc-ets offload Davide Caratti
@ 2026-03-17 15:06 ` Davide Caratti
2026-03-18 15:26 ` Victor Nogueira
2 siblings, 1 reply; 6+ messages in thread
From: Davide Caratti @ 2026-03-17 15:06 UTC (permalink / raw)
To: Jakub Kicinski, Andrew Lunn, David S. Miller, Eric Dumazet,
Paolo Abeni, Jamal Hadi Salim, Victor Nogueira, Jiri Pirko
Cc: netdev
While reviewing the fix for unintentional u32 overflows in ets offload
code, Jamal said:
[...]
> otherwise a tdc test should cover it fine (when you get to the
> netdevsim change perhaps)
Add a test case to reproduce the division by zero fixed in [1].
[1] https://lore.kernel.org/all/CAM0EoMm17wsYZmdFLshH3_-GrZtzd=i0xnoO2yiVB=-N4761mw@mail.gmail.com/
Suggested-by: Jamal Hadi Salim <jhs@mojatatu.com>
Reviewed-by: Jamal Hadi Salim <jhs@mojatatu.com>
Reviewed-by: Victor Nogueira <victor@mojatatu.com>
Signed-off-by: Davide Caratti <dcaratti@redhat.com>
---
.../tc-testing/tc-tests/qdiscs/ets.json | 23 +++++++++++++++++++
1 file changed, 23 insertions(+)
diff --git a/tools/testing/selftests/tc-testing/tc-tests/qdiscs/ets.json b/tools/testing/selftests/tc-testing/tc-tests/qdiscs/ets.json
index a5d94cdec605..479b866031bb 100644
--- a/tools/testing/selftests/tc-testing/tc-tests/qdiscs/ets.json
+++ b/tools/testing/selftests/tc-testing/tc-tests/qdiscs/ets.json
@@ -984,5 +984,28 @@
"matchCount": "1",
"teardown": [
]
+ },
+ {
+ "id": "41f5",
+ "name": "ETS offload where the sum of quanta wraps u32",
+ "category": [
+ "qdisc",
+ "ets"
+ ],
+ "plugins": {
+ "requires": "nsPlugin"
+ },
+ "setup": [
+ "echo \"1 1 4\" > /sys/bus/netdevsim/new_device",
+ "ethtool -K $ETH hw-tc-offload on"
+ ],
+ "cmdUnderTest": "$TC qdisc add dev $ETH root ets quanta 4294967294 1 1",
+ "expExitCode": "0",
+ "verifyCmd": "$TC qdisc show dev $ETH",
+ "matchPattern": "qdisc ets .*bands 3 quanta 4294967294 1 1",
+ "matchCount": "1",
+ "teardown": [
+ "echo \"1\" > /sys/bus/netdevsim/del_device"
+ ]
}
]
--
2.52.0
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH net-next v3 3/3] tc-testing: add a test case for ETS offload
2026-03-17 15:06 ` [PATCH net-next v3 3/3] tc-testing: add a test case for ETS offload Davide Caratti
@ 2026-03-18 15:26 ` Victor Nogueira
2026-03-18 16:33 ` Davide Caratti
0 siblings, 1 reply; 6+ messages in thread
From: Victor Nogueira @ 2026-03-18 15:26 UTC (permalink / raw)
To: Davide Caratti
Cc: Jakub Kicinski, Andrew Lunn, David S. Miller, Eric Dumazet,
Paolo Abeni, Jamal Hadi Salim, Jiri Pirko, netdev
[-- Attachment #1: Type: text/plain, Size: 1172 bytes --]
On Tue, Mar 17, 2026 at 12:11 PM Davide Caratti <dcaratti@redhat.com> wrote:
>
> While reviewing the fix for unintentional u32 overflows in ets offload
> code, Jamal said:
>
> [...]
>
> > otherwise a tdc test should cover it fine (when you get to the
> > netdevsim change perhaps)
>
> Add a test case to reproduce the division by zero fixed in [1].
>
> [1] https://lore.kernel.org/all/CAM0EoMm17wsYZmdFLshH3_-GrZtzd=i0xnoO2yiVB=-N4761mw@mail.gmail.com/
>
> Suggested-by: Jamal Hadi Salim <jhs@mojatatu.com>
> Reviewed-by: Jamal Hadi Salim <jhs@mojatatu.com>
> Reviewed-by: Victor Nogueira <victor@mojatatu.com>
> Signed-off-by: Davide Caratti <dcaratti@redhat.com>
Sorry for not noticing this earlier.
I tried some approaches with Jamal to avoid changing your patch,
but changing it seems to be the cleanest way to do this.
The issue is that tdc overwrites the environment when running
the shell command from python so it can't find ethtool.
We believe the cleanest approach here is to specify
ethtool's path in tdc_config.py (as is done with tc and ip).
Am sending a proposed change as an attached diff in this
reply.
cheers,
Victor
[-- Attachment #2: ethtool_env_def.diff --]
[-- Type: text/x-patch, Size: 1853 bytes --]
diff --git a/tools/testing/selftests/tc-testing/tc-tests/qdiscs/ets.json b/tools/testing/selftests/tc-testing/tc-tests/qdiscs/ets.json
index 479b866031bb..ee09e6d6fdf3 100644
--- a/tools/testing/selftests/tc-testing/tc-tests/qdiscs/ets.json
+++ b/tools/testing/selftests/tc-testing/tc-tests/qdiscs/ets.json
@@ -997,7 +997,7 @@
},
"setup": [
"echo \"1 1 4\" > /sys/bus/netdevsim/new_device",
- "ethtool -K $ETH hw-tc-offload on"
+ "$ETHTOOL -K $ETH hw-tc-offload on"
],
"cmdUnderTest": "$TC qdisc add dev $ETH root ets quanta 4294967294 1 1",
"expExitCode": "0",
diff --git a/tools/testing/selftests/tc-testing/tdc.py b/tools/testing/selftests/tc-testing/tdc.py
index 4f255cec0c22..81b4ac3f050c 100755
--- a/tools/testing/selftests/tc-testing/tdc.py
+++ b/tools/testing/selftests/tc-testing/tdc.py
@@ -755,6 +755,9 @@ def check_default_settings(args, remaining, pm):
NAMES['DEV2'] = args.device
if 'TIMEOUT' not in NAMES:
NAMES['TIMEOUT'] = None
+ if 'ETHTOOL' in NAMES and not os.path.isfile(NAMES['ETHTOOL']):
+ print(f"The specified ethtool path {NAMES['ETHTOOL']} does not exist.")
+ exit(1)
if not os.path.isfile(NAMES['TC']):
print("The specified tc path " + NAMES['TC'] + " does not exist.")
exit(1)
diff --git a/tools/testing/selftests/tc-testing/tdc_config.py b/tools/testing/selftests/tc-testing/tdc_config.py
index ccb0f06ef9e3..9488b03cbc2c 100644
--- a/tools/testing/selftests/tc-testing/tdc_config.py
+++ b/tools/testing/selftests/tc-testing/tdc_config.py
@@ -17,6 +17,7 @@ NAMES = {
'DEV1': 'v0p1',
'DEV2': '',
'DUMMY': 'dummy1',
+ 'ETHTOOL': '/usr/sbin/ethtool',
'ETH': 'eth0',
'BATCH_FILE': './batch.txt',
'BATCH_DIR': 'tmp',
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH net-next v3 3/3] tc-testing: add a test case for ETS offload
2026-03-18 15:26 ` Victor Nogueira
@ 2026-03-18 16:33 ` Davide Caratti
0 siblings, 0 replies; 6+ messages in thread
From: Davide Caratti @ 2026-03-18 16:33 UTC (permalink / raw)
To: Victor Nogueira
Cc: Jakub Kicinski, Andrew Lunn, David S. Miller, Eric Dumazet,
Paolo Abeni, Jamal Hadi Salim, Jiri Pirko, netdev
On Wed, Mar 18, 2026 at 12:26:25PM -0300, Victor Nogueira wrote:
> On Tue, Mar 17, 2026 at 12:11 PM Davide Caratti <dcaratti@redhat.com> wrote:
> >
> > While reviewing the fix for unintentional u32 overflows in ets offload
> > code, Jamal said:
> >
> > [...]
> >
> > > otherwise a tdc test should cover it fine (when you get to the
> > > netdevsim change perhaps)
> >
> > Add a test case to reproduce the division by zero fixed in [1].
> >
> > [1] https://lore.kernel.org/all/CAM0EoMm17wsYZmdFLshH3_-GrZtzd=i0xnoO2yiVB=-N4761mw@mail.gmail.com/
> >
> > Suggested-by: Jamal Hadi Salim <jhs@mojatatu.com>
> > Reviewed-by: Jamal Hadi Salim <jhs@mojatatu.com>
> > Reviewed-by: Victor Nogueira <victor@mojatatu.com>
> > Signed-off-by: Davide Caratti <dcaratti@redhat.com>
hello Victor, thanks for investigating!
> Sorry for not noticing this earlier.
> I tried some approaches with Jamal to avoid changing your patch,
> but changing it seems to be the cleanest way to do this.
> The issue is that tdc overwrites the environment when running
> the shell command from python so it can't find ethtool.
> We believe the cleanest approach here is to specify
> ethtool's path in tdc_config.py (as is done with tc and ip).
> Am sending a proposed change as an attached diff in this
> reply.
[...]
> diff --git a/tools/testing/selftests/tc-testing/tdc_config.py b/tools/testing/selftests/tc-testing/tdc_config.py
> index ccb0f06ef9e3..9488b03cbc2c 100644
> --- a/tools/testing/selftests/tc-testing/tdc_config.py
> +++ b/tools/testing/selftests/tc-testing/tdc_config.py
> @@ -17,6 +17,7 @@ NAMES = {
> 'DEV1': 'v0p1',
> 'DEV2': '',
> 'DUMMY': 'dummy1',
> + 'ETHTOOL': '/usr/sbin/ethtool',
> 'ETH': 'eth0',
> 'BATCH_FILE': './batch.txt',
> 'BATCH_DIR': 'tmp',
I see, and maybe now understand why I didn't see this problem before. My
fedora test setup does:
root@localhost:net# which ethtool
/usr/bin/ethtool
and inside virtme-ng:
root@virtme-ng:net# which ethtool
/bin/ethtool
Moreover {,/usr}/sbin is a symlink because of [1], so it always finds
ethtool _ and would find ethtool also with the $ETHTOOL assignment
you did above; I'm ok for editing patch 3/3 adding the above hunks.
--
davide
[1] https://fedoraproject.org/wiki/Changes/Unify_bin_and_sbin
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2026-03-18 16:33 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-03-17 15:06 [PATCH net-next v3 0/3] netdevsim: support ETS offload Davide Caratti
2026-03-17 15:06 ` [PATCH net-next v3 1/3] netdevsim: move TC offload code to a dedicated file Davide Caratti
2026-03-17 15:06 ` [PATCH net-next v3 2/3] netdevsim: support tc-ets offload Davide Caratti
2026-03-17 15:06 ` [PATCH net-next v3 3/3] tc-testing: add a test case for ETS offload Davide Caratti
2026-03-18 15:26 ` Victor Nogueira
2026-03-18 16:33 ` Davide Caratti
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox