Commit 01f5f35a authored by Jakub Kicinski's avatar Jakub Kicinski
Browse files

Merge branch 'net-ethtool-fixes-for-hds-threshold'

Jakub Kicinski says:

====================
net: ethtool: fixes for HDS threshold

Quick follow up on the HDS threshold work, since the merge window
is upon us.

Fix the bnxt implementation to apply the settings right away,
because we update the parameters _after_ configuring HW user
needed to reconfig the device twice to get the settings to stick.

For this I took the liberty of moving the config to a separate
struct. This follows my original thinking for the queue API.
It should also fit more neatly into how many drivers which
support safe config update operate. Drivers can allocate
new objects using the "pending" struct.

netdevsim:

  KTAP version 1
  1..7
  ok 1 hds.get_hds
  ok 2 hds.get_hds_thresh
  ok 3 hds.set_hds_disable
  ok 4 hds.set_hds_enable
  ok 5 hds.set_hds_thresh_zero
  ok 6 hds.set_hds_thresh_max
  ok 7 hds.set_hds_thresh_gt
  # Totals: pass:7 fail:0 xfail:0 xpass:0 skip:0 error:0

bnxt:

  KTAP version 1
  1..7
  ok 1 hds.get_hds
  ok 2 hds.get_hds_thresh
  ok 3 hds.set_hds_disable # SKIP disabling of HDS not supported by the device
  ok 4 hds.set_hds_enable
  ok 5 hds.set_hds_thresh_zero
  ok 6 hds.set_hds_thresh_max
  ok 7 hds.set_hds_thresh_gt
  # Totals: pass:6 fail:0 xfail:0 xpass:0 skip:1 error:0

v1: https://lore.kernel.org/20250117194815.1514410-1-kuba@kernel.org
====================

Link: https://patch.msgid.link/20250119020518.1962249-1-kuba@kernel.org


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parents e81fdf70 99d028c6
Loading
Loading
Loading
Loading
+11 −5
Original line number Diff line number Diff line
@@ -4609,8 +4609,13 @@ void bnxt_set_tpa_flags(struct bnxt *bp)

static void bnxt_init_ring_params(struct bnxt *bp)
{
	unsigned int rx_size;

	bp->rx_copybreak = BNXT_DEFAULT_RX_COPYBREAK;
	bp->dev->ethtool->hds_thresh = BNXT_DEFAULT_RX_COPYBREAK;
	/* Try to fit 4 chunks into a 4k page */
	rx_size = SZ_1K -
		NET_SKB_PAD - SKB_DATA_ALIGN(sizeof(struct skb_shared_info));
	bp->dev->cfg->hds_thresh = max(BNXT_DEFAULT_RX_COPYBREAK, rx_size);
}

