Message ID | 20241218144530.2963326-3-ap420073@gmail.com (mailing list archive) |
---|---|
State | Changes Requested |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | bnxt_en: implement tcp-data-split and thresh option | expand |
On Wed, 18 Dec 2024 14:45:23 +0000 Taehee Yoo wrote: > When tcp-data-split is UNKNOWN mode, drivers arbitrarily handle it. > For example, bnxt_en driver automatically enables if at least one of > LRO/GRO/JUMBO is enabled. > If tcp-data-split is UNKNOWN and LRO is enabled, a driver returns > ENABLES of tcp-data-split, not UNKNOWN. > So, `ethtool -g eth0` shows tcp-data-split is enabled. > > The problem is in the setting situation. > In the ethnl_set_rings(), it first calls get_ringparam() to get the > current driver's config. > At that moment, if driver's tcp-data-split config is UNKNOWN, it returns > ENABLE if LRO/GRO/JUMBO is enabled. > Then, it sets values from the user and driver's current config to > kernel_ethtool_ringparam. > Last it calls .set_ringparam(). > The driver, especially bnxt_en driver receives > ETHTOOL_TCP_DATA_SPLIT_ENABLED. > But it can't distinguish whether it is set by the user or just the > current config. > > When user updates ring parameter, the new hds_config value is updated > and current hds_config value is stored to old_hdsconfig. > Driver's .set_ringparam() callback can distinguish a passed > tcp-data-split value is came from user explicitly. > If .set_ringparam() is failed, hds_config is rollbacked immediately. > > Suggested-by: Jakub Kicinski <kuba@kernel.org> > Signed-off-by: Taehee Yoo <ap420073@gmail.com> Reviewed-by: Jakub Kicinski <kuba@kernel.org>
diff --git a/include/linux/ethtool.h b/include/linux/ethtool.h index f711bfd75c4d..4e451084d58a 100644 --- a/include/linux/ethtool.h +++ b/include/linux/ethtool.h @@ -1134,12 +1134,14 @@ int ethtool_virtdev_set_link_ksettings(struct net_device *dev, * @rss_ctx: XArray of custom RSS contexts * @rss_lock: Protects entries in @rss_ctx. May be taken from * within RTNL. + * @hds_config: HDS value from userspace. * @wol_enabled: Wake-on-LAN is enabled * @module_fw_flash_in_progress: Module firmware flashing is in progress. */ struct ethtool_netdev_state { struct xarray rss_ctx; struct mutex rss_lock; + u8 hds_config; unsigned wol_enabled:1; unsigned module_fw_flash_in_progress:1; }; diff --git a/net/ethtool/rings.c b/net/ethtool/rings.c index b7865a14fdf8..2e8239a76234 100644 --- a/net/ethtool/rings.c +++ b/net/ethtool/rings.c @@ -203,6 +203,7 @@ ethnl_set_rings(struct ethnl_req_info *req_info, struct genl_info *info) dev->ethtool_ops->get_ringparam(dev, &ringparam, &kernel_ringparam, info->extack); + kernel_ringparam.tcp_data_split = dev->ethtool->hds_config; ethnl_update_u32(&ringparam.rx_pending, tb[ETHTOOL_A_RINGS_RX], &mod); ethnl_update_u32(&ringparam.rx_mini_pending, @@ -252,6 +253,9 @@ ethnl_set_rings(struct ethnl_req_info *req_info, struct genl_info *info) ret = dev->ethtool_ops->set_ringparam(dev, &ringparam, &kernel_ringparam, info->extack); + if (!ret) + dev->ethtool->hds_config = kernel_ringparam.tcp_data_split; + return ret < 0 ? ret : 1; }
When tcp-data-split is UNKNOWN mode, drivers arbitrarily handle it. For example, bnxt_en driver automatically enables if at least one of LRO/GRO/JUMBO is enabled. If tcp-data-split is UNKNOWN and LRO is enabled, a driver returns ENABLES of tcp-data-split, not UNKNOWN. So, `ethtool -g eth0` shows tcp-data-split is enabled. The problem is in the setting situation. In the ethnl_set_rings(), it first calls get_ringparam() to get the current driver's config. At that moment, if driver's tcp-data-split config is UNKNOWN, it returns ENABLE if LRO/GRO/JUMBO is enabled. Then, it sets values from the user and driver's current config to kernel_ethtool_ringparam. Last it calls .set_ringparam(). The driver, especially bnxt_en driver receives ETHTOOL_TCP_DATA_SPLIT_ENABLED. But it can't distinguish whether it is set by the user or just the current config. When user updates ring parameter, the new hds_config value is updated and current hds_config value is stored to old_hdsconfig. Driver's .set_ringparam() callback can distinguish a passed tcp-data-split value is came from user explicitly. If .set_ringparam() is failed, hds_config is rollbacked immediately. Suggested-by: Jakub Kicinski <kuba@kernel.org> Signed-off-by: Taehee Yoo <ap420073@gmail.com> --- v6: - use hds_config instead of using tcp_data_split_mod. v5: - Patch added. include/linux/ethtool.h | 2 ++ net/ethtool/rings.c | 4 ++++ 2 files changed, 6 insertions(+)