diff options
| author | Jakub Kicinski <kuba@kernel.org> | 2026-03-21 06:13:16 +0300 |
|---|---|---|
| committer | Jakub Kicinski <kuba@kernel.org> | 2026-03-21 06:13:17 +0300 |
| commit | fb78a629b4f0eb399b413f6c093a3da177b3a4eb (patch) | |
| tree | e74d085ed304bc7137e0eff4f5f9a4a6c0bc32c6 /drivers/net/netdevsim | |
| parent | 53edd8309570517137d58e3644976843b817179c (diff) | |
| parent | 5754a1c9f9b6e298791c4bb34263f37dfe93ee35 (diff) | |
| download | linux-fb78a629b4f0eb399b413f6c093a3da177b3a4eb.tar.xz | |
Merge branch 'netdevsim-support-ets-offload'
Davide Caratti says:
====================
netdevsim: support ETS offload
- 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
====================
Link: https://patch.msgid.link/cover.1773945414.git.dcaratti@redhat.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Diffstat (limited to 'drivers/net/netdevsim')
| -rw-r--r-- | drivers/net/netdevsim/Makefile | 2 | ||||
| -rw-r--r-- | drivers/net/netdevsim/netdev.c | 51 | ||||
| -rw-r--r-- | drivers/net/netdevsim/netdevsim.h | 3 | ||||
| -rw-r--r-- | drivers/net/netdevsim/tc.c | 79 |
4 files changed, 83 insertions, 52 deletions
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 3645ebde049a..c71b8d116f18 100644 --- a/drivers/net/netdevsim/netdev.c +++ b/drivers/net/netdevsim/netdev.c @@ -202,12 +202,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); @@ -338,51 +332,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..8f013a5895a2 --- /dev/null +++ b/drivers/net/netdevsim/tc.c @@ -0,0 +1,79 @@ +// SPDX-License-Identifier: GPL-2.0 + +#include <linux/netdevice.h> +#include <net/pkt_sched.h> +#include <net/pkt_cls.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 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 +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_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, + nsim_setup_tc_block_cb, + ns, ns, true); + default: + return -EOPNOTSUPP; + } +} |