/* bp->rx_ring_size, bp->tx_ring_size, dev->mtu, BNXT_FLAG_{G|L}RO flags must
@@ -4671,9 +4676,10 @@ void bnxt_set_ring_params(struct bnxt *bp)
				  ALIGN(max(NET_SKB_PAD, XDP_PACKET_HEADROOM), 8) -
				  SKB_DATA_ALIGN(sizeof(struct skb_shared_info));
		} else {
			rx_size = SKB_DATA_ALIGN(max(BNXT_DEFAULT_RX_COPYBREAK,
						     bp->rx_copybreak) +
						 NET_IP_ALIGN);
			rx_size = max3(BNXT_DEFAULT_RX_COPYBREAK,
				       bp->rx_copybreak,
				       bp->dev->cfg_pending->hds_thresh);
			rx_size = SKB_DATA_ALIGN(rx_size + NET_IP_ALIGN);
			rx_space = rx_size + NET_SKB_PAD +
				SKB_DATA_ALIGN(sizeof(struct skb_shared_info));
		}
@@ -6585,7 +6591,7 @@ static void bnxt_hwrm_update_rss_hash_cfg(struct bnxt *bp)

static int bnxt_hwrm_vnic_set_hds(struct bnxt *bp, struct bnxt_vnic_info *vnic)
{
	u16 hds_thresh = (u16)bp->dev->ethtool->hds_thresh;
	u16 hds_thresh = (u16)bp->dev->cfg_pending->hds_thresh;
	struct hwrm_vnic_plcmodes_cfg_input *req;
	int rc;

+2 −2
Original line number Diff line number Diff line
@@ -24,6 +24,7 @@
#include <linux/ptp_clock_kernel.h>
#include <linux/net_tstamp.h>
#include <linux/timecounter.h>
#include <net/netdev_queues.h>
#include <net/netlink.h>
#include "bnxt_hsi.h"
#include "bnxt.h"
@@ -834,7 +835,6 @@ static void bnxt_get_ringparam(struct net_device *dev,
	ering->rx_jumbo_pending = bp->rx_agg_ring_size;
	ering->tx_pending = bp->tx_ring_size;

	kernel_ering->hds_thresh = dev->ethtool->hds_thresh;
	kernel_ering->hds_thresh_max = BNXT_HDS_THRESHOLD_MAX;
}

@@ -852,7 +852,7 @@ static int bnxt_set_ringparam(struct net_device *dev,
	    (ering->tx_pending < BNXT_MIN_TX_DESC_CNT))
		return -EINVAL;

	hds_config_mod = tcp_data_split != dev->ethtool->hds_config;
	hds_config_mod = tcp_data_split != dev->cfg->hds_config;
	if (tcp_data_split == ETHTOOL_TCP_DATA_SPLIT_DISABLED && hds_config_mod)
		return -EINVAL;

+1 −5
Original line number Diff line number Diff line
@@ -3,6 +3,7 @@

#include <linux/debugfs.h>
#include <linux/random.h>
#include <net/netdev_queues.h>

#include "netdevsim.h"

@@ -71,8 +72,6 @@ static void nsim_get_ringparam(struct net_device *dev,
	struct netdevsim *ns = netdev_priv(dev);

	memcpy(ring, &ns->ethtool.ring, sizeof(ns->ethtool.ring));
	kernel_ring->tcp_data_split = dev->ethtool->hds_config;
	kernel_ring->hds_thresh = dev->ethtool->hds_thresh;
	kernel_ring->hds_thresh_max = NSIM_HDS_THRESHOLD_MAX;

	if (kernel_ring->tcp_data_split == ETHTOOL_TCP_DATA_SPLIT_UNKNOWN)
@@ -189,9 +188,6 @@ static void nsim_ethtool_ring_init(struct netdevsim *ns)
	ns->ethtool.ring.rx_jumbo_max_pending = 4096;
	ns->ethtool.ring.rx_mini_max_pending = 4096;
	ns->ethtool.ring.tx_max_pending = 4096;

	ns->netdev->ethtool->hds_config = ETHTOOL_TCP_DATA_SPLIT_UNKNOWN;
	ns->netdev->ethtool->hds_thresh = 0;
}

void nsim_ethtool_init(struct netdevsim *ns)
+5 −5
Original line number Diff line number Diff line
@@ -55,10 +55,10 @@ static int nsim_forward_skb(struct net_device *dev, struct sk_buff *skb,
static netdev_tx_t nsim_start_xmit(struct sk_buff *skb, struct net_device *dev)
{
	struct netdevsim *ns = netdev_priv(dev);
	struct ethtool_netdev_state *ethtool;
	struct net_device *peer_dev;
	unsigned int len = skb->len;
	struct netdevsim *peer_ns;
	struct netdev_config *cfg;
	struct nsim_rq *rq;
	int rxq;

@@ -76,11 +76,11 @@ static netdev_tx_t nsim_start_xmit(struct sk_buff *skb, struct net_device *dev)
		rxq = rxq % peer_dev->num_rx_queues;
	rq = peer_ns->rq[rxq];

	ethtool = peer_dev->ethtool;
	cfg = peer_dev->cfg;
	if (skb_is_nonlinear(skb) &&
	    (ethtool->hds_config != ETHTOOL_TCP_DATA_SPLIT_ENABLED ||
	     (ethtool->hds_config == ETHTOOL_TCP_DATA_SPLIT_ENABLED &&
	      ethtool->hds_thresh > len)))
	    (cfg->hds_config != ETHTOOL_TCP_DATA_SPLIT_ENABLED ||
	     (cfg->hds_config == ETHTOOL_TCP_DATA_SPLIT_ENABLED &&
	      cfg->hds_thresh > len)))
		skb_linearize(skb);

	skb_tx_timestamp(skb);
+0 −4
Original line number Diff line number Diff line
@@ -1171,16 +1171,12 @@ 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_thresh:		HDS Threshold value.
 * @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;
	u32			hds_thresh;
	u8			hds_config;
	unsigned		wol_enabled:1;
	unsigned		module_fw_flash_in_progress:1;
};
Loading