xsk: replace ndo_xsk_async_xmit with ndo_xsk_wakeup
authorMagnus Karlsson <magnus.karlsson@intel.com>
Wed, 14 Aug 2019 07:27:16 +0000 (09:27 +0200)
committerDaniel Borkmann <daniel@iogearbox.net>
Sat, 17 Aug 2019 21:07:31 +0000 (23:07 +0200)
This commit replaces ndo_xsk_async_xmit with ndo_xsk_wakeup. This new
ndo provides the same functionality as before but with the addition of
a new flags field that is used to specifiy if Rx, Tx or both should be
woken up. The previous ndo only woke up Tx, as implied by the
name. The i40e and ixgbe drivers (which are all the supported ones)
are updated with this new interface.

This new ndo will be used by the new need_wakeup functionality of XDP
sockets that need to be able to wake up both Rx and Tx driver
processing.

Signed-off-by: Magnus Karlsson <magnus.karlsson@intel.com>
Acked-by: Jonathan Lemon <jonathan.lemon@gmail.com>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
12 files changed:
drivers/net/ethernet/intel/i40e/i40e_main.c
drivers/net/ethernet/intel/i40e/i40e_xsk.c
drivers/net/ethernet/intel/i40e/i40e_xsk.h
drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
drivers/net/ethernet/intel/ixgbe/ixgbe_txrx_common.h
drivers/net/ethernet/intel/ixgbe/ixgbe_xsk.c
drivers/net/ethernet/mellanox/mlx5/core/en/xsk/tx.c
drivers/net/ethernet/mellanox/mlx5/core/en/xsk/tx.h
drivers/net/ethernet/mellanox/mlx5/core/en_main.c
include/linux/netdevice.h
net/xdp/xdp_umem.c
net/xdp/xsk.c

index 6d456e5793143bccdaaf287877762510618194f0..a75c66c8679dfbb7e617edb34a3f557c3e0e05b3 100644 (file)
@@ -12570,7 +12570,8 @@ static int i40e_xdp_setup(struct i40e_vsi *vsi,
        if (need_reset && prog)
                for (i = 0; i < vsi->num_queue_pairs; i++)
                        if (vsi->xdp_rings[i]->xsk_umem)
-                               (void)i40e_xsk_async_xmit(vsi->netdev, i);
+                               (void)i40e_xsk_wakeup(vsi->netdev, i,
+                                                     XDP_WAKEUP_RX);
 
        return 0;
 }
@@ -12892,7 +12893,7 @@ static const struct net_device_ops i40e_netdev_ops = {
        .ndo_bridge_setlink     = i40e_ndo_bridge_setlink,
        .ndo_bpf                = i40e_xdp,
        .ndo_xdp_xmit           = i40e_xdp_xmit,
-       .ndo_xsk_async_xmit     = i40e_xsk_async_xmit,
+       .ndo_xsk_wakeup         = i40e_xsk_wakeup,
        .ndo_dfwd_add_station   = i40e_fwd_add,
        .ndo_dfwd_del_station   = i40e_fwd_del,
 };
index 32bad014d76cbaadbc90d117b703898e7f3e067f..d0ff5d8b297b102c6dc44f1cbfe47768e3ff3a8b 100644 (file)
@@ -116,7 +116,7 @@ static int i40e_xsk_umem_enable(struct i40e_vsi *vsi, struct xdp_umem *umem,
                        return err;
 
                /* Kick start the NAPI context so that receiving will start */
-               err = i40e_xsk_async_xmit(vsi->netdev, qid);
+               err = i40e_xsk_wakeup(vsi->netdev, qid, XDP_WAKEUP_RX);
                if (err)
                        return err;
        }
@@ -765,13 +765,14 @@ out_xmit:
 }
 
 /**
- * i40e_xsk_async_xmit - Implements the ndo_xsk_async_xmit
+ * i40e_xsk_wakeup - Implements the ndo_xsk_wakeup
  * @dev: the netdevice
  * @queue_id: queue id to wake up
+ * @flags: ignored in our case since we have Rx and Tx in the same NAPI.
  *
  * Returns <0 for errors, 0 otherwise.
  **/
