ethtool: track custom RSS contexts in the core
Subsystems (8)
cover ethtool: track custom RSS contexts in the core
From: Edward Cree <[email protected]>
Make the core responsible for tracking the set of custom RSS contexts,
their IDs, indirection tables, hash keys, and hash functions; this lets us get rid of duplicative code in drivers, and will allow us to support netlink dumps later.
This series only moves the sfc EF10 driver over to the new API; if the
design is approved of, I plan to add patches to convert the other drivers and remove the legacy API. (However, I don't have hardware for the drivers besides sfc, so I won't be able to test those myself.)
Edward Cree (6):
net: ethtool: attach an IDR of custom RSS contexts to a netdevice
net: ethtool: record custom RSS contexts in the IDR
net: ethtool: let the core choose RSS context IDs
net: ethtool: pass ctx_priv and create into .set_rxfh_context
net: ethtool: add a mutex protecting RSS contexts
sfc: use new .set_rxfh_context API
.../net/ethernet/marvell/mvpp2/mvpp2_main.c | 2 +- .../marvell/octeontx2/nic/otx2_ethtool.c | 2 +- .../ethernet/mellanox/mlx5/core/en_ethtool.c | 2 +- drivers/net/ethernet/sfc/ef10.c | 2 +- drivers/net/ethernet/sfc/efx.c | 2 +- drivers/net/ethernet/sfc/efx.h | 2 +- drivers/net/ethernet/sfc/efx_common.c | 10 +- drivers/net/ethernet/sfc/ethtool_common.c | 96 ++++++------- drivers/net/ethernet/sfc/ethtool_common.h | 4 +- drivers/net/ethernet/sfc/mcdi_filters.c | 131 +++++++++--------- drivers/net/ethernet/sfc/mcdi_filters.h | 8 +- drivers/net/ethernet/sfc/net_driver.h | 28 ++-- drivers/net/ethernet/sfc/rx_common.c | 64 ++------- drivers/net/ethernet/sfc/rx_common.h | 8 +- drivers/net/ethernet/sfc/siena/ethtool.c | 2 +- include/linux/ethtool.h | 66 ++++++++- include/linux/netdevice.h | 8 ++ net/core/dev.c | 36 +++++ net/ethtool/ioctl.c | 107 +++++++++++++- 19 files changed, 359 insertions(+), 221 deletions(-)
RFC PATCH 1/6 net: ethtool: attach an IDR of custom RSS contexts to a netdevice
From: Edward Cree <[email protected]>
Each context stores the RXFH settings (indir, key, and hfunc) as well
as optionally some driver private data.
Delete any still-existing contexts at netdev unregister time.
--- include/linux/ethtool.h | 33 +++++++++++++++++++++++++++++++++ include/linux/netdevice.h | 5 +++++ net/core/dev.c | 23 +++++++++++++++++++++++ 3 files changed, 61 insertions(+)
include/linux/ethtool.h +33 -0
@@ -157,6 +157,39 @@ static inline u32 ethtool_rxfh_indir_default(u32 index, u32 n_rx_rings)return index % n_rx_rings; } +/** +* struct ethtool_rxfh_context - a custom RSS context configuration +* @indir_size: Number of u32 entries in indirection table +* @key_size: Size of hash key, in bytes +* @hfunc: RSS hash function identifier. One of the %ETH_RSS_HASH_* +* @priv_size: Size of driver private data, in bytes +*/ +struct ethtool_rxfh_context { +u32 indir_size; +u32 key_size; +u8 hfunc; +u16 priv_size; +/* private: indirection table, hash key, and driver private data are +* stored sequentially in @data area. Use below helpers to access +*/ +u8 data[]; +}; + +static inline u32 *ethtool_rxfh_context_indir (struct ethtool_rxfh_context *ctx) +{ +return (u32 *)&ctx->data; +} + +static inline u8 *ethtool_rxfh_context_key (struct ethtool_rxfh_context *ctx) +{ +return (u8 *)(ethtool_rxfh_context_indir (ctx) + ctx->indir_size); +} + +static inline void *ethtool_rxfh_context_priv (struct ethtool_rxfh_context *ctx) +{ +return ethtool_rxfh_context_key (ctx) + ctx->key_size; +} +/* declare a link mode bitmap */ #define __ETHTOOL_DECLARE_LINK_MODE_MASK (name) \ DECLARE_BITMAP(name, __ETHTOOL_LINK_MODE_MASK_NBITS)
include/linux/netdevice.h +5 -0
@@ -2028,6 +2028,8 @@ enum netdev_ml_priv_type {* @udp_tunnel_nic_info: static structure describing the UDP tunnel * offload capabilities of the device * @udp_tunnel_nic: UDP tunnel offload state +* @rss_ctx_max_id: maximum (exclusive) supported RSS context ID +* @rss_ctx: IDR storing custom RSS context state * @xdp_state: stores info on attached XDP BPF programs * * @nested_level: Used as a parameter of spin_lock_nested() of
@@ -2397,6 +2399,9 @@ struct net_device {const struct udp_tunnel_nic_info *udp_tunnel_nic_info;struct udp_tunnel_nic *udp_tunnel_nic; +u32 rss_ctx_max_id; +struct idr rss_ctx; +/* protected by rtnl_lock */ struct bpf_xdp_entity xdp_state[__MAX_XDP_MODE];
net/core/dev.c +23 -0
@@ -9983,6 +9983,9 @@ int register_netdevice(struct net_device *dev)if (ret)return ret; +/* rss ctx ID 0 is reserved for the default context, start from 1 */ +idr_init_base (&dev->rss_ctx,1 ); +spin_lock_init (&dev->addr_list_lock);netdev_set_addr_lockdep_class (dev);
@@ -10777,6 +10780,24 @@ void synchronize_net(void) }EXPORT_SYMBOL (synchronize_net); +static void netdev_rss_contexts_free (struct net_device *dev) +{ +struct ethtool_rxfh_context *ctx; +u32 context; + +if (!dev->ethtool_ops->set_rxfh_context) +return ; +idr_for_each_entry (&dev->rss_ctx, ctx, context) { +u32 *indir =ethtool_rxfh_context_indir (ctx); +u8 *key =ethtool_rxfh_context_key (ctx); + +idr_remove (&dev->rss_ctx, context); + dev->ethtool_ops->set_rxfh_context (dev, indir, key, ctx->hfunc, + &context, true); +kfree (ctx); + } +} +/** * unregister_netdevice_queue - remove device from the kernel * @dev: device
@@ -10881,6 +10902,8 @@ void unregister_netdevice_many_notify(struct list_head *head,netdev_name_node_alt_flush (dev);netdev_name_node_free (dev->name_node); +netdev_rss_contexts_free (dev); +call_netdevice_notifiers (NETDEV_PRE_UNINIT , dev);if (dev->netdev_ops->ndo_uninit)
RFC PATCH 2/6 net: ethtool: record custom RSS contexts in the IDR
In reply to [email protected]From: Edward Cree <[email protected]>
Since drivers are still choosing the context IDs, we have to force the
IDR to use the ID they've chosen rather than picking one ourselves.
--- include/linux/ethtool.h | 17 +++++++++++ net/ethtool/ioctl.c | 67 +++++++++++++++++++++++++++++++++++++++-- 2 files changed, 82 insertions(+), 2 deletions(-)
include/linux/ethtool.h +17 -0
@@ -163,12 +163,16 @@ static inline u32 ethtool_rxfh_indir_default(u32 index, u32 n_rx_rings)* @key_size: Size of hash key, in bytes * @hfunc: RSS hash function identifier. One of the %ETH_RSS_HASH_* * @priv_size: Size of driver private data, in bytes +* @indir_no_change: indir was not specified at create time +* @key_no_change: hkey was not specified at create time */ struct ethtool_rxfh_context {u32 indir_size;u32 key_size;u8 hfunc;u16 priv_size; +u8 indir_no_change:1 ; +u8 key_no_change:1 ;/* private: indirection table, hash key, and driver private data are * stored sequentially in @data area. Use below helpers to access */
@@ -190,6 +194,16 @@ static inline void *ethtool_rxfh_context_priv(struct ethtool_rxfh_context *ctx)return ethtool_rxfh_context_key (ctx) + ctx->key_size; } +static inline size_t ethtool_rxfh_context_size (u32 indir_size,u32 key_size, +u16 priv_size) +{ +size_t indir_bytes =array_size (indir_size,sizeof (u32)); +size_t flex_len; + + flex_len =size_add (size_add (indir_bytes, key_size), priv_size); +return struct_size ((struct ethtool_rxfh_context *)0 , data, flex_len); +} +/* declare a link mode bitmap */ #define __ETHTOOL_DECLARE_LINK_MODE_MASK (name) \ DECLARE_BITMAP(name, __ETHTOOL_LINK_MODE_MASK_NBITS)
@@ -727,6 +741,8 @@ struct ethtool_mm_stats {* will remain unchanged. * Returns a negative error code or zero. An error code must be returned * if at least one unsupported change was requested. +* @get_rxfh_priv_size: Get the size of the driver private data area the +* core should allocate for an RSS context. * @get_rxfh_context: Get the contents of the RX flow hash indirection table, * hash key, and/or hash function assiciated to the given rss context. * Returns a negative error code or zero.
@@ -880,6 +896,7 @@ struct ethtool_ops { u8 *hfunc);int (*set_rxfh)(struct net_device *,const u32 *indir,const u8 *key,const u8 hfunc); +u16 (*get_rxfh_priv_size)(struct net_device *);int (*get_rxfh_context)(struct net_device *,u32 *indir,u8 *key,u8 *hfunc,u32 rss_context); int (*set_rxfh_context)(struct net_device *, const u32 *indir,
net/ethtool/ioctl.c +65 -2
97 lines not on this page · raw message
RFC PATCH 3/6 net: ethtool: let the core choose RSS context IDs
In reply to [email protected]From: Edward Cree <[email protected]>
Rename the existing .set_rxfh_context API to .set_rxfh_context_old, and
add a new .set_rxfh_context API that passes in the newly-chosen context ID (not as a pointer) rather than leaving the driver to choose it.
--- .../net/ethernet/marvell/mvpp2/mvpp2_main.c | 2 +- .../marvell/octeontx2/nic/otx2_ethtool.c | 2 +- .../ethernet/mellanox/mlx5/core/en_ethtool.c | 2 +- drivers/net/ethernet/sfc/ef100_ethtool.c | 2 +- drivers/net/ethernet/sfc/ethtool.c | 2 +- drivers/net/ethernet/sfc/siena/ethtool.c | 2 +- include/linux/ethtool.h | 8 ++- net/core/dev.c | 13 +++-- net/ethtool/ioctl.c | 49 +++++++++++++------ 9 files changed, 58 insertions(+), 24 deletions(-)
drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c +1 -1
@@ -5758,7 +5758,7 @@ static const struct ethtool_ops mvpp2_eth_tool_ops = { .get_rxfh = mvpp2_ethtool_get_rxfh, .set_rxfh = mvpp2_ethtool_set_rxfh, .get_rxfh_context = mvpp2_ethtool_get_rxfh_context, - .set_rxfh_context = mvpp2_ethtool_set_rxfh_context, + .set_rxfh_context_old = mvpp2_ethtool_set_rxfh_context, };/* Used for PPv2.1, or PPv2.2 with the old Device Tree binding that
drivers/net/ethernet/marvell/octeontx2/nic/otx2_ethtool.c +1 -1
@@ -1325,7 +1325,7 @@ static const struct ethtool_ops otx2_ethtool_ops = { .get_rxfh = otx2_get_rxfh, .set_rxfh = otx2_set_rxfh, .get_rxfh_context = otx2_get_rxfh_context, - .set_rxfh_context = otx2_set_rxfh_context, + .set_rxfh_context_old = otx2_set_rxfh_context, .get_msglevel = otx2_get_msglevel, .set_msglevel = otx2_set_msglevel, .get_pauseparam = otx2_get_pauseparam,
drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c +1 -1
@@ -2425,7 +2425,7 @@ const struct ethtool_ops mlx5e_ethtool_ops = { .get_rxfh = mlx5e_get_rxfh, .set_rxfh = mlx5e_set_rxfh, .get_rxfh_context = mlx5e_get_rxfh_context, - .set_rxfh_context = mlx5e_set_rxfh_context, + .set_rxfh_context_old = mlx5e_set_rxfh_context, .get_rxnfc = mlx5e_get_rxnfc, .set_rxnfc = mlx5e_set_rxnfc, .get_tunable = mlx5e_get_tunable,
drivers/net/ethernet/sfc/ef100_ethtool.c +1 -1
@@ -61,7 +61,7 @@ const struct ethtool_ops ef100_ethtool_ops = { .get_rxfh = efx_ethtool_get_rxfh, .set_rxfh = efx_ethtool_set_rxfh, .get_rxfh_context = efx_ethtool_get_rxfh_context, - .set_rxfh_context = efx_ethtool_set_rxfh_context, + .set_rxfh_context_old = efx_ethtool_set_rxfh_context, .get_module_info = efx_ethtool_get_module_info, .get_module_eeprom = efx_ethtool_get_module_eeprom,
drivers/net/ethernet/sfc/ethtool.c +1 -1
@@ -270,7 +270,7 @@ const struct ethtool_ops efx_ethtool_ops = { .get_rxfh = efx_ethtool_get_rxfh, .set_rxfh = efx_ethtool_set_rxfh, .get_rxfh_context = efx_ethtool_get_rxfh_context, - .set_rxfh_context = efx_ethtool_set_rxfh_context, + .set_rxfh_context_old = efx_ethtool_set_rxfh_context, .get_ts_info = efx_ethtool_get_ts_info, .get_module_info = efx_ethtool_get_module_info, .get_module_eeprom = efx_ethtool_get_module_eeprom,
drivers/net/ethernet/sfc/siena/ethtool.c +1 -1
@@ -270,7 +270,7 @@ const struct ethtool_ops efx_siena_ethtool_ops = { .get_rxfh = efx_siena_ethtool_get_rxfh, .set_rxfh = efx_siena_ethtool_set_rxfh, .get_rxfh_context = efx_siena_ethtool_get_rxfh_context, - .set_rxfh_context = efx_siena_ethtool_set_rxfh_context, + .set_rxfh_context_old = efx_siena_ethtool_set_rxfh_context, .get_ts_info = efx_ethtool_get_ts_info, .get_module_info = efx_siena_ethtool_get_module_info, .get_module_eeprom = efx_siena_ethtool_get_module_eeprom,
include/linux/ethtool.h +7 -1
@@ -752,6 +752,9 @@ struct ethtool_mm_stats {* to %NULL or zero will remain unchanged. * Returns a negative error code or zero. An error code must be returned * if at least one unsupported change was requested. +* @set_rxfh_context_old: Legacy version of @set_rxfh_context, where driver +* chooses the new context ID in the %ETH_RXFH_CONTEXT_ALLOC case. +* Arguments and return otherwise the same. * @get_channels: Get number of channels. * @set_channels: Set number of channels. Returns a negative error code or * zero.
@@ -901,7 +904,10 @@ struct ethtool_ops { u8 *hfunc, u32 rss_context);int (*set_rxfh_context)(struct net_device *,const u32 *indir,const u8 *key,const u8 hfunc, -u32 *rss_context,bool delete); +u32 rss_context,bool delete); +int (*set_rxfh_context_old)(struct net_device *,const u32 *indir, +const u8 *key,const u8 hfunc, +u32 *rss_context,bool delete);void (*get_channels)(struct net_device *,struct ethtool_channels *);int (*set_channels)(struct net_device *,struct ethtool_channels *);int (*get_dump_flag)(struct net_device *,struct ethtool_dump *);
net/core/dev.c +10 -3
@@ -10785,15 +10785,22 @@ static void netdev_rss_contexts_free(struct net_device *dev)struct ethtool_rxfh_context *ctx;u32 context; -if (!dev->ethtool_ops->set_rxfh_context) +if (!dev->ethtool_ops->set_rxfh_context && + !dev->ethtool_ops->set_rxfh_context_old)return ;idr_for_each_entry (&dev->rss_ctx, ctx, context) {u32 *indir =ethtool_rxfh_context_indir (ctx);u8 *key =ethtool_rxfh_context_key (ctx);idr_remove (&dev->rss_ctx, context); - dev->ethtool_ops->set_rxfh_context (dev, indir, key, ctx->hfunc, - &context, true); +if (dev->ethtool_ops->set_rxfh_context) + dev->ethtool_ops->set_rxfh_context (dev, indir, key, + ctx->hfunc, context, + true); +else + dev->ethtool_ops->set_rxfh_context_old (dev, indir, key, + ctx->hfunc, + &context, true);kfree (ctx); } }
net/ethtool/ioctl.c +35 -14
81 lines not on this page · raw message
RFC PATCH 4/6 net: ethtool: pass ctx_priv and create into .set_rxfh_context
In reply to [email protected]From: Edward Cree <[email protected]>
Allows drivers to easily use the private data area in the ctx to store
their hardware-specific state.
The create flag is needed to inform them that in this case ctx_priv
has not already been populated.
--- include/linux/ethtool.h | 12 ++++++++---- net/core/dev.c | 5 +++-- net/ethtool/ioctl.c | 6 ++++-- 3 files changed, 15 insertions(+), 8 deletions(-)
include/linux/ethtool.h +8 -4
@@ -750,11 +750,13 @@ struct ethtool_mm_stats {* the contents of the RX flow hash indirection table, hash key, and/or * hash function associated to the given context. Arguments which are set * to %NULL or zero will remain unchanged. +* The &struct ethtool_rxfh_context for this context is passed in @ctx; +* note that it will still contain the *old* settings. The driver does +* not need to update these; the core will do so if this op succeeds. * Returns a negative error code or zero. An error code must be returned * if at least one unsupported change was requested. * @set_rxfh_context_old: Legacy version of @set_rxfh_context, where driver * chooses the new context ID in the %ETH_RXFH_CONTEXT_ALLOC case. -* Arguments and return otherwise the same. * @get_channels: Get number of channels. * @set_channels: Set number of channels. Returns a negative error code or * zero.
@@ -902,9 +904,11 @@ struct ethtool_ops {u16 (*get_rxfh_priv_size)(struct net_device *);int (*get_rxfh_context)(struct net_device *,u32 *indir,u8 *key,u8 *hfunc,u32 rss_context); -int (*set_rxfh_context)(struct net_device *,const u32 *indir, -const u8 *key,const u8 hfunc, -u32 rss_context,bool delete); +int (*set_rxfh_context)(struct net_device *, +struct ethtool_rxfh_context *ctx, +const u32 *indir,const u8 *key, +const u8 hfunc,u32 rss_context, +bool create,bool delete);int (*set_rxfh_context_old)(struct net_device *,const u32 *indir,const u8 *key,const u8 hfunc,u32 *rss_context,bool delete);
net/core/dev.c +3 -2
@@ -10794,8 +10794,9 @@ static void netdev_rss_contexts_free(struct net_device *dev)idr_remove (&dev->rss_ctx, context);if (dev->ethtool_ops->set_rxfh_context) - dev->ethtool_ops->set_rxfh_context (dev, indir, key, - ctx->hfunc, context, + dev->ethtool_ops->set_rxfh_context (dev, ctx, indir, + key, ctx->hfunc, + context, false, true);else dev->ethtool_ops->set_rxfh_context_old(dev, indir, key,
net/ethtool/ioctl.c +4 -2
@@ -1382,8 +1382,10 @@ static noinline_for_stack int ethtool_set_rxfh(struct net_device *dev,if (rxfh.rss_context) {if (ops->set_rxfh_context) - ret = ops->set_rxfh_context (dev, indir, hkey, rxfh.hfunc, - rxfh.rss_context, delete); + ret = ops->set_rxfh_context (dev, ctx, indir, hkey, + rxfh.hfunc, + rxfh.rss_context, create, + delete);else ret = ops->set_rxfh_context_old(dev, indir, hkey, rxfh.hfunc,
RFC PATCH 5/6 net: ethtool: add a mutex protecting RSS contexts
In reply to [email protected]From: Edward Cree <[email protected]>
While this is not needed to serialise the ethtool entry points (which
are all under RTNL), drivers may have cause to asynchronously access dev->rss_ctx; taking dev->rss_lock allows them to do this safely without needing to take the RTNL.
--- include/linux/netdevice.h | 3 +++ net/core/dev.c | 5 +++++ net/ethtool/ioctl.c | 7 +++++++ 3 files changed, 15 insertions(+)
include/linux/netdevice.h +3 -0
@@ -2030,6 +2030,8 @@ enum netdev_ml_priv_type {* @udp_tunnel_nic: UDP tunnel offload state * @rss_ctx_max_id: maximum (exclusive) supported RSS context ID * @rss_ctx: IDR storing custom RSS context state +* @rss_lock: Protects entries in @rss_ctx. May be taken from +* within RTNL. * @xdp_state: stores info on attached XDP BPF programs * * @nested_level: Used as a parameter of spin_lock_nested() of
@@ -2401,6 +2403,7 @@ struct net_device {u32 rss_ctx_max_id;struct idr rss_ctx; +struct mutex rss_lock;/* protected by rtnl_lock */ struct bpf_xdp_entity xdp_state[__MAX_XDP_MODE];
net/core/dev.c +5 -0
@@ -9987,6 +9987,7 @@ int register_netdevice(struct net_device *dev)idr_init_base (&dev->rss_ctx,1 );spin_lock_init (&dev->addr_list_lock); +mutex_init (&dev->rss_lock);netdev_set_addr_lockdep_class (dev); ret =dev_get_valid_name (net, dev, dev->name);
@@ -10788,6 +10789,7 @@ static void netdev_rss_contexts_free(struct net_device *dev)if (!dev->ethtool_ops->set_rxfh_context && !dev->ethtool_ops->set_rxfh_context_old)return ; +mutex_lock (&dev->rss_lock);idr_for_each_entry (&dev->rss_ctx, ctx, context) {u32 *indir =ethtool_rxfh_context_indir (ctx);u8 *key =ethtool_rxfh_context_key (ctx);
@@ -10804,6 +10806,7 @@ static void netdev_rss_contexts_free(struct net_device *dev) &context, true);kfree (ctx); } +mutex_unlock (&dev->rss_lock); }/**
@@ -10917,6 +10920,8 @@ void unregister_netdevice_many_notify(struct list_head *head,if (dev->netdev_ops->ndo_uninit) dev->netdev_ops->ndo_uninit (dev); +mutex_destroy (&dev->rss_lock); +if (skb)rtmsg_ifinfo_send (skb, dev,GFP_KERNEL , portid, nlh);
net/ethtool/ioctl.c +7 -0
@@ -1257,6 +1257,7 @@ static noinline_for_stack int ethtool_set_rxfh(struct net_device *dev,u8 *rss_config; u32 rss_cfg_offset = offsetof(struct ethtool_rxfh, rss_config[0]);bool create = false, delete = false; +bool locked = false;/* dev->rss_lock taken */ if (!ops->get_rxnfc || !ops->set_rxfh)return -EOPNOTSUPP ;
@@ -1336,6 +1337,10 @@ static noinline_for_stack int ethtool_set_rxfh(struct net_device *dev, } } +if (rxfh.rss_context) { +mutex_lock (&dev->rss_lock); + locked = true; + }if (create) {if (delete) { ret = -EINVAL ;
@@ -1438,6 +1443,8 @@ static noinline_for_stack int ethtool_set_rxfh(struct net_device *dev, } out: +if (locked) +mutex_unlock (&dev->rss_lock);kfree (rss_config);return ret; }
RFC PATCH 6/6 sfc: use new .set_rxfh_context API
In reply to [email protected]From: Edward Cree <[email protected]>
The core is now responsible for allocating IDs and a memory region for
us to store our state (struct efx_rss_context_priv), so we no longer need efx_alloc_rss_context_entry() and friends.
Since the contexts are now maintained by the core, use the core's lock
(net_dev->rss_lock), rather than our own mutex (efx->rss_lock), to serialise access against changes; and remove the now-unused efx->rss_lock from struct efx_nic.
--- drivers/net/ethernet/sfc/ef10.c | 2 +- drivers/net/ethernet/sfc/ef100_ethtool.c | 2 +- drivers/net/ethernet/sfc/efx.c | 2 +- drivers/net/ethernet/sfc/efx.h | 2 +- drivers/net/ethernet/sfc/efx_common.c | 10 +- drivers/net/ethernet/sfc/ethtool.c | 2 +- drivers/net/ethernet/sfc/ethtool_common.c | 96 +++++++--------- drivers/net/ethernet/sfc/ethtool_common.h | 4 +- drivers/net/ethernet/sfc/mcdi_filters.c | 131 +++++++++++----------- drivers/net/ethernet/sfc/mcdi_filters.h | 8 +- drivers/net/ethernet/sfc/net_driver.h | 28 ++--- drivers/net/ethernet/sfc/rx_common.c | 64 ++--------- drivers/net/ethernet/sfc/rx_common.h | 8 +- 13 files changed, 150 insertions(+), 209 deletions(-)
drivers/net/ethernet/sfc/ef10.c +1 -1
@@ -1394,7 +1394,7 @@ static void efx_ef10_table_reset_mc_allocations(struct efx_nic *efx)efx_mcdi_filter_table_reset_mc_allocations (efx); nic_data->must_restore_piobufs = true;efx_ef10_forget_old_piobufs (efx); - efx->rss_context.context_id =EFX_MCDI_RSS_CONTEXT_INVALID ; + efx->rss_context.priv.context_id =EFX_MCDI_RSS_CONTEXT_INVALID ;/* Driver-created vswitches and vports must be re-created */ nic_data->must_probe_vswitching = true;
drivers/net/ethernet/sfc/ef100_ethtool.c +1 -1
@@ -61,7 +61,7 @@ const struct ethtool_ops ef100_ethtool_ops = { .get_rxfh = efx_ethtool_get_rxfh, .set_rxfh = efx_ethtool_set_rxfh, .get_rxfh_context = efx_ethtool_get_rxfh_context, - .set_rxfh_context_old = efx_ethtool_set_rxfh_context, + .set_rxfh_context = efx_ethtool_set_rxfh_context, .get_module_info = efx_ethtool_get_module_info, .get_module_eeprom = efx_ethtool_get_module_eeprom,
drivers/net/ethernet/sfc/efx.c +1 -1
@@ -298,7 +298,7 @@ static int efx_probe_nic(struct efx_nic *efx)if (efx->n_channels >1 )netdev_rss_key_fill (efx->rss_context.rx_hash_key,sizeof (efx->rss_context.rx_hash_key)); -efx_set_default_rx_indir_table (efx, &efx->rss_context); +efx_set_default_rx_indir_table (efx, efx->rss_context.rx_indir_table);/* Initialise the interrupt moderation settings */ efx->irq_mod_step_us =DIV_ROUND_UP (efx->timer_quantum_ns,1000 );
drivers/net/ethernet/sfc/efx.h +1 -1
@@ -160,7 +160,7 @@ static inline s32 efx_filter_get_rx_ids(struct efx_nic *efx, }/* RSS contexts */ -static inline bool efx_rss_active (struct efx_rss_context *ctx) +static inline bool efx_rss_active (struct efx_rss_context_priv *ctx) {return ctx->context_id !=EFX_MCDI_RSS_CONTEXT_INVALID ; }
drivers/net/ethernet/sfc/efx_common.c +4 -6
@@ -717,7 +717,7 @@ void efx_reset_down(struct efx_nic *efx, enum reset_type method)mutex_lock (&efx->mac_lock);down_write (&efx->filter_sem); -mutex_lock (&efx->rss_lock); +mutex_lock (&efx->net_dev->rss_lock); efx->type->fini (efx); }
@@ -780,7 +780,7 @@ int efx_reset_up(struct efx_nic *efx, enum reset_type method, bool ok)if (efx->type->rx_restore_rss_contexts) efx->type->rx_restore_rss_contexts (efx); -mutex_unlock (&efx->rss_lock); +mutex_unlock (&efx->net_dev->rss_lock); efx->type->filter_table_restore (efx);up_write (&efx->filter_sem);if (efx->type->sriov_reset)
@@ -798,7 +798,7 @@ int efx_reset_up(struct efx_nic *efx, enum reset_type method, bool ok) fail: efx->port_initialized = false; -mutex_unlock (&efx->rss_lock); +mutex_unlock (&efx->net_dev->rss_lock);up_write (&efx->filter_sem);mutex_unlock (&efx->mac_lock);
@@ -1005,9 +1005,7 @@ int efx_init_struct(struct efx_nic *efx, struct pci_dev *pci_dev) efx->type->rx_hash_offset - efx->type->rx_prefix_size; efx->rx_packet_ts_offset = efx->type->rx_ts_offset - efx->type->rx_prefix_size; -INIT_LIST_HEAD (&efx->rss_context.list); - efx->rss_context.context_id =EFX_MCDI_RSS_CONTEXT_INVALID ; -mutex_init (&efx->rss_lock); + efx->rss_context.priv.context_id =EFX_MCDI_RSS_CONTEXT_INVALID ; efx->vport_id =EVB_PORT_ID_ASSIGNED ;spin_lock_init (&efx->stats_lock); efx->vi_stride =EFX_DEFAULT_VI_STRIDE ;
drivers/net/ethernet/sfc/ethtool.c +1 -1
@@ -270,7 +270,7 @@ const struct ethtool_ops efx_ethtool_ops = { .get_rxfh = efx_ethtool_get_rxfh, .set_rxfh = efx_ethtool_set_rxfh, .get_rxfh_context = efx_ethtool_get_rxfh_context, - .set_rxfh_context_old = efx_ethtool_set_rxfh_context, + .set_rxfh_context = efx_ethtool_set_rxfh_context, .get_ts_info = efx_ethtool_get_ts_info, .get_module_info = efx_ethtool_get_module_info, .get_module_eeprom = efx_ethtool_get_module_eeprom,
drivers/net/ethernet/sfc/ethtool_common.c +41 -55
159 lines not on this page · raw message
drivers/net/ethernet/sfc/ethtool_common.h +3 -1
@@ -44,6 +44,7 @@ int efx_ethtool_set_rxnfc(struct net_device *net_dev, struct ethtool_rxnfc *info);u32 efx_ethtool_get_rxfh_indir_size (struct net_device *net_dev);u32 efx_ethtool_get_rxfh_key_size (struct net_device *net_dev); +u16 efx_ethtool_get_rxfh_priv_size (struct net_device *net_dev);int efx_ethtool_get_rxfh (struct net_device *net_dev,u32 *indir,u8 *key,u8 *hfunc); int efx_ethtool_set_rxfh(struct net_device *net_dev,
@@ -51,8 +52,9 @@ int efx_ethtool_set_rxfh(struct net_device *net_dev,int efx_ethtool_get_rxfh_context (struct net_device *net_dev,u32 *indir,u8 *key,u8 *hfunc,u32 rss_context);int efx_ethtool_set_rxfh_context (struct net_device *net_dev, +struct ethtool_rxfh_context *ctx,const u32 *indir,const u8 *key, -const u8 hfunc,u32 *rss_context, +const u8 hfunc,u32 rss_context,bool create,bool delete);int efx_ethtool_reset (struct net_device *net_dev,u32 *flags); int efx_ethtool_get_module_eeprom(struct net_device *net_dev,
drivers/net/ethernet/sfc/mcdi_filters.c +68 -63
353 lines not on this page · raw message
drivers/net/ethernet/sfc/mcdi_filters.h +2 -6
@@ -145,9 +145,9 @@ void efx_mcdi_filter_del_vlan(struct efx_nic *efx, u16 vid);void efx_mcdi_rx_free_indir_table (struct efx_nic *efx);int efx_mcdi_rx_push_rss_context_config (struct efx_nic *efx, -struct efx_rss_context *ctx, +struct efx_rss_context_priv *ctx,const u32 *rx_indir_table, -const u8 *key); +const u8 *key,bool delete);int efx_mcdi_pf_rx_push_rss_config (struct efx_nic *efx,bool user,const u32 *rx_indir_table,const u8 *key);
@@ -161,10 +161,6 @@ int efx_mcdi_push_default_indir_table(struct efx_nic *efx,int efx_mcdi_rx_pull_rss_config (struct efx_nic *efx);int efx_mcdi_rx_pull_rss_context_config (struct efx_nic *efx,struct efx_rss_context *ctx); -int efx_mcdi_get_rss_context_flags (struct efx_nic *efx,u32 context, -u32 *flags); -void efx_mcdi_set_rss_context_flags (struct efx_nic *efx, -struct efx_rss_context *ctx);void efx_mcdi_rx_restore_rss_contexts (struct efx_nic *efx);static inline void efx_mcdi_update_rx_scatter (struct efx_nic *efx)
drivers/net/ethernet/sfc/net_driver.h +14 -14
@@ -770,21 +770,24 @@ struct vfdi_status;/* The reserved RSS context value */ #define EFX_MCDI_RSS_CONTEXT_INVALID 0xffffffff/** -* struct efx_rss_context - A user-defined RSS context for filtering -* @list: node of linked list on which this struct is stored +* struct efx_rss_context_priv - driver private data for an RSS context * @context_id: the RSS_CONTEXT_ID returned by MC firmware, or * %EFX_MCDI_RSS_CONTEXT_INVALID if this context is not present on the NIC. -* For Siena, 0 if RSS is active, else %EFX_MCDI_RSS_CONTEXT_INVALID. -* @user_id: the rss_context ID exposed to userspace over ethtool. * @rx_hash_udp_4tuple: UDP 4-tuple hashing enabled +*/ +struct efx_rss_context_priv { +u32 context_id; +bool rx_hash_udp_4tuple; +}; + +/** +* struct efx_rss_context - an RSS context +* @priv: hardware-specific state * @rx_hash_key: Toeplitz hash key for this RSS context * @indir_table: Indirection table for this RSS context */ struct efx_rss_context { -struct list_head list; -u32 context_id; -u32 user_id; -bool rx_hash_udp_4tuple; +struct efx_rss_context_priv priv;u8 rx_hash_key[40 ];u32 rx_indir_table[128 ]; };
@@ -917,9 +920,7 @@ struct efx_mae;* @rx_packet_ts_offset: Offset of timestamp from start of packet data * (valid only if channel->sync_timestamps_enabled; always negative) * @rx_scatter: Scatter mode enabled for receives -* @rss_context: Main RSS context. Its @list member is the head of the list of -* RSS contexts created by user requests -* @rss_lock: Protects custom RSS context software state in @rss_context.list +* @rss_context: Main RSS context. * @vport_id: The function's vport ID, only relevant for PFs * @int_error_count: Number of internal errors seen recently * @int_error_expire: Time at which error count will be expired
@@ -1090,7 +1091,6 @@ struct efx_nic {int rx_packet_ts_offset;bool rx_scatter;struct efx_rss_context rss_context; -struct mutex rss_lock;u32 vport_id;unsigned int_error_count;
@@ -1462,9 +1462,9 @@ struct efx_nic_type { const u32 *rx_indir_table, const u8 *key);int (*rx_pull_rss_config)(struct efx_nic *efx);int (*rx_push_rss_context_config)(struct efx_nic *efx, -struct efx_rss_context *ctx, +struct efx_rss_context_priv *ctx,const u32 *rx_indir_table, -const u8 *key); +const u8 *key,bool delete);int (*rx_pull_rss_context_config)(struct efx_nic *efx,struct efx_rss_context *ctx);void (*rx_restore_rss_contexts)(struct efx_nic *efx);
drivers/net/ethernet/sfc/rx_common.c +10 -54
79 lines not on this page · raw message
drivers/net/ethernet/sfc/rx_common.h +3 -5
@@ -84,11 +84,9 @@ void efx_rx_packet_gro(struct efx_channel *channel, struct efx_rx_buffer *rx_buf, unsigned int n_frags, u8 *eh, __wsum csum); -struct efx_rss_context *efx_alloc_rss_context_entry (struct efx_nic *efx); -struct efx_rss_context *efx_find_rss_context_entry (struct efx_nic *efx,u32 id); -void efx_free_rss_context_entry (struct efx_rss_context *ctx); -void efx_set_default_rx_indir_table (struct efx_nic *efx, -struct efx_rss_context *ctx); +struct efx_rss_context_priv *efx_find_rss_context_entry (struct efx_nic *efx, +u32 id); +void efx_set_default_rx_indir_table (struct efx_nic *efx,u32 *indir);bool efx_filter_is_mc_recipient (const struct efx_filter_spec *spec); bool efx_filter_spec_equal(const struct efx_filter_spec *left,
Jakub Kicinski
maintainerRe: [RFC PATCH net-next 1/6] net: ethtool: attach an IDR of custom RSS contexts to a netdevice
In reply to [email protected]Quoted 12 lines · On Mon, 3 Apr 2023 17:32:58 +0100 [email protected] wrote:
From: Edward Cree <[email protected]>
Each context stores the RXFH settings (indir, key, and hfunc) as well
as optionally some driver private data.
Delete any still-existing contexts at netdev unregister time.include/linux/ethtool.h +6
-0+/** +* struct ethtool_rxfh_context - a custom RSS context configuration +* @indir_size: Number of u32 entries in indirection table +* @key_size: Size of hash key, in bytes +* @hfunc: RSS hash function identifier. One of the %ETH_RSS_HASH_* +* @priv_size: Size of driver private data, in bytes
include/linux/ethtool.h static inline u32 ethtool_rxfh_indir_default(u32 index, u32 n_rx_rings) · line 175
Quoted 10 lines
include/linux/ethtool.h +10
-0+*/ +struct ethtool_rxfh_context { +u32 indir_size; +u32 key_size; +u8 hfunc; +u16 priv_size; +/* private: indirection table, hash key, and driver private data are +* stored sequentially in @data area. Use below helpers to access +*/ +u8 data[];
I think that something needs to get aligned here... Driver priv needs to guarantee ulong alignment in case someone puts a pointer in it.
Quoted 5 lines
include/linux/ethtool.h +5
-0+}; + +static inline u32 *ethtool_rxfh_context_indir (struct ethtool_rxfh_context *ctx) +{ +return (u32 *)&ctx->data;
include/linux/ethtool.h static inline u32 ethtool_rxfh_indir_default(u32 index, u32 n_rx_rings) · line 190
Quoted 10 lines
include/linux/ethtool.h +10
-0+} + +static inline u8 *ethtool_rxfh_context_key (struct ethtool_rxfh_context *ctx) +{ +return (u8 *)(ethtool_rxfh_context_indir (ctx) + ctx->indir_size); +} + +static inline void *ethtool_rxfh_context_priv (struct ethtool_rxfh_context *ctx) +{ +return ethtool_rxfh_context_key (ctx) + ctx->key_size;
ALIGN_PTR() ... ?
Or align data[] and reorder..
include/linux/ethtool.h static inline u32 ethtool_rxfh_indir_default(u32 index, u32 n_rx_rings)
Quoted 8 lines
include/linux/ethtool.h +4
-0+} +/* declare a link mode bitmap */ #define __ETHTOOL_DECLARE_LINK_MODE_MASK (name) \ DECLARE_BITMAP(name, __ETHTOOL_LINK_MODE_MASK_NBITS) +u32 rss_ctx_max_id; +struct idr rss_ctx;
noob question, why not xarray?
Isn't IDR just a legacy wrapper around xarray anyway?
Jakub Kicinski
maintainerRe: [RFC PATCH net-next 2/6] net: ethtool: record custom RSS contexts in the IDR
In reply to [email protected]include/linux/ethtool.h struct ethtool_ops { · line 902
Quoted 8 lines · On Mon, 3 Apr 2023 17:32:59 +0100 [email protected] wrote:
include/linux/ethtool.h +1
-0@@ -880,6 +896,7 @@ struct ethtool_ops { u8 *hfunc);int (*set_rxfh)(struct net_device *,const u32 *indir,const u8 *key,const u8 hfunc); +u16 (*get_rxfh_priv_size)(struct net_device *);int (*get_rxfh_context)(struct net_device *,u32 *indir,u8 *key,u8 *hfunc,u32 rss_context); int (*set_rxfh_context)(struct net_device *, const u32 *indir,
Would a static value not do for most drivers?
We already have a handful of data fields in the "ops" structure.
net/ethtool/ioctl.c static noinline_for_stack int ethtool_set_rxfh(struct net_device *dev, · line 1346
Quoted 13 lines
net/ethtool/ioctl.c +9
-0@@ -1331,6 +1335,31 @@ static noinline_for_stack int ethtool_set_rxfh(struct net_device *dev, } } +if (create) { +if (delete) { + ret = -EINVAL ; + goto out; + } + ctx =kzalloc (ethtool_rxfh_context_size (dev_indir_size, + dev_key_size, + dev_priv_size), +GFP_USER );
GFP_USER? Do you mean it for accounting? GFP_KERNEL_ACCOUNT?
Jakub Kicinski
maintainerRe: [RFC PATCH net-next 3/6] net: ethtool: let the core choose RSS context IDs
In reply to [email protected]include/linux/ethtool.h struct ethtool_ops { · line 907
Quoted 4 lines · On Mon, 3 Apr 2023 17:33:00 +0100 [email protected] wrote:
include/linux/ethtool.h +1
-1int (*set_rxfh_context)(struct net_device *,const u32 *indir,const u8 *key,const u8 hfunc, -u32 *rss_context,bool delete); +u32 rss_context,bool delete);
Would it be easier to pass struct ethtool_rxfh_context instead of doing it field by field? Otherwise Intel will need to add more arguments and touch all drivers. Or are you thinking that they should use a separate callback for the "RR RSS" or whatever their thing is?
And maybe separate op for create / change / delete?
And an extack on top... :)
Jakub Kicinski
maintainerRe: [RFC PATCH net-next 5/6] net: ethtool: add a mutex protecting RSS contexts
In reply to [email protected]include/linux/netdevice.h struct net_device { · line 2406
Quoted 3 lines · On Mon, 3 Apr 2023 17:33:02 +0100 [email protected] wrote:
include/linux/netdevice.h +1
-0u32 rss_ctx_max_id;struct idr rss_ctx; +struct mutex rss_lock;
Argh, the mutex doubles the size of the state, and most drivers don't implement this feature. My thinking was to add a "ethtool state" pointer to net_device which will be allocated by ethtool on demand and can hold all ethtool related state.
For psychological reasons primarily (IOW I feel like people shy away from storing state in the core because it feels expensive to add stuff to net_device while it would not seem expensive to add it to struct ethtool_netdev_state).
Maybe we can do the on-demand allocation later - but could we at least wrap the ethtool-related fields in a separate struct to hold them together?
Edward Cree
maintainerRe: [RFC PATCH net-next 1/6] net: ethtool: attach an IDR of custom RSS contexts to a netdevice
In reply to Jakub KicinskiQuoted 10 lines · Jakub Kicinski
include/linux/ethtool.h static inline u32 ethtool_rxfh_indir_default(u32 index, u32 n_rx_rings) · line 175
Quoted 4 lines · On Mon, 3 Apr 2023 17:32:58 +0100 [email protected] wrote:
include/linux/ethtool.h +4
-0+/* private: indirection table, hash key, and driver private data are +* stored sequentially in @data area. Use below helpers to access +*/ +u8 data[];I think that something needs to get aligned here... Driver priv needs to guarantee ulong alignment in case someone puts a pointer in it.
Quoted 6 lines
include/linux/ethtool.h static inline u32 ethtool_rxfh_indir_default(u32 index, u32 n_rx_rings) · line 190
Quoted 3 lines
include/linux/ethtool.h +3
-0+static inline void *ethtool_rxfh_context_priv (struct ethtool_rxfh_context *ctx) +{ +return ethtool_rxfh_context_key (ctx) + ctx->key_size;
ALIGN_PTR()... ?
Or align data[] and reorder..
Very good points. Indir also needs 4-byte alignment. Will fix in next version.
Quoted 4 lines
include/linux/netdevice.h struct net_device { · line 2403
Quoted 2 lines
include/linux/netdevice.h +2
-0+u32 rss_ctx_max_id; +struct idr rss_ctx;noob question, why not xarray?
Because I know how to use the IDR API, but have never used
xarray directly, so would need to learn it.
Quoted 1 line
Isn't IDR just a legacy wrapper around xarray anyway?
I see it as a *convenience* wrapper. Is it deprecated?
Edward Cree
maintainerRe: [RFC PATCH net-next 2/6] net: ethtool: record custom RSS contexts in the IDR
In reply to Jakub KicinskiQuoted 11 lines · Jakub Kicinski
include/linux/ethtool.h struct ethtool_ops { · line 902
Quoted 8 lines · On Mon, 3 Apr 2023 17:32:59 +0100 [email protected] wrote:
include/linux/ethtool.h +1
-0@@ -880,6 +896,7 @@ struct ethtool_ops { u8 *hfunc);int (*set_rxfh)(struct net_device *,const u32 *indir,const u8 *key,const u8 hfunc); +u16 (*get_rxfh_priv_size)(struct net_device *);int (*get_rxfh_context)(struct net_device *,u32 *indir,u8 *key,u8 *hfunc,u32 rss_context); int (*set_rxfh_context)(struct net_device *, const u32 *indir,Would a static value not do for most drivers?
Yes, it would.
Quoted 1 line
We already have a handful of data fields in the "ops" structure.
I didn't notice that / realise it was an option. Will do.
Quoted 4 lines
Quoted 4 lines
(quoted diff) +0
-0@@ -1331,6 +1335,31 @@ static noinline_for_stack int ethtool_set_rxfh(struct net_device *dev, } }
Quoted 11 lines
net/ethtool/ioctl.c static noinline_for_stack int ethtool_set_rxfh(struct net_device *dev, · line 1346
Quoted 9 lines
net/ethtool/ioctl.c +9
-0+if (create) { +if (delete) { + ret = -EINVAL ; + goto out; + } + ctx =kzalloc (ethtool_rxfh_context_size (dev_indir_size, + dev_key_size, + dev_priv_size), +GFP_USER );
GFP_USER? Do you mean it for accounting?GFP_KERNEL_ACCOUNT?
It's an allocation triggerable by userland; I was under the
impression that those were supposed to use GFP_USER for some reason; the rss_config alloc further up this function does.
Edward Cree
maintainerRe: [RFC PATCH net-next 3/6] net: ethtool: let the core choose RSS context IDs
In reply to Jakub KicinskiQuoted 10 lines · Jakub Kicinski
include/linux/ethtool.h struct ethtool_ops { · line 907
Quoted 4 lines · On Mon, 3 Apr 2023 17:33:00 +0100 [email protected] wrote:
include/linux/ethtool.h +1
-1int (*set_rxfh_context)(struct net_device *,const u32 *indir,const u8 *key,const u8 hfunc, -u32 *rss_context,bool delete); +u32 rss_context,bool delete);Would it be easier to pass struct
ethtool_rxfh_contextinstead of doing it field by field? Otherwise Intel will need to add more arguments and touch all drivers. Or are you thinking that they should use a separate callback for the "RR RSS" or whatever their thing is?
Initially I tried to just pass in ctx with the new values already
filled in. But that breaks if the op fails; we have to leave the old values in ctx. We maybe could create a second, ephemeral struct ethtool_rxfh_context to pass the new values in, but then we have to worry about which one's priv the driver uses.
(We can't e.g. just pass in the ephemeral one, and copy its priv
across when we update the real ctx after the op returns, because what if the driver stores, say, a list_head in its priv?)
And if we did pass a struct wrapping indir, key and hfunc, then
any patch adding more fields to it would need existing drivers to check the new fields were unused / set to NO_CHANGE.
So I think we just have to accept that new fields will mean
changing all drivers. (There's only half a dozen, anyway.)
And doing that through the op arguments means the compiler will
catch any driver that hasn't been updated, rather than the driver potentially silently ignoring the new field.
Quoted 1 line
And maybe separate op for create / change / delete?
Good idea, that would also elide renaming the legacy op.
Quoted 1 line
And an extack on top... :)
Sure.
Edward Cree
maintainerRe: [RFC PATCH net-next 5/6] net: ethtool: add a mutex protecting RSS contexts
In reply to Jakub KicinskiQuoted 8 lines · Jakub Kicinski
include/linux/netdevice.h struct net_device { · line 2406
Quoted 3 lines · On Mon, 3 Apr 2023 17:33:02 +0100 [email protected] wrote:
include/linux/netdevice.h +1
-0u32 rss_ctx_max_id;struct idr rss_ctx; +struct mutex rss_lock;Argh, the mutex doubles the size of the state, and most drivers don't
implement this feature. My thinking was to add a "ethtool state"> pointer tonet_devicewhich will be allocated by ethtool on demand and can hold all ethtool related state.
Would any other existing net_device fields go in this struct, or is
it just the RSS stuff so far?
Jakub Kicinski
maintainerRe: [RFC PATCH net-next 1/6] net: ethtool: attach an IDR of custom RSS contexts to a netdevice
In reply to Edward CreeQuoted 3 lines · On Tue, 4 Apr 2023 12:30:42 +0100 Edward Cree wrote:
Quoted 1 line
Isn't IDR just a legacy wrapper around xarray anyway?
I see it as a *convenience* wrapper. Is it deprecated?
Hm, I'm not so sure what the relation between idr and xarray is after glancing at the code.
I'm more used to seeing xarray these days but if you prefer to keep the IDR it's fine.
Jakub Kicinski
maintainerRe: [RFC PATCH net-next 2/6] net: ethtool: record custom RSS contexts in the IDR
In reply to Edward CreeQuoted 5 lines · On Tue, 4 Apr 2023 12:49:18 +0100 Edward Cree wrote:
Quoted 1 line
GFP_USER? Do you mean it for accounting?GFP_KERNEL_ACCOUNT?It's an allocation triggerable by userland; I was under the
impression that those were supposed to useGFP_USERfor some reason; therss_configalloc further up this function does.
That's what I thought, too, and that it implies memory accounting. But then someone from MM told me that that's not the case, and that GFP_USER is supposed to be mmap()able. Or maybe the latter part I got from the kdoc in gfp_types.h.
I think we should make sure the memory is accounted.
Jakub Kicinski
maintainerRe: [RFC PATCH net-next 3/6] net: ethtool: let the core choose RSS context IDs
In reply to Edward CreeQuoted 18 lines · On Tue, 4 Apr 2023 13:14:39 +0100 Edward Cree wrote:
Quoted 4 lines
Would it be easier to pass struct
ethtool_rxfh_contextinstead of doing it field by field? Otherwise Intel will need to add more arguments and touch all drivers. Or are you thinking that they should use a separate callback for the "RR RSS" or whatever their thing is?Initially I tried to just pass in ctx with the new values already
filled in. But that breaks if the op fails; we have to leave the old values in ctx. We maybe could create a second, ephemeral structethtool_rxfh_contextto pass the new values in, but then we have to worry about which one's priv the driver uses.
(We can't e.g. just pass in the ephemeral one, and copy its priv
across when we update the real ctx after the op returns, because what if the driver stores, say, alist_headin its priv?)And if we did pass a struct wrapping indir, key and hfunc, then
any patch adding more fields to it would need existing drivers to check the new fields were unused / set toNO_CHANGE.
Quoted 5 lines
So I think we just have to accept that new fields will mean
changing all drivers. (There's only half a dozen, anyway.)
And doing that through the op arguments means the compiler will
catch any driver that hasn't been updated, rather than the driver potentially silently ignoring the new field.
Fair point with needing to copy in case of error, okay :(
Jakub Kicinski
maintainerRe: [RFC PATCH net-next 5/6] net: ethtool: add a mutex protecting RSS contexts
In reply to Edward CreeQuoted 7 lines · On Tue, 4 Apr 2023 13:32:04 +0100 Edward Cree wrote:
Quoted 4 lines
Argh, the mutex doubles the size of the state, and most drivers don't implement this feature. My thinking was to add a "ethtool state"> pointer to
net_devicewhich will be allocated by ethtool on demand and can hold all ethtool related state.Would any other existing
net_devicefields go in this struct, or is
it just the RSS stuff so far?
Only wol_enabled possibly, nothing else looks relevant. But wol_enabled is one bit so up to you if you want to move it.
Edward Cree
maintainerRe: [RFC PATCH net-next 2/6] net: ethtool: record custom RSS contexts in the IDR
In reply to Jakub KicinskiQuoted 7 lines · Jakub Kicinski
Quoted 5 lines · On Tue, 4 Apr 2023 12:49:18 +0100 Edward Cree wrote:
Quoted 1 line
GFP_USER? Do you mean it for accounting?GFP_KERNEL_ACCOUNT?It's an allocation triggerable by userland; I was under the
impression that those were supposed to useGFP_USERfor some reason; therss_configalloc further up this function does.
Quoted 6 lines
That's what I thought, too, and that it implies memory accounting. But then someone from MM told me that that's not the case, and that
GFP_USERis supposed to be mmap()able. Or maybe the latter part I got from the kdoc ingfp_types.h.I think we should make sure the memory is accounted.
Okay. Presumably this doesn't apply to rss_config because it's
short-lived (freed on the way out of the function)?
(In which case I think rss_config should just be GFP_KERNEL;
we don't try to map it to userspace, we just copy_{from,to}_user between it and the ioctl data. But that's unrelated cleanup which we can worry about later, if at all.)
Re: [RFC PATCH net-next 2/6] net: ethtool: record custom RSS contexts in the IDR
In reply to [email protected]Hi,
[This is a private test report for your RFC patch.] kernel test robot noticed the following build warnings:
url: https://github.com/intel-lab-lkp/linux/commits/edward-cree-amd-com/net-ethtool-attach-an-IDR-of-custom-RSS-contexts-to-a-netdevice/20230404-003917 patch link: https://lore.kernel.org/r/57c0a5a7d41e1341e8a7b0256ca8ed6f3e3ea9c0.1680538846.git.ecree.xilinx%40gmail.com patch subject: [RFC PATCH net-next 2/6] net: ethtool: record custom RSS contexts in the IDR config: i386-randconfig-m021-20230403 (https://download.01.org/0day-ci/archive/20230405/[email protected]/config) compiler: gcc-11 (Debian 11.3.0-8) 11.3.0
If you fix the issue, kindly add following tag where applicable
| Reported-by: kernel test robot <[email protected]> | Reported-by: Dan Carpenter <[email protected]> | Link: https://lore.kernel.org/r/[email protected]/
New smatch warnings:net/ethtool/ioctl.c:1402 ethtool_set_rxfh() error: uninitialized symbol 'ctx'.
Old smatch warnings:net/ethtool/ioctl.c:1419 ethtool_set_rxfh() warn: possible memory leak of 'ctx'
vim +/ctx +1402 net/ethtool/ioctl.c
3de0b592394d17 net/core/ethtool.c Venkata Duvvuru 2014-04-21 1246 static noinline_for_stack int ethtool_set_rxfh(struct net_device *dev,
3de0b592394d17 net/core/ethtool.c Venkata Duvvuru 2014-04-21 1247 void __user *useraddr)
3de0b592394d17 net/core/ethtool.c Venkata Duvvuru 2014-04-21 1248 {
3de0b592394d17 net/core/ethtool.c Venkata Duvvuru 2014-04-21 1249 int ret;
3de0b592394d17 net/core/ethtool.c Venkata Duvvuru 2014-04-21 1250 const struct ethtool_ops *ops = dev->ethtool_ops;
59b320b4d43d43 net/ethtool/ioctl.c Edward Cree 2023-04-03 1251 struct ethtool_rxfh_context *ctx;
3de0b592394d17 net/core/ethtool.c Venkata Duvvuru 2014-04-21 1252 struct ethtool_rxnfc rx_rings;
f062a3844845d2 net/core/ethtool.c Ben Hutchings 2014-05-15 1253 struct ethtool_rxfh rxfh;
59b320b4d43d43 net/ethtool/ioctl.c Edward Cree 2023-04-03 1254 u32 dev_indir_size = 0, dev_key_size = 0, dev_priv_size = 0, i;
3de0b592394d17 net/core/ethtool.c Venkata Duvvuru 2014-04-21 1255 u32 *indir = NULL, indir_bytes = 0;
3de0b592394d17 net/core/ethtool.c Venkata Duvvuru 2014-04-21 1256 u8 *hkey = NULL;
3de0b592394d17 net/core/ethtool.c Venkata Duvvuru 2014-04-21 1257 u8 *rss_config;
3de0b592394d17 net/core/ethtool.c Venkata Duvvuru 2014-04-21 1258 u32 rss_cfg_offset = offsetof(struct ethtool_rxfh, rss_config[0]);
59b320b4d43d43 net/ethtool/ioctl.c Edward Cree 2023-04-03 1259 bool create = false, delete = false;
3de0b592394d17 net/core/ethtool.c Venkata Duvvuru 2014-04-21 1260
892311f66f2411 net/core/ethtool.c Eyal Perry 2014-12-02 1261 if (!ops->get_rxnfc || !ops->set_rxfh)
3de0b592394d17 net/core/ethtool.c Venkata Duvvuru 2014-04-21 1262 return -EOPNOTSUPP;
3de0b592394d17 net/core/ethtool.c Venkata Duvvuru 2014-04-21 1263
3de0b592394d17 net/core/ethtool.c Venkata Duvvuru 2014-04-21 1264 if (ops->get_rxfh_indir_size)
3de0b592394d17 net/core/ethtool.c Venkata Duvvuru 2014-04-21 1265 dev_indir_size = ops->get_rxfh_indir_size(dev);
3de0b592394d17 net/core/ethtool.c Venkata Duvvuru 2014-04-21 1266 if (ops->get_rxfh_key_size)
d340c862e76081 net/core/ethtool.c Dan Carpenter 2015-02-20 1267 dev_key_size = ops->get_rxfh_key_size(dev);
3de0b592394d17 net/core/ethtool.c Venkata Duvvuru 2014-04-21 1268
f062a3844845d2 net/core/ethtool.c Ben Hutchings 2014-05-15 1269 if (copy_from_user(&rxfh, useraddr, sizeof(rxfh)))
3de0b592394d17 net/core/ethtool.c Venkata Duvvuru 2014-04-21 1270 return -EFAULT;
3de0b592394d17 net/core/ethtool.c Venkata Duvvuru 2014-04-21 1271
f062a3844845d2 net/core/ethtool.c Ben Hutchings 2014-05-15 1272 /* Check that reserved fields are 0 for now */
84a1d9c4820080 net/core/ethtool.c Edward Cree 2018-03-08 1273 if (rxfh.rsvd8[0] || rxfh.rsvd8[1] || rxfh.rsvd8[2] || rxfh.rsvd32)
f062a3844845d2 net/core/ethtool.c Ben Hutchings 2014-05-15 1274 return -EINVAL;
84a1d9c4820080 net/core/ethtool.c Edward Cree 2018-03-08 1275 /* Most drivers don't handle rss_context, check it's 0 as well */
84a1d9c4820080 net/core/ethtool.c Edward Cree 2018-03-08 1276 if (rxfh.rss_context && !ops->set_rxfh_context)
84a1d9c4820080 net/core/ethtool.c Edward Cree 2018-03-08 1277 return -EOPNOTSUPP;
59b320b4d43d43 net/ethtool/ioctl.c Edward Cree 2023-04-03 1278 create = rxfh.rss_context == ETH_RXFH_CONTEXT_ALLOC;
59b320b4d43d43 net/ethtool/ioctl.c Edward Cree 2023-04-03 1279 if (create && ops->get_rxfh_priv_size)
59b320b4d43d43 net/ethtool/ioctl.c Edward Cree 2023-04-03 1280 dev_priv_size = ops->get_rxfh_priv_size(dev);
f062a3844845d2 net/core/ethtool.c Ben Hutchings 2014-05-15 1281
892311f66f2411 net/core/ethtool.c Eyal Perry 2014-12-02 1282 /* If either indir, hash key or function is valid, proceed further.
892311f66f2411 net/core/ethtool.c Eyal Perry 2014-12-02 1283 * Must request at least one change: indir size, hash key or function.
3de0b592394d17 net/core/ethtool.c Venkata Duvvuru 2014-04-21 1284 */
f062a3844845d2 net/core/ethtool.c Ben Hutchings 2014-05-15 1285 if ((rxfh.indir_size &&
f062a3844845d2 net/core/ethtool.c Ben Hutchings 2014-05-15 1286 rxfh.indir_size != ETH_RXFH_INDIR_NO_CHANGE &&
f062a3844845d2 net/core/ethtool.c Ben Hutchings 2014-05-15 1287 rxfh.indir_size != dev_indir_size) ||
f062a3844845d2 net/core/ethtool.c Ben Hutchings 2014-05-15 1288 (rxfh.key_size && (rxfh.key_size != dev_key_size)) ||
f062a3844845d2 net/core/ethtool.c Ben Hutchings 2014-05-15 1289 (rxfh.indir_size == ETH_RXFH_INDIR_NO_CHANGE &&
892311f66f2411 net/core/ethtool.c Eyal Perry 2014-12-02 1290 rxfh.key_size == 0 && rxfh.hfunc == ETH_RSS_HASH_NO_CHANGE))
3de0b592394d17 net/core/ethtool.c Venkata Duvvuru 2014-04-21 1291 return -EINVAL;
3de0b592394d17 net/core/ethtool.c Venkata Duvvuru 2014-04-21 1292
f062a3844845d2 net/core/ethtool.c Ben Hutchings 2014-05-15 1293 if (rxfh.indir_size != ETH_RXFH_INDIR_NO_CHANGE)
3de0b592394d17 net/core/ethtool.c Venkata Duvvuru 2014-04-21 1294 indir_bytes = dev_indir_size * sizeof(indir[0]);
3de0b592394d17 net/core/ethtool.c Venkata Duvvuru 2014-04-21 1295
f062a3844845d2 net/core/ethtool.c Ben Hutchings 2014-05-15 1296 rss_config = kzalloc(indir_bytes + rxfh.key_size, GFP_USER);
3de0b592394d17 net/core/ethtool.c Venkata Duvvuru 2014-04-21 1297 if (!rss_config)
3de0b592394d17 net/core/ethtool.c Venkata Duvvuru 2014-04-21 1298 return -ENOMEM;
3de0b592394d17 net/core/ethtool.c Venkata Duvvuru 2014-04-21 1299
3de0b592394d17 net/core/ethtool.c Venkata Duvvuru 2014-04-21 1300 rx_rings.cmd = ETHTOOL_GRXRINGS;
3de0b592394d17 net/core/ethtool.c Venkata Duvvuru 2014-04-21 1301 ret = ops->get_rxnfc(dev, &rx_rings, NULL);
3de0b592394d17 net/core/ethtool.c Venkata Duvvuru 2014-04-21 1302 if (ret)
7850f63f162051 net/core/ethtool.c Ben Hutchings 2011-12-15 1303 goto out;
3de0b592394d17 net/core/ethtool.c Venkata Duvvuru 2014-04-21 1304
84a1d9c4820080 net/core/ethtool.c Edward Cree 2018-03-08 1305 /* rxfh.indir_size == 0 means reset the indir table to default (master
84a1d9c4820080 net/core/ethtool.c Edward Cree 2018-03-08 1306 * context) or delete the context (other RSS contexts).
f062a3844845d2 net/core/ethtool.c Ben Hutchings 2014-05-15 1307 * rxfh.indir_size == ETH_RXFH_INDIR_NO_CHANGE means leave it unchanged.
3de0b592394d17 net/core/ethtool.c Venkata Duvvuru 2014-04-21 1308 */
f062a3844845d2 net/core/ethtool.c Ben Hutchings 2014-05-15 1309 if (rxfh.indir_size &&
f062a3844845d2 net/core/ethtool.c Ben Hutchings 2014-05-15 1310 rxfh.indir_size != ETH_RXFH_INDIR_NO_CHANGE) {
3de0b592394d17 net/core/ethtool.c Venkata Duvvuru 2014-04-21 1311 indir = (u32 *)rss_config;
3de0b592394d17 net/core/ethtool.c Venkata Duvvuru 2014-04-21 1312 ret = ethtool_copy_validate_indir(indir,
3de0b592394d17 net/core/ethtool.c Venkata Duvvuru 2014-04-21 1313 useraddr + rss_cfg_offset,
3de0b592394d17 net/core/ethtool.c Venkata Duvvuru 2014-04-21 1314 &rx_rings,
f062a3844845d2 net/core/ethtool.c Ben Hutchings 2014-05-15 1315 rxfh.indir_size);
3de0b592394d17 net/core/ethtool.c Venkata Duvvuru 2014-04-21 1316 if (ret)
3de0b592394d17 net/core/ethtool.c Venkata Duvvuru 2014-04-21 1317 goto out;
f062a3844845d2 net/core/ethtool.c Ben Hutchings 2014-05-15 1318 } else if (rxfh.indir_size == 0) {
84a1d9c4820080 net/core/ethtool.c Edward Cree 2018-03-08 1319 if (rxfh.rss_context == 0) {
3de0b592394d17 net/core/ethtool.c Venkata Duvvuru 2014-04-21 1320 indir = (u32 *)rss_config;
3de0b592394d17 net/core/ethtool.c Venkata Duvvuru 2014-04-21 1321 for (i = 0; i < dev_indir_size; i++)
3de0b592394d17 net/core/ethtool.c Venkata Duvvuru 2014-04-21 1322 indir[i] = ethtool_rxfh_indir_default(i, rx_rings.data);
84a1d9c4820080 net/core/ethtool.c Edward Cree 2018-03-08 1323 } else {
84a1d9c4820080 net/core/ethtool.c Edward Cree 2018-03-08 1324 delete = true;
84a1d9c4820080 net/core/ethtool.c Edward Cree 2018-03-08 1325 }
7850f63f162051 net/core/ethtool.c Ben Hutchings 2011-12-15 1326 }
3de0b592394d17 net/core/ethtool.c Venkata Duvvuru 2014-04-21 1327
f062a3844845d2 net/core/ethtool.c Ben Hutchings 2014-05-15 1328 if (rxfh.key_size) {
3de0b592394d17 net/core/ethtool.c Venkata Duvvuru 2014-04-21 1329 hkey = rss_config + indir_bytes;
3de0b592394d17 net/core/ethtool.c Venkata Duvvuru 2014-04-21 1330 if (copy_from_user(hkey,
3de0b592394d17 net/core/ethtool.c Venkata Duvvuru 2014-04-21 1331 useraddr + rss_cfg_offset + indir_bytes,
f062a3844845d2 net/core/ethtool.c Ben Hutchings 2014-05-15 1332 rxfh.key_size)) {
3de0b592394d17 net/core/ethtool.c Venkata Duvvuru 2014-04-21 1333 ret = -EFAULT;
3de0b592394d17 net/core/ethtool.c Venkata Duvvuru 2014-04-21 1334 goto out;
7850f63f162051 net/core/ethtool.c Ben Hutchings 2011-12-15 1335 }
278bc4296bd64f net/core/ethtool.c Ben Hutchings 2011-12-15 1336 }
7850f63f162051 net/core/ethtool.c Ben Hutchings 2011-12-15 1337
59b320b4d43d43 net/ethtool/ioctl.c Edward Cree 2023-04-03 1338 if (create) {
59b320b4d43d43 net/ethtool/ioctl.c Edward Cree 2023-04-03 1339 if (delete) {
59b320b4d43d43 net/ethtool/ioctl.c Edward Cree 2023-04-03 1340 ret = -EINVAL;
59b320b4d43d43 net/ethtool/ioctl.c Edward Cree 2023-04-03 1341 goto out;
59b320b4d43d43 net/ethtool/ioctl.c Edward Cree 2023-04-03 1342 }
59b320b4d43d43 net/ethtool/ioctl.c Edward Cree 2023-04-03 1343 ctx = kzalloc(ethtool_rxfh_context_size(dev_indir_size,
59b320b4d43d43 net/ethtool/ioctl.c Edward Cree 2023-04-03 1344 dev_key_size,
59b320b4d43d43 net/ethtool/ioctl.c Edward Cree 2023-04-03 1345 dev_priv_size),
59b320b4d43d43 net/ethtool/ioctl.c Edward Cree 2023-04-03 1346 GFP_USER);
59b320b4d43d43 net/ethtool/ioctl.c Edward Cree 2023-04-03 1347 if (!ctx) {
59b320b4d43d43 net/ethtool/ioctl.c Edward Cree 2023-04-03 1348 ret = -ENOMEM;
59b320b4d43d43 net/ethtool/ioctl.c Edward Cree 2023-04-03 1349 goto out;
59b320b4d43d43 net/ethtool/ioctl.c Edward Cree 2023-04-03 1350 }
59b320b4d43d43 net/ethtool/ioctl.c Edward Cree 2023-04-03 1351 ctx->indir_size = dev_indir_size;
59b320b4d43d43 net/ethtool/ioctl.c Edward Cree 2023-04-03 1352 ctx->key_size = dev_key_size;
59b320b4d43d43 net/ethtool/ioctl.c Edward Cree 2023-04-03 1353 ctx->hfunc = rxfh.hfunc;
59b320b4d43d43 net/ethtool/ioctl.c Edward Cree 2023-04-03 1354 ctx->priv_size = dev_priv_size;
59b320b4d43d43 net/ethtool/ioctl.c Edward Cree 2023-04-03 1355 } else if (rxfh.rss_context) {
59b320b4d43d43 net/ethtool/ioctl.c Edward Cree 2023-04-03 1356 ctx = idr_find(&dev->rss_ctx, rxfh.rss_context);
59b320b4d43d43 net/ethtool/ioctl.c Edward Cree 2023-04-03 1357 if (!ctx) {
59b320b4d43d43 net/ethtool/ioctl.c Edward Cree 2023-04-03 1358 ret = -ENOENT;
59b320b4d43d43 net/ethtool/ioctl.c Edward Cree 2023-04-03 1359 goto out;
59b320b4d43d43 net/ethtool/ioctl.c Edward Cree 2023-04-03 1360 }
59b320b4d43d43 net/ethtool/ioctl.c Edward Cree 2023-04-03 1361 }
59b320b4d43d43 net/ethtool/ioctl.c Edward Cree 2023-04-03 1362
84a1d9c4820080 net/core/ethtool.c Edward Cree 2018-03-08 1363 if (rxfh.rss_context)
84a1d9c4820080 net/core/ethtool.c Edward Cree 2018-03-08 1364 ret = ops->set_rxfh_context(dev, indir, hkey, rxfh.hfunc,
84a1d9c4820080 net/core/ethtool.c Edward Cree 2018-03-08 1365 &rxfh.rss_context, delete);
84a1d9c4820080 net/core/ethtool.c Edward Cree 2018-03-08 1366 else
892311f66f2411 net/core/ethtool.c Eyal Perry 2014-12-02 1367 ret = ops->set_rxfh(dev, indir, hkey, rxfh.hfunc);
d4ab4286276fcd net/core/ethtool.c Keller, Jacob E 2016-02-08 1368 if (ret)
d4ab4286276fcd net/core/ethtool.c Keller, Jacob E 2016-02-08 1369 goto out;
d4ab4286276fcd net/core/ethtool.c Keller, Jacob E 2016-02-08 1370
84a1d9c4820080 net/core/ethtool.c Edward Cree 2018-03-08 1371 if (copy_to_user(useraddr + offsetof(struct ethtool_rxfh, rss_context),
84a1d9c4820080 net/core/ethtool.c Edward Cree 2018-03-08 1372 &rxfh.rss_context, sizeof(rxfh.rss_context)))
84a1d9c4820080 net/core/ethtool.c Edward Cree 2018-03-08 1373 ret = -EFAULT;
84a1d9c4820080 net/core/ethtool.c Edward Cree 2018-03-08 1374
84a1d9c4820080 net/core/ethtool.c Edward Cree 2018-03-08 1375 if (!rxfh.rss_context) {
d4ab4286276fcd net/core/ethtool.c Keller, Jacob E 2016-02-08 1376 /* indicate whether rxfh was set to default */
d4ab4286276fcd net/core/ethtool.c Keller, Jacob E 2016-02-08 1377 if (rxfh.indir_size == 0)
d4ab4286276fcd net/core/ethtool.c Keller, Jacob E 2016-02-08 1378 dev->priv_flags &= ~IFF_RXFH_CONFIGURED;
d4ab4286276fcd net/core/ethtool.c Keller, Jacob E 2016-02-08 1379 else if (rxfh.indir_size != ETH_RXFH_INDIR_NO_CHANGE)
d4ab4286276fcd net/core/ethtool.c Keller, Jacob E 2016-02-08 1380 dev->priv_flags |= IFF_RXFH_CONFIGURED;
84a1d9c4820080 net/core/ethtool.c Edward Cree 2018-03-08 1381 }
59b320b4d43d43 net/ethtool/ioctl.c Edward Cree 2023-04-03 1382 /* Update rss_ctx tracking */
59b320b4d43d43 net/ethtool/ioctl.c Edward Cree 2023-04-03 1383 if (create) {
59b320b4d43d43 net/ethtool/ioctl.c Edward Cree 2023-04-03 1384 /* Ideally this should happen before calling the driver,
59b320b4d43d43 net/ethtool/ioctl.c Edward Cree 2023-04-03 1385 * so that we can fail more cleanly; but we don't have the
59b320b4d43d43 net/ethtool/ioctl.c Edward Cree 2023-04-03 1386 * context ID until the driver picks it, so we have to
59b320b4d43d43 net/ethtool/ioctl.c Edward Cree 2023-04-03 1387 * wait until after.
59b320b4d43d43 net/ethtool/ioctl.c Edward Cree 2023-04-03 1388 */
59b320b4d43d43 net/ethtool/ioctl.c Edward Cree 2023-04-03 1389 if (WARN_ON(idr_find(&dev->rss_ctx, rxfh.rss_context)))
59b320b4d43d43 net/ethtool/ioctl.c Edward Cree 2023-04-03 1390 /* context ID reused, our tracking is screwed */
59b320b4d43d43 net/ethtool/ioctl.c Edward Cree 2023-04-03 1391 goto out;
59b320b4d43d43 net/ethtool/ioctl.c Edward Cree 2023-04-03 1392 /* Allocate the exact ID the driver gave us */
59b320b4d43d43 net/ethtool/ioctl.c Edward Cree 2023-04-03 1393 WARN_ON(idr_alloc(&dev->rss_ctx, ctx, rxfh.rss_context,
59b320b4d43d43 net/ethtool/ioctl.c Edward Cree 2023-04-03 1394 rxfh.rss_context + 1, GFP_KERNEL) !=
59b320b4d43d43 net/ethtool/ioctl.c Edward Cree 2023-04-03 1395 rxfh.rss_context);
59b320b4d43d43 net/ethtool/ioctl.c Edward Cree 2023-04-03 1396 ctx->indir_no_change = rxfh.indir_size == ETH_RXFH_INDIR_NO_CHANGE;
59b320b4d43d43 net/ethtool/ioctl.c Edward Cree 2023-04-03 1397 ctx->key_no_change = !rxfh.key_size;
59b320b4d43d43 net/ethtool/ioctl.c Edward Cree 2023-04-03 1398 }
59b320b4d43d43 net/ethtool/ioctl.c Edward Cree 2023-04-03 1399 if (delete) {
59b320b4d43d43 net/ethtool/ioctl.c Edward Cree 2023-04-03 1400 WARN_ON(idr_remove(&dev->rss_ctx, rxfh.rss_context) != ctx);
59b320b4d43d43 net/ethtool/ioctl.c Edward Cree 2023-04-03 1401 kfree(ctx);59b320b4d43d43 net/ethtool/ioctl.c Edward Cree 2023-04-03 @1402 } else if (ctx) {
"ctx" is either non-NULL or uninitialized so this condition doesn't make sense.
59b320b4d43d43 net/ethtool/ioctl.c Edward Cree 2023-04-03 1403 if (indir) {
59b320b4d43d43 net/ethtool/ioctl.c Edward Cree 2023-04-03 1404 for (i = 0; i < dev_indir_size; i++)
59b320b4d43d43 net/ethtool/ioctl.c Edward Cree 2023-04-03 1405 ethtool_rxfh_context_indir(ctx)[i] = indir[i];
59b320b4d43d43 net/ethtool/ioctl.c Edward Cree 2023-04-03 1406 ctx->indir_no_change = 0;
59b320b4d43d43 net/ethtool/ioctl.c Edward Cree 2023-04-03 1407 }
59b320b4d43d43 net/ethtool/ioctl.c Edward Cree 2023-04-03 1408 if (hkey) {
59b320b4d43d43 net/ethtool/ioctl.c Edward Cree 2023-04-03 1409 memcpy(ethtool_rxfh_context_key(ctx), hkey,
59b320b4d43d43 net/ethtool/ioctl.c Edward Cree 2023-04-03 1410 dev_key_size);
59b320b4d43d43 net/ethtool/ioctl.c Edward Cree 2023-04-03 1411 ctx->key_no_change = 0;
59b320b4d43d43 net/ethtool/ioctl.c Edward Cree 2023-04-03 1412 }
59b320b4d43d43 net/ethtool/ioctl.c Edward Cree 2023-04-03 1413 if (rxfh.hfunc != ETH_RSS_HASH_NO_CHANGE)
59b320b4d43d43 net/ethtool/ioctl.c Edward Cree 2023-04-03 1414 ctx->hfunc = rxfh.hfunc;
59b320b4d43d43 net/ethtool/ioctl.c Edward Cree 2023-04-03 1415 }
a5b6ee291e39e2 net/core/ethtool.c Ben Hutchings 2010-06-30 1416
a5b6ee291e39e2 net/core/ethtool.c Ben Hutchings 2010-06-30 1417 out:
3de0b592394d17 net/core/ethtool.c Venkata Duvvuru 2014-04-21 1418 kfree(rss_config);
a5b6ee291e39e2 net/core/ethtool.c Ben Hutchings 2010-06-30 1419 return ret;
a5b6ee291e39e2 net/core/ethtool.c Ben Hutchings 2010-06-30 1420 }Signature · 2 lines
0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests
Re: [RFC PATCH net-next 2/6] net: ethtool: record custom RSS contexts in the IDR
Quoted 2 lines · Dan Carpenter
New smatch warnings:
net/ethtool/ioctl.c:1402ethtool_set_rxfh()error: uninitialized symbol 'ctx'.
Yup, it needs to be initialised to NULL for the default context case. Thanks for catching.
kernel test robot
build botRe: [RFC PATCH net-next 4/6] net: ethtool: pass ctx_priv and create into .set_rxfh_context
In reply to [email protected]kernel test robot noticed the following build errors:
Hi,
[This is a private test report for your RFC patch.] kernel test robot noticed the following build errors:
[auto build test ERROR on net-next/main]
url: https://github.com/intel-lab-lkp/linux/commits/edward-cree-amd-com/net-ethtool-attach-an-IDR-of-custom-RSS-contexts-to-a-netdevice/20230404-003917 patch link: https://lore.kernel.org/r/2b0bb0b96c09cc79d39ef79ce6733fc0244c5548.1680538846.git.ecree.xilinx%40gmail.com patch subject: [RFC PATCH net-next 4/6] net: ethtool: pass ctx_priv and create into .set_rxfh_context config: riscv-allmodconfig (https://download.01.org/0day-ci/archive/20230412/[email protected]/config) compiler: riscv64-linux-gcc (GCC) 12.1.0
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# https://github.com/intel-lab-lkp/linux/commit/44c47024e39be318c99069a6e3ffc9ef18a29cfe
git remote add linux-review https://github.com/intel-lab-lkp/linux
git fetch --no-tags linux-review edward-cree-amd-com/net-ethtool-attach-an-IDR-of-custom-RSS-contexts-to-a-netdevice/20230404-003917
git checkout 44c47024e39be318c99069a6e3ffc9ef18a29cfe
# save the config file
mkdir build_dir && cp config build_dir/.config
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-12.1.0 make.cross W=1 O=build_dir ARCH=riscv olddefconfig
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-12.1.0 make.cross W=1 O=build_dir ARCH=riscv SHELL=/bin/bash drivers/gpio/ drivers/mtd/spi-nor/ drivers/net/ethernet/marvell/octeontx2/nic/ drivers/net/ethernet/netronome/nfp/ drivers/net/wireless/mediatek/mt76/mt7996/ drivers/nvmem/ drivers/rtc/ drivers/spi/ drivers/staging/media/tegra-video/ net/ipv4/
If you fix the issue, kindly add following tag where applicable
| Reported-by: kernel test robot <[email protected]>
| Link: https://lore.kernel.org/oe-kbuild-all/[email protected]/
All errors (new ones prefixed by >>):
>> drivers/net/ethernet/marvell/octeontx2/nic/otx2_ethtool.c:1447:35: error: initialization of 'int (*)(struct net_device *, struct ethtool_rxfh_context *, const u32 *, const u8 *, const u8, u32, bool, bool)' {aka 'int (*)(struct net_device *, struct ethtool_rxfh_context *, const unsigned int *, const unsigned char *, const unsigned char, unsigned int, _Bool, _Bool)'} from incompatible pointer type 'int (*)(struct net_device *, const u32 *, const u8 *, const u8, u32 *, bool)' {aka 'int (*)(struct net_device *, const unsigned int *, const unsigned char *, const unsigned char, unsigned int *, _Bool)'} [-Werror=incompatible-pointer-types] 1447 | .set_rxfh_context = otx2_set_rxfh_context,
| ^~~~~~~~~~~~~~~~~~~~~
drivers/net/ethernet/marvell/octeontx2/nic/otx2_ethtool.c:1447:35: note: (near initialization for 'otx2vf_ethtool_ops.set_rxfh_context')
cc1: some warnings being treated as errors
vim +1447 drivers/net/ethernet/marvell/octeontx2/nic/otx2_ethtool.c
1a50280c25ecfb Christina Jacob 2021-02-09 1426
05c22b5431488d Tomasz Duszynski 2020-03-21 1427 static const struct ethtool_ops otx2vf_ethtool_ops = {
05c22b5431488d Tomasz Duszynski 2020-03-21 1428 .supported_coalesce_params = ETHTOOL_COALESCE_USECS |
619c010a65391d Suman Ghosh 2022-06-12 1429 ETHTOOL_COALESCE_MAX_FRAMES |
619c010a65391d Suman Ghosh 2022-06-12 1430 ETHTOOL_COALESCE_USE_ADAPTIVE,
68258596cbc9a6 Subbaraya Sundeep 2022-02-23 1431 .supported_ring_params = ETHTOOL_RING_USE_RX_BUF_LEN |
68258596cbc9a6 Subbaraya Sundeep 2022-02-23 1432 ETHTOOL_RING_USE_CQE_SIZE,
05c22b5431488d Tomasz Duszynski 2020-03-21 1433 .get_link = otx2_get_link,
05c22b5431488d Tomasz Duszynski 2020-03-21 1434 .get_drvinfo = otx2vf_get_drvinfo,
05c22b5431488d Tomasz Duszynski 2020-03-21 1435 .get_strings = otx2vf_get_strings,
05c22b5431488d Tomasz Duszynski 2020-03-21 1436 .get_ethtool_stats = otx2vf_get_ethtool_stats,
05c22b5431488d Tomasz Duszynski 2020-03-21 1437 .get_sset_count = otx2vf_get_sset_count,
05c22b5431488d Tomasz Duszynski 2020-03-21 1438 .set_channels = otx2_set_channels,
05c22b5431488d Tomasz Duszynski 2020-03-21 1439 .get_channels = otx2_get_channels,
3cffaed2136cd6 Rakesh Babu 2021-08-17 1440 .get_rxnfc = otx2_get_rxnfc,
3cffaed2136cd6 Rakesh Babu 2021-08-17 1441 .set_rxnfc = otx2_set_rxnfc,
05c22b5431488d Tomasz Duszynski 2020-03-21 1442 .get_rxfh_key_size = otx2_get_rxfh_key_size,
05c22b5431488d Tomasz Duszynski 2020-03-21 1443 .get_rxfh_indir_size = otx2_get_rxfh_indir_size,
05c22b5431488d Tomasz Duszynski 2020-03-21 1444 .get_rxfh = otx2_get_rxfh,
05c22b5431488d Tomasz Duszynski 2020-03-21 1445 .set_rxfh = otx2_set_rxfh,
81a4362016e7d8 Geetha sowjanya 2021-01-04 1446 .get_rxfh_context = otx2_get_rxfh_context,
81a4362016e7d8 Geetha sowjanya 2021-01-04 @1447 .set_rxfh_context = otx2_set_rxfh_context,
05c22b5431488d Tomasz Duszynski 2020-03-21 1448 .get_ringparam = otx2_get_ringparam,
05c22b5431488d Tomasz Duszynski 2020-03-21 1449 .set_ringparam = otx2_set_ringparam,
05c22b5431488d Tomasz Duszynski 2020-03-21 1450 .get_coalesce = otx2_get_coalesce,
05c22b5431488d Tomasz Duszynski 2020-03-21 1451 .set_coalesce = otx2_set_coalesce,
05c22b5431488d Tomasz Duszynski 2020-03-21 1452 .get_msglevel = otx2_get_msglevel,
05c22b5431488d Tomasz Duszynski 2020-03-21 1453 .set_msglevel = otx2_set_msglevel,
05c22b5431488d Tomasz Duszynski 2020-03-21 1454 .get_pauseparam = otx2_get_pauseparam,
05c22b5431488d Tomasz Duszynski 2020-03-21 1455 .set_pauseparam = otx2_set_pauseparam,
1a50280c25ecfb Christina Jacob 2021-02-09 1456 .get_link_ksettings = otx2vf_get_link_ksettings,
43510ef4ddad39 Naveen Mamindlapalli 2021-09-28 1457 .get_ts_info = otx2_get_ts_info,
05c22b5431488d Tomasz Duszynski 2020-03-21 1458 };
05c22b5431488d Tomasz Duszynski 2020-03-21 1459 Signature · 2 lines
0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests