bpf.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [RFC net-next 0/6] update xdp_features flag according to NIC re-configuration
@ 2023-02-23 12:11 Lorenzo Bianconi
  2023-02-23 12:11 ` [RFC net-next 1/6] tools: ynl: fix render-max for flags definition Lorenzo Bianconi
                   ` (5 more replies)
  0 siblings, 6 replies; 11+ messages in thread
From: Lorenzo Bianconi @ 2023-02-23 12:11 UTC (permalink / raw)
  To: netdev
  Cc: bpf, davem, edumazet, kuba, pabeni, ast, daniel, hawk,
	john.fastabend, saeedm, tariqt, leon, shayagr, akiyano, darinzon,
	sgoutham, lorenzo.bianconi, toke

Take into account possible NIC configuration changes (e.g. LRO or tx/rx queues
reconfiguration) setting device xdp_features flag.
Introduce xdp_set_features_flag utility routine.

Lorenzo Bianconi (6):
  tools: ynl: fix render-max for flags definition
  xdp: add xdp_set_features_flag utility routine
  net: thunderx: take into account xdp_features setting tx/rx queues
  net: ena: take into account xdp_features setting tx/rx queues
  veth: take into account device reconfiguration for xdp_features flag
  net/mlx5e: take into account device reconfiguration for xdp_features
    flag

 Documentation/netlink/specs/netdev.yaml       |  1 +
 drivers/net/ethernet/amazon/ena/ena_ethtool.c | 15 +++++--
 drivers/net/ethernet/amazon/ena/ena_netdev.c  |  6 ++-
 .../ethernet/cavium/thunder/nicvf_ethtool.c   | 17 ++++---
 .../net/ethernet/cavium/thunder/nicvf_main.c  |  4 +-
 drivers/net/ethernet/mellanox/mlx5/core/en.h  |  1 +
 .../ethernet/mellanox/mlx5/core/en_ethtool.c  | 10 ++++-
 .../net/ethernet/mellanox/mlx5/core/en_main.c | 45 ++++++++++++++++---
 .../net/ethernet/mellanox/mlx5/core/en_rep.c  |  3 ++
 drivers/net/veth.c                            | 42 +++++++++++++++--
 include/net/xdp.h                             | 11 +++++
 include/uapi/linux/netdev.h                   |  2 +
 net/core/xdp.c                                | 26 ++++++++---
 tools/include/uapi/linux/netdev.h             |  2 +
 tools/net/ynl/ynl-gen-c.py                    | 11 +++--
 15 files changed, 162 insertions(+), 34 deletions(-)

-- 
2.39.2


^ permalink raw reply	[flat|nested] 11+ messages in thread

* [RFC net-next 1/6] tools: ynl: fix render-max for flags definition
  2023-02-23 12:11 [RFC net-next 0/6] update xdp_features flag according to NIC re-configuration Lorenzo Bianconi
@ 2023-02-23 12:11 ` Lorenzo Bianconi
  2023-02-23 17:09   ` Jakub Kicinski
  2023-02-23 12:11 ` [RFC net-next 2/6] xdp: add xdp_set_features_flag utility routine Lorenzo Bianconi
                   ` (4 subsequent siblings)
  5 siblings, 1 reply; 11+ messages in thread
From: Lorenzo Bianconi @ 2023-02-23 12:11 UTC (permalink / raw)
  To: netdev
  Cc: bpf, davem, edumazet, kuba, pabeni, ast, daniel, hawk,
	john.fastabend, saeedm, tariqt, leon, shayagr, akiyano, darinzon,
	sgoutham, lorenzo.bianconi, toke

Properly manage render-max property for flags definition type
introducing mask value and setting it to (last_element << 1) - 1
instead of adding max value set to last_element + 1

Fixes: be5bea1cc0bf ("net: add basic C code generators for Netlink")
Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
---
 tools/net/ynl/ynl-gen-c.py | 11 ++++++++---
 1 file changed, 8 insertions(+), 3 deletions(-)

diff --git a/tools/net/ynl/ynl-gen-c.py b/tools/net/ynl/ynl-gen-c.py
index 3942f24b9163..161ae02bee54 100755
--- a/tools/net/ynl/ynl-gen-c.py
+++ b/tools/net/ynl/ynl-gen-c.py
@@ -1995,9 +1995,14 @@ def render_uapi(family, cw):
 
             if const.get('render-max', False):
                 cw.nl()
-                max_name = c_upper(name_pfx + 'max')
-                cw.p('__' + max_name + ',')
-                cw.p(max_name + ' = (__' + max_name + ' - 1)')
+                if const['type'] == 'flags':
+                    max_name = c_upper(name_pfx + 'mask')
+                    max_val = f' = {(entry.user_value() << 1) - 1},'
+                    cw.p(max_name + max_val)
+                else:
+                    max_name = c_upper(name_pfx + 'max')
+                    cw.p('__' + max_name + ',')
+                    cw.p(max_name + ' = (__' + max_name + ' - 1)')
             cw.block_end(line=';')
             cw.nl()
         elif const['type'] == 'const':