-int i40e_xsk_async_xmit(struct net_device *dev, u32 queue_id)
+int i40e_xsk_wakeup(struct net_device *dev, u32 queue_id, u32 flags)
 {
        struct i40e_netdev_priv *np = netdev_priv(dev);
        struct i40e_vsi *vsi = np->vsi;
index 8cc0a2e7d9a2fa3253ceaec272099ace792d9e44..9ed59c14eb55f931c05bca8f01a772bff390fa71 100644 (file)
@@ -18,6 +18,6 @@ int i40e_clean_rx_irq_zc(struct i40e_ring *rx_ring, int budget);
 
 bool i40e_clean_xdp_tx_irq(struct i40e_vsi *vsi,
                           struct i40e_ring *tx_ring, int napi_budget);
-int i40e_xsk_async_xmit(struct net_device *dev, u32 queue_id);
+int i40e_xsk_wakeup(struct net_device *dev, u32 queue_id, u32 flags);
 
 #endif /* _I40E_XSK_H_ */
index dc7b128c780e82b2ac26f0f20720c32923915bec..05729b4486123c28980f2167881d541816a83a92 100644 (file)
@@ -10263,7 +10263,8 @@ static int ixgbe_xdp_setup(struct net_device *dev, struct bpf_prog *prog)
        if (need_reset && prog)
                for (i = 0; i < adapter->num_rx_queues; i++)
                        if (adapter->xdp_ring[i]->xsk_umem)
-                               (void)ixgbe_xsk_async_xmit(adapter->netdev, i);
+                               (void)ixgbe_xsk_wakeup(adapter->netdev, i,
+                                                      XDP_WAKEUP_RX);
 
        return 0;
 }
