Message ID | 20241113173222.372128-4-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, Nov 13, 2024 at 05:32:17PM +0000, Taehee Yoo wrote: > NICs that uses bnxt_en driver supports tcp-data-split feature by the > name of HDS(header-data-split). > But there is no implementation for the HDS to enable by ethtool. > Only getting the current HDS status is implemented and The HDS is just > automatically enabled only when either LRO, HW-GRO, or JUMBO is enabled. > The hds_threshold follows rx-copybreak value. and it was unchangeable. > > This implements `ethtool -G <interface name> tcp-data-split <value>` > command option. > The value can be <on> and <auto>. > The value is <auto> and one of LRO/GRO/JUMBO is enabled, HDS is > automatically enabled and all LRO/GRO/JUMBO are disabled, HDS is > automatically disabled. > > HDS feature relies on the aggregation ring. > So, if HDS is enabled, the bnxt_en driver initializes the aggregation ring. > This is the reason why BNXT_FLAG_AGG_RINGS contains HDS condition. > > Tested-by: Stanislav Fomichev <sdf@fomichev.me> > Signed-off-by: Taehee Yoo <ap420073@gmail.com> Tested-by: Andy Gospodarek <gospo@broadcom.com> > --- > > v5: > - Do not set HDS if XDP is attached. > - Enable tcp-data-split only when tcp_data_split_mod is true. > > v4: > - Do not support disable tcp-data-split. > - Add Test tag from Stanislav. > > v3: > - No changes. > > v2: > - Do not set hds_threshold to 0. > > drivers/net/ethernet/broadcom/bnxt/bnxt.c | 2 +- > drivers/net/ethernet/broadcom/bnxt/bnxt.h | 5 +++-- > .../net/ethernet/broadcom/bnxt/bnxt_ethtool.c | 19 +++++++++++++++++++ > 3 files changed, 23 insertions(+), 3 deletions(-) > > diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c > index d521b8918c02..608bcca71676 100644 > --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c > +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c > @@ -4474,7 +4474,7 @@ void bnxt_set_ring_params(struct bnxt *bp) > bp->rx_agg_ring_size = 0; > bp->rx_agg_nr_pages = 0; > > - if (bp->flags & BNXT_FLAG_TPA) > + if (bp->flags & BNXT_FLAG_TPA || bp->flags & BNXT_FLAG_HDS) > agg_factor = min_t(u32, 4, 65536 / BNXT_RX_PAGE_SIZE); > > bp->flags &= ~BNXT_FLAG_JUMBO; > diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.h b/drivers/net/ethernet/broadcom/bnxt/bnxt.h > index d1eef880eec5..3a7d2f3ebb2a 100644 > --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.h > +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.h > @@ -2202,8 +2202,6 @@ struct bnxt { > #define BNXT_FLAG_TPA (BNXT_FLAG_LRO | BNXT_FLAG_GRO) > #define BNXT_FLAG_JUMBO 0x10 > #define BNXT_FLAG_STRIP_VLAN 0x20 > - #define BNXT_FLAG_AGG_RINGS (BNXT_FLAG_JUMBO | BNXT_FLAG_GRO | \ > - BNXT_FLAG_LRO) > #define BNXT_FLAG_RFS 0x100 > #define BNXT_FLAG_SHARED_RINGS 0x200 > #define BNXT_FLAG_PORT_STATS 0x400 > @@ -2224,6 +2222,9 @@ struct bnxt { > #define BNXT_FLAG_ROCE_MIRROR_CAP 0x4000000 > #define BNXT_FLAG_TX_COAL_CMPL 0x8000000 > #define BNXT_FLAG_PORT_STATS_EXT 0x10000000 > + #define BNXT_FLAG_HDS 0x20000000 > + #define BNXT_FLAG_AGG_RINGS (BNXT_FLAG_JUMBO | BNXT_FLAG_GRO | \ > + BNXT_FLAG_LRO | BNXT_FLAG_HDS) > > #define BNXT_FLAG_ALL_CONFIG_FEATS (BNXT_FLAG_TPA | \ > BNXT_FLAG_RFS | \ > diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c b/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c > index adf30d1f738f..b0054eef389b 100644 > --- a/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c > +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c > @@ -840,6 +840,8 @@ static int bnxt_set_ringparam(struct net_device *dev, > struct kernel_ethtool_ringparam *kernel_ering, > struct netlink_ext_ack *extack) > { > + u8 tcp_data_split_mod = kernel_ering->tcp_data_split_mod; > + u8 tcp_data_split = kernel_ering->tcp_data_split; > struct bnxt *bp = netdev_priv(dev); > > if ((ering->rx_pending > BNXT_MAX_RX_DESC_CNT) || > @@ -847,9 +849,25 @@ static int bnxt_set_ringparam(struct net_device *dev, > (ering->tx_pending < BNXT_MIN_TX_DESC_CNT)) > return -EINVAL; > > + if (tcp_data_split == ETHTOOL_TCP_DATA_SPLIT_DISABLED && > + tcp_data_split_mod) > + return -EOPNOTSUPP; > + > + if (tcp_data_split == ETHTOOL_TCP_DATA_SPLIT_ENABLED && > + tcp_data_split_mod && BNXT_RX_PAGE_MODE(bp)) { > + NL_SET_ERR_MSG_MOD(extack, "tcp-data-split is disallowed when XDP is attached"); > + return -EOPNOTSUPP; > + } > + > if (netif_running(dev)) > bnxt_close_nic(bp, false, false); > > + if (tcp_data_split == ETHTOOL_TCP_DATA_SPLIT_ENABLED && > + tcp_data_split_mod) > + bp->flags |= BNXT_FLAG_HDS; > + else if (tcp_data_split == ETHTOOL_TCP_DATA_SPLIT_UNKNOWN) > + bp->flags &= ~BNXT_FLAG_HDS; > + > bp->rx_ring_size = ering->rx_pending; > bp->tx_ring_size = ering->tx_pending; > bnxt_set_ring_params(bp); > @@ -5345,6 +5363,7 @@ const struct ethtool_ops bnxt_ethtool_ops = { > ETHTOOL_COALESCE_STATS_BLOCK_USECS | > ETHTOOL_COALESCE_USE_ADAPTIVE_RX | > ETHTOOL_COALESCE_USE_CQE, > + .supported_ring_params = ETHTOOL_RING_USE_TCP_DATA_SPLIT, > .get_link_ksettings = bnxt_get_link_ksettings, > .set_link_ksettings = bnxt_set_link_ksettings, > .get_fec_stats = bnxt_get_fec_stats, > -- > 2.34.1 >
On Wed, 13 Nov 2024 17:32:17 +0000 Taehee Yoo wrote: > NICs that uses bnxt_en driver supports tcp-data-split feature by the > name of HDS(header-data-split). > But there is no implementation for the HDS to enable by ethtool. > Only getting the current HDS status is implemented and The HDS is just > automatically enabled only when either LRO, HW-GRO, or JUMBO is enabled. > The hds_threshold follows rx-copybreak value. and it was unchangeable. > > This implements `ethtool -G <interface name> tcp-data-split <value>` > command option. > The value can be <on> and <auto>. > The value is <auto> and one of LRO/GRO/JUMBO is enabled, HDS is > automatically enabled and all LRO/GRO/JUMBO are disabled, HDS is > automatically disabled. > > HDS feature relies on the aggregation ring. > So, if HDS is enabled, the bnxt_en driver initializes the aggregation ring. > This is the reason why BNXT_FLAG_AGG_RINGS contains HDS condition. I may be missing some existing check but doesn't enabling XDP force page_mode which in turn clears BNXT_FLAG_AGG_RINGS, including HDS ? If user specifically requested HDS we should refuse to install XDP in non-multibuf mode. TBH a selftest under tools/testing/drivers/net would go a long way to make it clear we caught all cases. You can add a dummy netdevsim implementation for testing without bnxt present (some of the existing python tests can work with real drivers and netdevsim): https://github.com/linux-netdev/nipa/wiki/Running-driver-tests
On Fri, Nov 15, 2024 at 1:15 PM Jakub Kicinski <kuba@kernel.org> wrote: > Hi Jakub, Thank you so much for the review! > On Wed, 13 Nov 2024 17:32:17 +0000 Taehee Yoo wrote: > > NICs that uses bnxt_en driver supports tcp-data-split feature by the > > name of HDS(header-data-split). > > But there is no implementation for the HDS to enable by ethtool. > > Only getting the current HDS status is implemented and The HDS is just > > automatically enabled only when either LRO, HW-GRO, or JUMBO is enabled. > > The hds_threshold follows rx-copybreak value. and it was unchangeable. > > > > This implements `ethtool -G <interface name> tcp-data-split <value>` > > command option. > > The value can be <on> and <auto>. > > The value is <auto> and one of LRO/GRO/JUMBO is enabled, HDS is > > automatically enabled and all LRO/GRO/JUMBO are disabled, HDS is > > automatically disabled. > > > > HDS feature relies on the aggregation ring. > > So, if HDS is enabled, the bnxt_en driver initializes the aggregation ring. > > This is the reason why BNXT_FLAG_AGG_RINGS contains HDS condition. > > I may be missing some existing check but doesn't enabling XDP force > page_mode which in turn clears BNXT_FLAG_AGG_RINGS, including HDS ? > If user specifically requested HDS we should refuse to install XDP > in non-multibuf mode. Sorry, I missed adding this check. I added a check to reject setting HDS when XDP is attached. But, I didn't add a check to reject attaching XDP when HDS is enabled. bnxt driver doesn't allow setting HDS if XDP is attached even if it's multibuffer XDP. So, I will reject installing singlebuffer and multibuffer XDP if HDS is enabled. > > TBH a selftest under tools/testing/drivers/net would go a long way > to make it clear we caught all cases. You can add a dummy netdevsim > implementation for testing without bnxt present (some of the existing > python tests can work with real drivers and netdevsim): > https://github.com/linux-netdev/nipa/wiki/Running-driver-tests Thanks for that, I will try to use this selftest. I will add a dummy HDS feature for testing on the netdevsim. Thanks a lot! Taehee Yoo
diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c index d521b8918c02..608bcca71676 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c @@ -4474,7 +4474,7 @@ void bnxt_set_ring_params(struct bnxt *bp) bp->rx_agg_ring_size = 0; bp->rx_agg_nr_pages = 0; - if (bp->flags & BNXT_FLAG_TPA) + if (bp->flags & BNXT_FLAG_TPA || bp->flags & BNXT_FLAG_HDS) agg_factor = min_t(u32, 4, 65536 / BNXT_RX_PAGE_SIZE); bp->flags &= ~BNXT_FLAG_JUMBO; diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.h b/drivers/net/ethernet/broadcom/bnxt/bnxt.h index d1eef880eec5..3a7d2f3ebb2a 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.h +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.h @@ -2202,8 +2202,6 @@ struct bnxt { #define BNXT_FLAG_TPA (BNXT_FLAG_LRO | BNXT_FLAG_GRO) #define BNXT_FLAG_JUMBO 0x10 #define BNXT_FLAG_STRIP_VLAN 0x20 - #define BNXT_FLAG_AGG_RINGS (BNXT_FLAG_JUMBO | BNXT_FLAG_GRO | \ - BNXT_FLAG_LRO) #define BNXT_FLAG_RFS 0x100 #define BNXT_FLAG_SHARED_RINGS 0x200 #define BNXT_FLAG_PORT_STATS 0x400 @@ -2224,6 +2222,9 @@ struct bnxt { #define BNXT_FLAG_ROCE_MIRROR_CAP 0x4000000 #define BNXT_FLAG_TX_COAL_CMPL 0x8000000 #define BNXT_FLAG_PORT_STATS_EXT 0x10000000 + #define BNXT_FLAG_HDS 0x20000000 + #define BNXT_FLAG_AGG_RINGS (BNXT_FLAG_JUMBO | BNXT_FLAG_GRO | \ + BNXT_FLAG_LRO | BNXT_FLAG_HDS) #define BNXT_FLAG_ALL_CONFIG_FEATS (BNXT_FLAG_TPA | \ BNXT_FLAG_RFS | \ diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c b/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c index adf30d1f738f..b0054eef389b 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c @@ -840,6 +840,8 @@ static int bnxt_set_ringparam(struct net_device *dev, struct kernel_ethtool_ringparam *kernel_ering, struct netlink_ext_ack *extack) { + u8 tcp_data_split_mod = kernel_ering->tcp_data_split_mod; + u8 tcp_data_split = kernel_ering->tcp_data_split; struct bnxt *bp = netdev_priv(dev); if ((ering->rx_pending > BNXT_MAX_RX_DESC_CNT) || @@ -847,9 +849,25 @@ static int bnxt_set_ringparam(struct net_device *dev, (ering->tx_pending < BNXT_MIN_TX_DESC_CNT)) return -EINVAL; + if (tcp_data_split == ETHTOOL_TCP_DATA_SPLIT_DISABLED && + tcp_data_split_mod) + return -EOPNOTSUPP; + + if (tcp_data_split == ETHTOOL_TCP_DATA_SPLIT_ENABLED && + tcp_data_split_mod && BNXT_RX_PAGE_MODE(bp)) { + NL_SET_ERR_MSG_MOD(extack, "tcp-data-split is disallowed when XDP is attached"); + return -EOPNOTSUPP; + } + if (netif_running(dev)) bnxt_close_nic(bp, false, false); + if (tcp_data_split == ETHTOOL_TCP_DATA_SPLIT_ENABLED && + tcp_data_split_mod) + bp->flags |= BNXT_FLAG_HDS; + else if (tcp_data_split == ETHTOOL_TCP_DATA_SPLIT_UNKNOWN) + bp->flags &= ~BNXT_FLAG_HDS; + bp->rx_ring_size = ering->rx_pending; bp->tx_ring_size = ering->tx_pending; bnxt_set_ring_params(bp); @@ -5345,6 +5363,7 @@ const struct ethtool_ops bnxt_ethtool_ops = { ETHTOOL_COALESCE_STATS_BLOCK_USECS | ETHTOOL_COALESCE_USE_ADAPTIVE_RX | ETHTOOL_COALESCE_USE_CQE, + .supported_ring_params = ETHTOOL_RING_USE_TCP_DATA_SPLIT, .get_link_ksettings = bnxt_get_link_ksettings, .set_link_ksettings = bnxt_set_link_ksettings, .get_fec_stats = bnxt_get_fec_stats,