-- 
2.39.2


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [RFC net-next 2/6] xdp: add xdp_set_features_flag utility routine
  2023-02-23 12:11 [RFC net-next 0/6] update xdp_features flag according to NIC re-configuration Lorenzo Bianconi
  2023-02-23 12:11 ` [RFC net-next 1/6] tools: ynl: fix render-max for flags definition Lorenzo Bianconi
@ 2023-02-23 12:11 ` Lorenzo Bianconi
  2023-02-23 12:11 ` [RFC net-next 3/6] net: thunderx: take into account xdp_features setting tx/rx queues Lorenzo Bianconi
                   ` (3 subsequent siblings)
  5 siblings, 0 replies; 11+ messages in thread
From: Lorenzo Bianconi @ 2023-02-23 12:11 UTC (permalink / raw)
  To: netdev
  Cc: bpf, davem, edumazet, kuba, pabeni, ast, daniel, hawk,
	john.fastabend, saeedm, tariqt, leon, shayagr, akiyano, darinzon,
	sgoutham, lorenzo.bianconi, toke

Introduce xdp_set_features_flag utility routine in order to update
dynamically xdp_features according to the dynamic hw configuration via
ethtool (e.g. changing number of hw rx/tx queues).
Add xdp_clear_features_flag() in order to clear all xdp_feature flag.

Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
---
 Documentation/netlink/specs/netdev.yaml |  1 +
 include/net/xdp.h                       | 11 +++++++++++
 include/uapi/linux/netdev.h             |  2 ++
 net/core/xdp.c                          | 26 ++++++++++++++++++-------
 tools/include/uapi/linux/netdev.h       |  2 ++
 5 files changed, 35 insertions(+), 7 deletions(-)

diff --git a/Documentation/netlink/specs/netdev.yaml b/Documentation/netlink/specs/netdev.yaml
index b4dcdae54ffd..8617d1cc68d6 100644
--- a/Documentation/netlink/specs/netdev.yaml
+++ b/Documentation/netlink/specs/netdev.yaml
@@ -7,6 +7,7 @@ definitions:
   -
     type: flags
     name: xdp-act
+    render-max: true
     entries:
       -
         name: basic
diff --git a/include/net/xdp.h b/include/net/xdp.h
index d517bfac937b..41c57b8b1671 100644
--- a/include/net/xdp.h
+++ b/include/net/xdp.h
@@ -428,12 +428,18 @@ MAX_XDP_METADATA_KFUNC,
 #ifdef CONFIG_NET
 u32 bpf_xdp_metadata_kfunc_id(int id);
 bool bpf_dev_bound_kfunc_id(u32 btf_id);
+void xdp_set_features_flag(struct net_device *dev, xdp_features_t val);
 void xdp_features_set_redirect_target(struct net_device *dev, bool support_sg);
 void xdp_features_clear_redirect_target(struct net_device *dev);
 #else
 static inline u32 bpf_xdp_metadata_kfunc_id(int id) { return 0; }
 static inline bool bpf_dev_bound_kfunc_id(u32 btf_id) { return false; }
 
+static inline void
+xdp_set_features_flag(struct net_device *dev, xdp_features_t val)
+{
+}
+
 static inline void
 xdp_features_set_redirect_target(struct net_device *dev, bool support_sg)
 {
@@ -445,4 +451,9 @@ xdp_features_clear_redirect_target(struct net_device *dev)
 }
 #endif
 
+static inline void xdp_clear_features_flag(struct net_device *dev)
+{
+	xdp_set_features_flag(dev, 0);
+}
+
 #endif /* __LINUX_NET_XDP_H__ */
diff --git a/include/uapi/linux/netdev.h b/include/uapi/linux/netdev.h
index 9ee459872600..4c8b517147b0 100644
--- a/include/uapi/linux/netdev.h
+++ b/include/uapi/linux/netdev.h
@@ -33,6 +33,8 @@ enum netdev_xdp_act {
 	NETDEV_XDP_ACT_HW_OFFLOAD = 16,
 	NETDEV_XDP_ACT_RX_SG = 32,
 	NETDEV_XDP_ACT_NDO_XMIT_SG = 64,
+
+	NETDEV_XDP_ACT_MASK = 127,
 };
 
 enum {
diff --git a/net/core/xdp.c b/net/core/xdp.c
index 8c92fc553317..87e654b7d06c 100644
--- a/net/core/xdp.c
+++ b/net/core/xdp.c
@@ -774,20 +774,32 @@ static int __init xdp_metadata_init(void)
 }
 late_initcall(xdp_metadata_init);
 