@@ -10382,7 +10383,7 @@ static const struct net_device_ops ixgbe_netdev_ops = {
        .ndo_features_check     = ixgbe_features_check,
        .ndo_bpf                = ixgbe_xdp,
        .ndo_xdp_xmit           = ixgbe_xdp_xmit,
-       .ndo_xsk_async_xmit     = ixgbe_xsk_async_xmit,
+       .ndo_xsk_wakeup         = ixgbe_xsk_wakeup,
 };
 
 static void ixgbe_disable_txr_hw(struct ixgbe_adapter *adapter,
index d93a690aff74f404549d067947e1faf0a4d08a02..6d01700b46bc3d8b42886f98931117456a65a783 100644 (file)
@@ -42,7 +42,7 @@ int ixgbe_clean_rx_irq_zc(struct ixgbe_q_vector *q_vector,
 void ixgbe_xsk_clean_rx_ring(struct ixgbe_ring *rx_ring);
 bool ixgbe_clean_xdp_tx_irq(struct ixgbe_q_vector *q_vector,
                            struct ixgbe_ring *tx_ring, int napi_budget);
-int ixgbe_xsk_async_xmit(struct net_device *dev, u32 queue_id);
+int ixgbe_xsk_wakeup(struct net_device *dev, u32 queue_id, u32 flags);
 void ixgbe_xsk_clean_tx_ring(struct ixgbe_ring *tx_ring);
 
 #endif /* #define _IXGBE_TXRX_COMMON_H_ */
index 6b609553329fa98647b78f4e1e5d3e9223a8aa7a..e598af9faced9ab53803df9e51aa92ed02d62193 100644 (file)
@@ -100,7 +100,7 @@ static int ixgbe_xsk_umem_enable(struct ixgbe_adapter *adapter,
                ixgbe_txrx_ring_enable(adapter, qid);
 
                /* Kick start the NAPI context so that receiving will start */
-               err = ixgbe_xsk_async_xmit(adapter->netdev, qid);
+               err = ixgbe_xsk_wakeup(adapter->netdev, qid, XDP_WAKEUP_RX);
                if (err)
                        return err;
        }
@@ -692,7 +692,7 @@ bool ixgbe_clean_xdp_tx_irq(struct ixgbe_q_vector *q_vector,
        return budget > 0 && xmit_done;
 }
 
-int ixgbe_xsk_async_xmit(struct net_device *dev, u32 qid)
+int ixgbe_xsk_wakeup(struct net_device *dev, u32 qid, u32 flags)
 {
        struct ixgbe_adapter *adapter = netdev_priv(dev);
        struct ixgbe_ring *ring;
index 35e188cf4ea4607f7475fbbae48cb838c7e8c6b0..9704634a87aae01acfe1f72392ea4073daea3726 100644 (file)
@@ -7,7 +7,7 @@
 #include "en/params.h"
 #include <net/xdp_sock.h>
 
-int mlx5e_xsk_async_xmit(struct net_device *dev, u32 qid)
+int mlx5e_xsk_wakeup(struct net_device *dev, u32 qid, u32 flags)
 {
        struct mlx5e_priv *priv = netdev_priv(dev);
        struct mlx5e_params *params = &priv->channels.params;
index 7add18bf78d8f0688769945e5075f7f0a5f352a6..9c505158b975b5ac0063c70d511d6753dbf136b4 100644 (file)
@@ -8,7 +8,7 @@
 
 /* TX data path */
 
-int mlx5e_xsk_async_xmit(struct net_device *dev, u32 qid);
+int mlx5e_xsk_wakeup(struct net_device *dev, u32 qid, u32 flags);
 
 bool mlx5e_xsk_tx(struct mlx5e_xdpsq *sq, unsigned int budget);
 
index 9a2fcef6e7f034896b3d5a3c8e5d265aa0d7032a..9df7e5c3c4ccac17334bf513d00feff06d089e0c 100644 (file)
@@ -4540,7 +4540,7 @@ const struct net_device_ops mlx5e_netdev_ops = {
        .ndo_tx_timeout          = mlx5e_tx_timeout,
        .ndo_bpf                 = mlx5e_xdp,
        .ndo_xdp_xmit            = mlx5e_xdp_xmit,
-       .ndo_xsk_async_xmit      = mlx5e_xsk_async_xmit,
+       .ndo_xsk_wakeup          = mlx5e_xsk_wakeup,
 #ifdef CONFIG_MLX5_EN_ARFS
        .ndo_rx_flow_steer       = mlx5e_rx_flow_steer,
 #endif
index 55ac223553f8cc42803bc6c20341ef1793e58b80..0ef0570386a2a5d98e684b4c9d53f8dc78fc165d 100644 (file)
@@ -901,6 +901,10 @@ struct netdev_bpf {
        };
 };
 
+/* Flags for ndo_xsk_wakeup. */
+#define XDP_WAKEUP_RX (1 << 0)
+#define XDP_WAKEUP_TX (1 << 1)
+
 #ifdef CONFIG_XFRM_OFFLOAD
 struct xfrmdev_ops {
        int     (*xdo_dev_state_add) (struct xfrm_state *x);
@@ -1227,6 +1231,12 @@ struct tlsdev_ops;
  *     that got dropped are freed/returned via xdp_return_frame().
  *     Returns negative number, means general error invoking ndo, meaning
  *     no frames were xmit'ed and core-caller will free all frames.
+ * int (*ndo_xsk_wakeup)(struct net_device *dev, u32 queue_id, u32 flags);
+ *      This function is used to wake up the softirq, ksoftirqd or kthread
+ *     responsible for sending and/or receiving packets on a specific
+ *     queue id bound to an AF_XDP socket. The flags field specifies if
+ *     only RX, only Tx, or both should be woken up using the flags
+ *     XDP_WAKEUP_RX and XDP_WAKEUP_TX.
  * struct devlink_port *(*ndo_get_devlink_port)(struct net_device *dev);
  *     Get devlink port instance associated with a given netdev.
  *     Called with a reference on the netdevice and devlink locks only,
@@ -1426,8 +1436,8 @@ struct net_device_ops {
        int                     (*ndo_xdp_xmit)(struct net_device *dev, int n,
                                                struct xdp_frame **xdp,
                                                u32 flags);
-       int                     (*ndo_xsk_async_xmit)(struct net_device *dev,
-                                                     u32 queue_id);
+       int                     (*ndo_xsk_wakeup)(struct net_device *dev,
+                                                 u32 queue_id, u32 flags);
        struct devlink_port *   (*ndo_get_devlink_port)(struct net_device *dev);
 };
 
index a0607969f8c01cbe64d933377700a74e9f7a0cad..6e2d4da4cdcdf255b87fc96b6aa25f1969e7c0ef 100644 (file)
@@ -112,8 +112,7 @@ int xdp_umem_assign_dev(struct xdp_umem *umem, struct net_device *dev,
                /* For copy-mode, we are done. */
                return 0;
 
-       if (!dev->netdev_ops->ndo_bpf ||
-           !dev->netdev_ops->ndo_xsk_async_xmit) {
+       if (!dev->netdev_ops->ndo_bpf || !dev->netdev_ops->ndo_xsk_wakeup) {
                err = -EOPNOTSUPP;
                goto err_unreg_umem;
        }
index 59b57d7086970b53b140bc500c881ab9cf1fb98b..1fe40a93645600c19a0ea14c09e5c62891fbebf6 100644 (file)
@@ -212,7 +212,8 @@ static int xsk_zc_xmit(struct sock *sk)
        struct xdp_sock *xs = xdp_sk(sk);
        struct net_device *dev = xs->dev;
 
-       return dev->netdev_ops->ndo_xsk_async_xmit(dev, xs->queue_id);
+       return dev->netdev_ops->ndo_xsk_wakeup(dev, xs->queue_id,
+                                              XDP_WAKEUP_TX);
 }
 
 static void xsk_destruct_skb(struct sk_buff *skb)