lists.openwall.net | lists / announce owl-users owl-dev john-users john-dev passwdqc-users yescrypt popa3d-users / oss-security kernel-hardening musl sabotage tlsify passwords / crypt-dev xvendor / Bugtraq Full-Disclosure linux-kernel linux-netdev linux-ext4 linux-hardening linux-cve-announce PHC | |
Open Source and information security mailing list archives
| ||
|
Message-ID: <20231223025554.2316836-35-aleksander.lobakin@intel.com> Date: Sat, 23 Dec 2023 03:55:54 +0100 From: Alexander Lobakin <aleksander.lobakin@...el.com> To: "David S. Miller" <davem@...emloft.net>, Eric Dumazet <edumazet@...gle.com>, Jakub Kicinski <kuba@...nel.org>, Paolo Abeni <pabeni@...hat.com> Cc: Alexander Lobakin <aleksander.lobakin@...el.com>, Maciej Fijalkowski <maciej.fijalkowski@...el.com>, Michal Kubiak <michal.kubiak@...el.com>, Larysa Zaremba <larysa.zaremba@...el.com>, Alexei Starovoitov <ast@...nel.org>, Daniel Borkmann <daniel@...earbox.net>, Willem de Bruijn <willemdebruijn.kernel@...il.com>, intel-wired-lan@...ts.osuosl.org, netdev@...r.kernel.org, linux-kernel@...r.kernel.org Subject: [PATCH RFC net-next 34/34] idpf: enable XSk features and ndo_xsk_wakeup From: Michal Kubiak <michal.kubiak@...el.com> Now that AF_XDP functionality is fully implemented, advertise XSk XDP feature and add .ndo_xsk_wakeup() callback to be able to use it with this driver. Signed-off-by: Michal Kubiak <michal.kubiak@...el.com> Signed-off-by: Alexander Lobakin <aleksander.lobakin@...el.com> --- drivers/net/ethernet/intel/idpf/idpf_lib.c | 5 ++- drivers/net/ethernet/intel/idpf/idpf_xsk.c | 42 ++++++++++++++++++++++ drivers/net/ethernet/intel/idpf/idpf_xsk.h | 2 ++ 3 files changed, 48 insertions(+), 1 deletion(-) diff --git a/drivers/net/ethernet/intel/idpf/idpf_lib.c b/drivers/net/ethernet/intel/idpf/idpf_lib.c index 7c3d45f84e1b..af4f708b82f3 100644 --- a/drivers/net/ethernet/intel/idpf/idpf_lib.c +++ b/drivers/net/ethernet/intel/idpf/idpf_lib.c @@ -3,6 +3,7 @@ #include "idpf.h" #include "idpf_xdp.h" +#include "idpf_xsk.h" static const struct net_device_ops idpf_netdev_ops_splitq; static const struct net_device_ops idpf_netdev_ops_singleq; @@ -844,7 +845,8 @@ static int idpf_cfg_netdev(struct idpf_vport *vport) if (idpf_is_queue_model_split(vport->rxq_model)) xdp_set_features_flag(netdev, NETDEV_XDP_ACT_BASIC | NETDEV_XDP_ACT_REDIRECT | - NETDEV_XDP_ACT_RX_SG); + NETDEV_XDP_ACT_RX_SG | + NETDEV_XDP_ACT_XSK_ZEROCOPY); idpf_set_ethtool_ops(netdev); SET_NETDEV_DEV(netdev, &adapter->pdev->dev); @@ -2452,6 +2454,7 @@ static const struct net_device_ops idpf_netdev_ops_splitq = { .ndo_tx_timeout = idpf_tx_timeout, .ndo_bpf = idpf_xdp, .ndo_xdp_xmit = idpf_xdp_xmit, + .ndo_xsk_wakeup = idpf_xsk_wakeup, }; static const struct net_device_ops idpf_netdev_ops_singleq = { diff --git a/drivers/net/ethernet/intel/idpf/idpf_xsk.c b/drivers/net/ethernet/intel/idpf/idpf_xsk.c index 01231e828f6a..aff37c6a5adb 100644 --- a/drivers/net/ethernet/intel/idpf/idpf_xsk.c +++ b/drivers/net/ethernet/intel/idpf/idpf_xsk.c @@ -1137,3 +1137,45 @@ bool idpf_xmit_zc(struct idpf_queue *complq) return result; } + +/** + * idpf_xsk_wakeup - Implements ndo_xsk_wakeup + * @netdev: net_device + * @queue_id: queue to wake up + * @flags: ignored in our case, since we have Rx and Tx in the same NAPI + * + * Returns negative on error, zero otherwise. + */ +int idpf_xsk_wakeup(struct net_device *netdev, u32 qid, u32 flags) +{ + struct idpf_netdev_priv *np = netdev_priv(netdev); + struct idpf_vport *vport = np->vport; + struct idpf_q_vector *q_vector; + struct idpf_queue *q; + int idx; + + if (idpf_vport_ctrl_is_locked(netdev)) + return -EBUSY; + + if (unlikely(!vport->link_up)) + return -ENETDOWN; + + if (unlikely(!idpf_xdp_is_prog_ena(vport))) + return -ENXIO; + + idx = qid + vport->xdp_txq_offset; + + if (unlikely(idx >= vport->num_txq)) + return -ENXIO; + + if (unlikely(!test_bit(__IDPF_Q_XSK, vport->txqs[idx]->flags))) + return -ENXIO; + + q = vport->txqs[idx]; + q_vector = q->txq_grp->complq->q_vector; + + if (!napi_if_scheduled_mark_missed(&q_vector->napi)) + idpf_trigger_sw_intr(&vport->adapter->hw, q_vector); + + return 0; +} diff --git a/drivers/net/ethernet/intel/idpf/idpf_xsk.h b/drivers/net/ethernet/intel/idpf/idpf_xsk.h index 51ddf2e36577..446ca971f37e 100644 --- a/drivers/net/ethernet/intel/idpf/idpf_xsk.h +++ b/drivers/net/ethernet/intel/idpf/idpf_xsk.h @@ -10,6 +10,7 @@ enum virtchnl2_queue_type; struct idpf_queue; struct idpf_vport; +struct net_device; struct xsk_buff_pool; void idpf_xsk_setup_queue(struct idpf_queue *q, enum virtchnl2_queue_type t); @@ -24,5 +25,6 @@ bool idpf_xmit_zc(struct idpf_queue *complq); int idpf_xsk_pool_setup(struct idpf_vport *vport, struct xsk_buff_pool *pool, u32 qid); +int idpf_xsk_wakeup(struct net_device *netdev, u32 qid, u32 flags); #endif /* !_IDPF_XSK_H_ */ -- 2.43.0
Powered by blists - more mailing lists