-void xdp_features_set_redirect_target(struct net_device *dev, bool support_sg)
+void xdp_set_features_flag(struct net_device *dev, xdp_features_t val)
 {
-	dev->xdp_features |= NETDEV_XDP_ACT_NDO_XMIT;
-	if (support_sg)
-		dev->xdp_features |= NETDEV_XDP_ACT_NDO_XMIT_SG;
+	val &= NETDEV_XDP_ACT_MASK;
+	if (dev->xdp_features == val)
+		return;
 
+	dev->xdp_features = val;
 	call_netdevice_notifiers(NETDEV_XDP_FEAT_CHANGE, dev);
 }
+EXPORT_SYMBOL_GPL(xdp_set_features_flag);
+
+void xdp_features_set_redirect_target(struct net_device *dev, bool support_sg)
+{
+	xdp_features_t val = (dev->xdp_features | NETDEV_XDP_ACT_NDO_XMIT);
+
+	if (support_sg)
+		val |= NETDEV_XDP_ACT_NDO_XMIT_SG;
+	xdp_set_features_flag(dev, val);
+}
 EXPORT_SYMBOL_GPL(xdp_features_set_redirect_target);
 
 void xdp_features_clear_redirect_target(struct net_device *dev)
 {
-	dev->xdp_features &= ~(NETDEV_XDP_ACT_NDO_XMIT |
-			       NETDEV_XDP_ACT_NDO_XMIT_SG);
-	call_netdevice_notifiers(NETDEV_XDP_FEAT_CHANGE, dev);
+	xdp_features_t val = dev->xdp_features;
+
+	val &= ~(NETDEV_XDP_ACT_NDO_XMIT | NETDEV_XDP_ACT_NDO_XMIT_SG);
+	xdp_set_features_flag(dev, val);
 }
 EXPORT_SYMBOL_GPL(xdp_features_clear_redirect_target);
diff --git a/tools/include/uapi/linux/netdev.h b/tools/include/uapi/linux/netdev.h
index 9ee459872600..4c8b517147b0 100644
--- a/tools/include/uapi/linux/netdev.h
+++ b/tools/include/uapi/linux/netdev.h
@@ -33,6 +33,8 @@ enum netdev_xdp_act {
 	NETDEV_XDP_ACT_HW_OFFLOAD = 16,
 	NETDEV_XDP_ACT_RX_SG = 32,
 	NETDEV_XDP_ACT_NDO_XMIT_SG = 64,
+
+	NETDEV_XDP_ACT_MASK = 127,
 };
 
 enum {
-- 
2.39.2


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [RFC net-next 3/6] net: thunderx: take into account xdp_features setting tx/rx queues
  2023-02-23 12:11 [RFC net-next 0/6] update xdp_features flag according to NIC re-configuration Lorenzo Bianconi
  2023-02-23 12:11 ` [RFC net-next 1/6] tools: ynl: fix render-max for flags definition Lorenzo Bianconi
  2023-02-23 12:11 ` [RFC net-next 2/6] xdp: add xdp_set_features_flag utility routine Lorenzo Bianconi
@ 2023-02-23 12:11 ` Lorenzo Bianconi
  2023-02-23 12:11 ` [RFC net-next 4/6] net: ena: " Lorenzo Bianconi
                   ` (2 subsequent siblings)
  5 siblings, 0 replies; 11+ messages in thread
From: Lorenzo Bianconi @ 2023-02-23 12:11 UTC (permalink / raw)
  To: netdev
  Cc: bpf, davem, edumazet, kuba, pabeni, ast, daniel, hawk,
	john.fastabend, saeedm, tariqt, leon, shayagr, akiyano, darinzon,
	sgoutham, lorenzo.bianconi, toke

thunderx nic allows xdp just if enough hw queues are available for XDP.
Take into account queues configuration setting xdp_features.

Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
---
 .../net/ethernet/cavium/thunder/nicvf_ethtool.c | 17 +++++++++++------
 .../net/ethernet/cavium/thunder/nicvf_main.c    |  4 +++-
 2 files changed, 14 insertions(+), 7 deletions(-)

diff --git a/drivers/net/ethernet/cavium/thunder/nicvf_ethtool.c b/drivers/net/ethernet/cavium/thunder/nicvf_ethtool.c
index e5c71f907852..d8d71bf97983 100644
--- a/drivers/net/ethernet/cavium/thunder/nicvf_ethtool.c
+++ b/drivers/net/ethernet/cavium/thunder/nicvf_ethtool.c
@@ -735,12 +735,17 @@ static int nicvf_set_channels(struct net_device *dev,
 	if (channel->tx_count > nic->max_queues)
 		return -EINVAL;
 
-	if (nic->xdp_prog &&
-	    ((channel->tx_count + channel->rx_count) > nic->max_queues)) {
-		netdev_err(nic->netdev,
-			   "XDP mode, RXQs + TXQs > Max %d\n",
-			   nic->max_queues);
-		return -EINVAL;
+	if (channel->tx_count + channel->rx_count > nic->max_queues) {
+		if (nic->xdp_prog) {
+			netdev_err(nic->netdev,
+				   "XDP mode, RXQs + TXQs > Max %d\n",
+				   nic->max_queues);
+			return -EINVAL;
+		}
+
+		xdp_clear_features_flag(nic->netdev);
+	} else if (!pass1_silicon(nic->pdev)) {
+		xdp_set_features_flag(dev, NETDEV_XDP_ACT_BASIC);
 	}
 
 	if (if_up)
diff --git a/drivers/net/ethernet/cavium/thunder/nicvf_main.c b/drivers/net/ethernet/cavium/thunder/nicvf_main.c
index 8b25313c7f6b..eff350e0bc2a 100644
--- a/drivers/net/ethernet/cavium/thunder/nicvf_main.c
+++ b/drivers/net/ethernet/cavium/thunder/nicvf_main.c
@@ -2218,7 +2218,9 @@ static int nicvf_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
 	netdev->netdev_ops = &nicvf_netdev_ops;
 	netdev->watchdog_timeo = NICVF_TX_TIMEOUT;
 
-	netdev->xdp_features = NETDEV_XDP_ACT_BASIC;
+	if (!pass1_silicon(nic->pdev) &&
+	    nic->rx_queues + nic->tx_queues <= nic->max_queues)
+		netdev->xdp_features = NETDEV_XDP_ACT_BASIC;
 
 	/* MTU range: 64 - 9200 */
 	netdev->min_mtu = NIC_HW_MIN_FRS;
-- 
2.39.2


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [RFC net-next 4/6] net: ena: take into account xdp_features setting tx/rx queues
  2023-02-23 12:11 [RFC net-next 0/6] update xdp_features flag according to NIC re-configuration Lorenzo Bianconi
                   ` (2 preceding siblings ...)
  2023-02-23 12:11 ` [RFC net-next 3/6] net: thunderx: take into account xdp_features setting tx/rx queues Lorenzo Bianconi
@ 2023-02-23 12:11 ` Lorenzo Bianconi
  2023-02-23 12:11 ` [RFC net-next 5/6] veth: take into account device reconfiguration for xdp_features flag Lorenzo Bianconi
  2023-02-23 12:11 ` [RFC net-next 6/6] net/mlx5e: " Lorenzo Bianconi
  5 siblings, 0 replies; 11+ messages in thread
From: Lorenzo Bianconi @ 2023-02-23 12:11 UTC (permalink / raw)
  To: netdev
  Cc: bpf, davem, edumazet, kuba, pabeni, ast, daniel, hawk,
	john.fastabend, saeedm, tariqt, leon, shayagr, akiyano, darinzon,
	sgoutham, lorenzo.bianconi, toke

ena nic allows xdp just if enough hw queues are available for XDP.
Take into account queues configuration setting xdp_features.

Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
---
 drivers/net/ethernet/amazon/ena/ena_ethtool.c | 15 ++++++++++++---
 drivers/net/ethernet/amazon/ena/ena_netdev.c  |  6 ++++--
 2 files changed, 16 insertions(+), 5 deletions(-)

diff --git a/drivers/net/ethernet/amazon/ena/ena_ethtool.c b/drivers/net/ethernet/amazon/ena/ena_ethtool.c
index 8da79eedc057..1d4f2f4d10f2 100644
--- a/drivers/net/ethernet/amazon/ena/ena_ethtool.c
+++ b/drivers/net/ethernet/amazon/ena/ena_ethtool.c
@@ -850,11 +850,20 @@ static int ena_set_channels(struct net_device *netdev,
 	struct ena_adapter *adapter = netdev_priv(netdev);
 	u32 count = channels->combined_count;
 	/* The check for max value is already done in ethtool */
-	if (count < ENA_MIN_NUM_IO_QUEUES ||
-	    (ena_xdp_present(adapter) &&
-	    !ena_xdp_legal_queue_count(adapter, count)))
+	if (count < ENA_MIN_NUM_IO_QUEUES)
 		return -EINVAL;
 
+	if (!ena_xdp_legal_queue_count(adapter, count)) {
+		if (ena_xdp_present(adapter))
+			return -EINVAL;
+
+		xdp_clear_features_flag(netdev);
+	} else {
+		xdp_set_features_flag(netdev,
+				      NETDEV_XDP_ACT_BASIC |
+				      NETDEV_XDP_ACT_REDIRECT);
+	}
+
 	return ena_update_queue_count(adapter, count);
 }
 
diff --git a/drivers/net/ethernet/amazon/ena/ena_netdev.c b/drivers/net/ethernet/amazon/ena/ena_netdev.c
index d3999db7c6a2..cbfe7f977270 100644
--- a/drivers/net/ethernet/amazon/ena/ena_netdev.c
+++ b/drivers/net/ethernet/amazon/ena/ena_netdev.c
@@ -4105,8 +4105,6 @@ static void ena_set_conf_feat_params(struct ena_adapter *adapter,
 	/* Set offload features */
 	ena_set_dev_offloads(feat, netdev);
 
-	netdev->xdp_features = NETDEV_XDP_ACT_BASIC | NETDEV_XDP_ACT_REDIRECT;
-
 	adapter->max_mtu = feat->dev_attr.max_mtu;
 	netdev->max_mtu = adapter->max_mtu;
 	netdev->min_mtu = ENA_MIN_MTU;
@@ -4393,6 +4391,10 @@ static int ena_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
 
 	ena_config_debug_area(adapter);
 
+	if (ena_xdp_legal_queue_count(adapter, adapter->num_io_queues))
+		netdev->xdp_features = NETDEV_XDP_ACT_BASIC |
+				       NETDEV_XDP_ACT_REDIRECT;
+
 	memcpy(adapter->netdev->perm_addr, adapter->mac_addr, netdev->addr_len);
 
 	netif_carrier_off(netdev);
-- 
2.39.2


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [RFC net-next 5/6] veth: take into account device reconfiguration for xdp_features flag
  2023-02-23 12:11 [RFC net-next 0/6] update xdp_features flag according to NIC re-configuration Lorenzo Bianconi
                   ` (3 preceding siblings ...)
  2023-02-23 12:11 ` [RFC net-next 4/6] net: ena: " Lorenzo Bianconi
@ 2023-02-23 12:11 ` Lorenzo Bianconi
  2023-02-23 12:11 ` [RFC net-next 6/6] net/mlx5e: " Lorenzo Bianconi
  5 siblings, 0 replies; 11+ messages in thread
From: Lorenzo Bianconi @ 2023-02-23 12:11 UTC (permalink / raw)
  To: netdev
  Cc: bpf, davem, edumazet, kuba, pabeni, ast, daniel, hawk,
	john.fastabend, saeedm, tariqt, leon, shayagr, akiyano, darinzon,
	sgoutham, lorenzo.bianconi, toke

Take into account tx/rx queues reconfiguration setting device
xdp_features flag. Moreover consider NETIF_F_GRO flag in order to enable
ndo_xdp_xmit callback.

Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
---
 drivers/net/veth.c | 42 ++++++++++++++++++++++++++++++++++++++----
 1 file changed, 38 insertions(+), 4 deletions(-)

diff --git a/drivers/net/veth.c b/drivers/net/veth.c
index 1bb54de7124d..293dc3b2c84a 100644
--- a/drivers/net/veth.c
+++ b/drivers/net/veth.c
@@ -1257,6 +1257,26 @@ static int veth_enable_range_safe(struct net_device *dev, int start, int end)
 	return 0;
 }
 
+static void veth_set_xdp_features(struct net_device *dev)
+{
+	struct veth_priv *priv = netdev_priv(dev);
+	struct net_device *peer;
+
+	peer = rcu_dereference(priv->peer);
+	if (peer && peer->real_num_tx_queues <= dev->real_num_rx_queues) {
+		xdp_features_t val = NETDEV_XDP_ACT_BASIC |
+				     NETDEV_XDP_ACT_REDIRECT |
+				     NETDEV_XDP_ACT_RX_SG;
+
+		if (priv->_xdp_prog || veth_gro_requested(dev))
+			val |= NETDEV_XDP_ACT_NDO_XMIT |
+			       NETDEV_XDP_ACT_NDO_XMIT_SG;
+		xdp_set_features_flag(dev, val);
+	} else {
+		xdp_clear_features_flag(dev);
+	}
+}
+
 static int veth_set_channels(struct net_device *dev,
 			     struct ethtool_channels *ch)
 {
@@ -1323,6 +1343,12 @@ static int veth_set_channels(struct net_device *dev,
 		if (peer)
 			netif_carrier_on(peer);
 	}
+
+	/* update XDP supported features */
+	veth_set_xdp_features(dev);
+	if (peer)
+		veth_set_xdp_features(peer);
+
 	return err;
 
 revert:
@@ -1489,7 +1515,10 @@ static int veth_set_features(struct net_device *dev,
 		err = veth_napi_enable(dev);
 		if (err)
 			return err;
+
+		xdp_features_set_redirect_target(dev, true);
 	} else {
+		xdp_features_clear_redirect_target(dev);
 		veth_napi_del(dev);
 	}
 	return 0;
@@ -1570,10 +1599,15 @@ static int veth_xdp_set(struct net_device *dev, struct bpf_prog *prog,
 			peer->hw_features &= ~NETIF_F_GSO_SOFTWARE;
 			peer->max_mtu = max_mtu;
 		}
+
+		xdp_features_set_redirect_target(dev, true);
 	}
 
 	if (old_prog) {
 		if (!prog) {
+			if (!veth_gro_requested(dev))
+				xdp_features_clear_redirect_target(dev);
+
 			if (dev->flags & IFF_UP)
 				veth_disable_xdp(dev);
 
@@ -1686,10 +1720,6 @@ static void veth_setup(struct net_device *dev)
 	dev->hw_enc_features = VETH_FEATURES;
 	dev->mpls_features = NETIF_F_HW_CSUM | NETIF_F_GSO_SOFTWARE;
 	netif_set_tso_max_size(dev, GSO_MAX_SIZE);
-
-	dev->xdp_features = NETDEV_XDP_ACT_BASIC | NETDEV_XDP_ACT_REDIRECT |
-			    NETDEV_XDP_ACT_NDO_XMIT | NETDEV_XDP_ACT_RX_SG |
-			    NETDEV_XDP_ACT_NDO_XMIT_SG;
 }
 
 /*
@@ -1857,6 +1887,10 @@ static int veth_newlink(struct net *src_net, struct net_device *dev,
 		goto err_queues;
 
 	veth_disable_gro(dev);
+	/* update XDP supported features */
+	veth_set_xdp_features(dev);
+	veth_set_xdp_features(peer);
+
 	return 0;
 
 err_queues:
-- 
2.39.2


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [RFC net-next 6/6] net/mlx5e: take into account device reconfiguration for xdp_features flag
  2023-02-23 12:11 [RFC net-next 0/6] update xdp_features flag according to NIC re-configuration Lorenzo Bianconi
                   ` (4 preceding siblings ...)
  2023-02-23 12:11 ` [RFC net-next 5/6] veth: take into account device reconfiguration for xdp_features flag Lorenzo Bianconi
@ 2023-02-23 12:11 ` Lorenzo Bianconi
  5 siblings, 0 replies; 11+ messages in thread
From: Lorenzo Bianconi @ 2023-02-23 12:11 UTC (permalink / raw)
  To: netdev
  Cc: bpf, davem, edumazet, kuba, pabeni, ast, daniel, hawk,
	john.fastabend, saeedm, tariqt, leon, shayagr, akiyano, darinzon,
	sgoutham, lorenzo.bianconi, toke

Take into account LRO and GRO configuration setting device xdp_features
flag. Moreover consider channel rq_wq_type enabling rx scatter-gatter
support in xdp_features flag.

Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
---
 drivers/net/ethernet/mellanox/mlx5/core/en.h  |  1 +
 .../ethernet/mellanox/mlx5/core/en_ethtool.c  | 10 ++++-
 .../net/ethernet/mellanox/mlx5/core/en_main.c | 45 ++++++++++++++++---
 .../net/ethernet/mellanox/mlx5/core/en_rep.c  |  3 ++
 4 files changed, 51 insertions(+), 8 deletions(-)

diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en.h b/drivers/net/ethernet/mellanox/mlx5/core/en.h
index 88460b7796e5..4276c6eb6820 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en.h
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en.h
@@ -1243,6 +1243,7 @@ void mlx5e_build_nic_params(struct mlx5e_priv *priv, struct mlx5e_xsk *xsk, u16
 void mlx5e_rx_dim_work(struct work_struct *work);
 void mlx5e_tx_dim_work(struct work_struct *work);
 
+void mlx5e_set_xdp_feature(struct net_device *netdev);
 netdev_features_t mlx5e_features_check(struct sk_buff *skb,
 				       struct net_device *netdev,
 				       netdev_features_t features);
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c b/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c
index 7708acc9b2ab..79fd21ecb9cb 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c
@@ -1985,6 +1985,7 @@ static int set_pflag_rx_striding_rq(struct net_device *netdev, bool enable)
 	struct mlx5e_priv *priv = netdev_priv(netdev);
 	struct mlx5_core_dev *mdev = priv->mdev;
 	struct mlx5e_params new_params;
+	int err;
 
 	if (enable) {
 		/* Checking the regular RQ here; mlx5e_validate_xsk_param called
@@ -2005,7 +2006,14 @@ static int set_pflag_rx_striding_rq(struct net_device *netdev, bool enable)
 	MLX5E_SET_PFLAG(&new_params, MLX5E_PFLAG_RX_STRIDING_RQ, enable);
 	mlx5e_set_rq_type(mdev, &new_params);
 
-	return mlx5e_safe_switch_params(priv, &new_params, NULL, NULL, true);
+	err = mlx5e_safe_switch_params(priv, &new_params, NULL, NULL, true);
+	if (err)
+		return err;
+
+	/* update XDP supported features */
+	mlx5e_set_xdp_feature(netdev);
+
+	return 0;
 }
 
 static int set_pflag_rx_no_csum_complete(struct net_device *netdev, bool enable)
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c
index 53feb0529943..714761803a70 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c
@@ -3984,6 +3984,30 @@ static int mlx5e_handle_feature(struct net_device *netdev,
 	return 0;
 }
 
+void mlx5e_set_xdp_feature(struct net_device *netdev)
+{
+	struct mlx5e_priv *priv = netdev_priv(netdev);
+	bool ndo_xmit = test_bit(MLX5E_STATE_XDP_ACTIVE, &priv->state);
+	struct mlx5e_params *params = &priv->channels.params;
+	xdp_features_t val;
+
+	if (params->packet_merge.type != MLX5E_PACKET_MERGE_NONE) {
+		xdp_clear_features_flag(netdev);
+		return;
+	}
+
+	val = NETDEV_XDP_ACT_BASIC | NETDEV_XDP_ACT_REDIRECT |
+	      NETDEV_XDP_ACT_XSK_ZEROCOPY;
+	if (ndo_xmit)
+		val |= NETDEV_XDP_ACT_NDO_XMIT;
+	if (params->rq_wq_type == MLX5_WQ_TYPE_CYCLIC) {
+		val |= NETDEV_XDP_ACT_RX_SG;
+		if (ndo_xmit)
+			val |= NETDEV_XDP_ACT_NDO_XMIT_SG;
+	}
+	xdp_set_features_flag(netdev, val);
+}
+
 int mlx5e_set_features(struct net_device *netdev, netdev_features_t features)
 {
 	netdev_features_t oper_features = features;
@@ -4010,6 +4034,9 @@ int mlx5e_set_features(struct net_device *netdev, netdev_features_t features)
 		return -EINVAL;
 	}
 
+	/* update XDP supported features */
+	mlx5e_set_xdp_feature(netdev);
+
 	return 0;
 }
 
@@ -4742,10 +4769,14 @@ static int mlx5e_xdp_set(struct net_device *netdev, struct bpf_prog *prog)
 		bpf_prog_put(old_prog);
 
 	if (reset) {
-		if (prog)
-			xdp_features_set_redirect_target(netdev, true);
-		else
+		if (prog) {
+			bool xmit_sg;
+
+			xmit_sg = new_params.rq_wq_type == MLX5_WQ_TYPE_CYCLIC;
+			xdp_features_set_redirect_target(netdev, xmit_sg);
+		} else {
 			xdp_features_clear_redirect_target(netdev);
+		}
 	}
 
 	if (!test_bit(MLX5E_STATE_OPENED, &priv->state) || reset)
@@ -5143,13 +5174,10 @@ static void mlx5e_build_nic_netdev(struct net_device *netdev)
 	netdev->features         |= NETIF_F_HIGHDMA;
 	netdev->features         |= NETIF_F_HW_VLAN_STAG_FILTER;
 
-	netdev->xdp_features = NETDEV_XDP_ACT_BASIC | NETDEV_XDP_ACT_REDIRECT |
-			       NETDEV_XDP_ACT_XSK_ZEROCOPY |
-			       NETDEV_XDP_ACT_RX_SG;
-
 	netdev->priv_flags       |= IFF_UNICAST_FLT;
 
 	netif_set_tso_max_size(netdev, GSO_MAX_SIZE);
+	mlx5e_set_xdp_feature(netdev);
 	mlx5e_set_netdev_dev_addr(netdev);
 	mlx5e_macsec_build_netdev(priv);
 	mlx5e_ipsec_build_netdev(priv);
@@ -5221,6 +5249,9 @@ static int mlx5e_nic_init(struct mlx5_core_dev *mdev,
 		mlx5_core_err(mdev, "TLS initialization failed, %d\n", err);
 
 	mlx5e_health_create_reporters(priv);
+	/* update XDP supported features */
+	mlx5e_set_xdp_feature(netdev);
+
 	return 0;
 }
 
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_rep.c b/drivers/net/ethernet/mellanox/mlx5/core/en_rep.c
index 9b9203443085..43fd12fb87b8 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_rep.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_rep.c
@@ -747,6 +747,9 @@ static void mlx5e_build_rep_params(struct net_device *netdev)
 	/* RQ */
 	mlx5e_build_rq_params(mdev, params);
 
+	/* update XDP supported features */
+	mlx5e_set_xdp_feature(netdev);
+
 	/* CQ moderation params */
 	params->rx_dim_enabled = MLX5_CAP_GEN(mdev, cq_moderation);
 	mlx5e_set_rx_cq_mode_params(params, cq_period_mode);
-- 
2.39.2


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* Re: [RFC net-next 1/6] tools: ynl: fix render-max for flags definition
  2023-02-23 12:11 ` [RFC net-next 1/6] tools: ynl: fix render-max for flags definition Lorenzo Bianconi
@ 2023-02-23 17:09   ` Jakub Kicinski
  2023-02-28 23:16     ` Lorenzo Bianconi
  0 siblings, 1 reply; 11+ messages in thread
From: Jakub Kicinski @ 2023-02-23 17:09 UTC (permalink / raw)
  To: Lorenzo Bianconi
  Cc: netdev, bpf, davem, edumazet, pabeni, ast, daniel, hawk,
	john.fastabend, saeedm, tariqt, leon, shayagr, akiyano, darinzon,
	sgoutham, lorenzo.bianconi, toke

On Thu, 23 Feb 2023 13:11:33 +0100 Lorenzo Bianconi wrote:
> +                if const['type'] == 'flags':
> +                    max_name = c_upper(name_pfx + 'mask')
> +                    max_val = f' = {(entry.user_value() << 1) - 1},'
> +                    cw.p(max_name + max_val)

Could you use EnumSet::get_mask instead() ?

I think it also needs to be fixed to actually walk the elements 
and combine the user_value()s rather than count them and assume
there are no gaps.

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [RFC net-next 1/6] tools: ynl: fix render-max for flags definition
  2023-02-23 17:09   ` Jakub Kicinski
@ 2023-02-28 23:16     ` Lorenzo Bianconi
  2023-02-28 23:28       ` Jakub Kicinski
  0 siblings, 1 reply; 11+ messages in thread
From: Lorenzo Bianconi @ 2023-02-28 23:16 UTC (permalink / raw)
  To: Jakub Kicinski
  Cc: netdev, bpf, davem, edumazet, pabeni, ast, daniel, hawk,
	john.fastabend, saeedm, tariqt, leon, shayagr, akiyano, darinzon,
	sgoutham, lorenzo.bianconi, toke

[-- Attachment #1: Type: text/plain, Size: 588 bytes --]

> On Thu, 23 Feb 2023 13:11:33 +0100 Lorenzo Bianconi wrote:
> > +                if const['type'] == 'flags':
> > +                    max_name = c_upper(name_pfx + 'mask')
> > +                    max_val = f' = {(entry.user_value() << 1) - 1},'
> > +                    cw.p(max_name + max_val)
> 
> Could you use EnumSet::get_mask instead() ?

ack, I will fix it.

> 
> I think it also needs to be fixed to actually walk the elements 
> and combine the user_value()s rather than count them and assume
> there are no gaps.

Do you mean get_mask()?

Regards,
Lorenzo

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 228 bytes --]

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [RFC net-next 1/6] tools: ynl: fix render-max for flags definition
  2023-02-28 23:16     ` Lorenzo Bianconi
@ 2023-02-28 23:28       ` Jakub Kicinski
  2023-03-01  9:04         ` Lorenzo Bianconi
  0 siblings, 1 reply; 11+ messages in thread
From: Jakub Kicinski @ 2023-02-28 23:28 UTC (permalink / raw)
  To: Lorenzo Bianconi
  Cc: netdev, bpf, davem, edumazet, pabeni, ast, daniel, hawk,
	john.fastabend, saeedm, tariqt, leon, shayagr, akiyano, darinzon,
	sgoutham, lorenzo.bianconi, toke

On Wed, 1 Mar 2023 00:16:16 +0100 Lorenzo Bianconi wrote:
> > I think it also needs to be fixed to actually walk the elements 
> > and combine the user_value()s rather than count them and assume
> > there are no gaps.  
> 
> Do you mean get_mask()?

Yup, get_mask() predates the ability to control the values of enum
entries individually so while at it we should fix it.

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [RFC net-next 1/6] tools: ynl: fix render-max for flags definition
  2023-02-28 23:28       ` Jakub Kicinski
@ 2023-03-01  9:04         ` Lorenzo Bianconi
  0 siblings, 0 replies; 11+ messages in thread
From: Lorenzo Bianconi @ 2023-03-01  9:04 UTC (permalink / raw)
  To: Jakub Kicinski
  Cc: netdev, bpf, davem, edumazet, pabeni, ast, daniel, hawk,
	john.fastabend, saeedm, tariqt, leon, shayagr, akiyano, darinzon,
	sgoutham, lorenzo.bianconi, toke

[-- Attachment #1: Type: text/plain, Size: 471 bytes --]

> On Wed, 1 Mar 2023 00:16:16 +0100 Lorenzo Bianconi wrote:
> > > I think it also needs to be fixed to actually walk the elements 
> > > and combine the user_value()s rather than count them and assume
> > > there are no gaps.  
> > 
> > Do you mean get_mask()?
> 
> Yup, get_mask() predates the ability to control the values of enum
> entries individually so while at it we should fix it.

ack, I will add a separated patch to the series.

Regards,
Lorenzo

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 228 bytes --]

^ permalink raw reply	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2023-03-01  9:05 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-02-23 12:11 [RFC net-next 0/6] update xdp_features flag according to NIC re-configuration Lorenzo Bianconi
2023-02-23 12:11 ` [RFC net-next 1/6] tools: ynl: fix render-max for flags definition Lorenzo Bianconi
2023-02-23 17:09   ` Jakub Kicinski
2023-02-28 23:16     ` Lorenzo Bianconi
2023-02-28 23:28       ` Jakub Kicinski
2023-03-01  9:04         ` Lorenzo Bianconi
2023-02-23 12:11 ` [RFC net-next 2/6] xdp: add xdp_set_features_flag utility routine Lorenzo Bianconi
2023-02-23 12:11 ` [RFC net-next 3/6] net: thunderx: take into account xdp_features setting tx/rx queues Lorenzo Bianconi
2023-02-23 12:11 ` [RFC net-next 4/6] net: ena: " Lorenzo Bianconi
2023-02-23 12:11 ` [RFC net-next 5/6] veth: take into account device reconfiguration for xdp_features flag Lorenzo Bianconi
2023-02-23 12:11 ` [RFC net-next 6/6] net/mlx5e: " Lorenzo Bianconi

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).