From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 01432A04DB; Thu, 3 Sep 2020 12:15:23 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id A937F1C114; Thu, 3 Sep 2020 12:14:46 +0200 (CEST) Received: from mellanox.co.il (mail-il-dmz.mellanox.com [193.47.165.129]) by dpdk.org (Postfix) with ESMTP id EBBDB1C0D1 for ; Thu, 3 Sep 2020 12:14:44 +0200 (CEST) Received: from Internal Mail-Server by MTLPINE1 (envelope-from michaelba@nvidia.com) with SMTP; 3 Sep 2020 13:14:43 +0300 Received: from nvidia.com (pegasus07.mtr.labs.mlnx [10.210.16.112]) by labmailer.mlnx (8.13.8/8.13.8) with ESMTP id 083AEP94031645; Thu, 3 Sep 2020 13:14:43 +0300 From: Michael Baum To: dev@dpdk.org Cc: Matan Azrad , Raslan Darawsheh , Viacheslav Ovsiienko Date: Thu, 3 Sep 2020 10:13:37 +0000 Message-Id: <1599128029-2092-7-git-send-email-michaelba@nvidia.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1599128029-2092-1-git-send-email-michaelba@nvidia.com> References: <1599128029-2092-1-git-send-email-michaelba@nvidia.com> Subject: [dpdk-dev] [PATCH v1 06/18] net/mlx5: separate Rx interrupt handling X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" Separate interrupt event handler into both Verbs and DevX modules. Signed-off-by: Michael Baum Acked-by: Matan Azrad --- drivers/net/mlx5/linux/mlx5_verbs.c | 30 ++++++++++++++++++++++++++++ drivers/net/mlx5/mlx5.h | 1 + drivers/net/mlx5/mlx5_devx.c | 38 +++++++++++++++++++++++++++++++++++ drivers/net/mlx5/mlx5_rxq.c | 40 ++++++++----------------------------- 4 files changed, 77 insertions(+), 32 deletions(-) diff --git a/drivers/net/mlx5/linux/mlx5_verbs.c b/drivers/net/mlx5/linux/mlx5_verbs.c index ff71513..3af09db 100644 --- a/drivers/net/mlx5/linux/mlx5_verbs.c +++ b/drivers/net/mlx5/linux/mlx5_verbs.c @@ -428,8 +428,38 @@ mlx5_free(rxq_obj); } +/** + * Get event for an Rx verbs queue object. + * + * @param rxq_obj + * Verbs Rx queue object. + * + * @return + * 0 on success, a negative errno value otherwise and rte_errno is set. + */ +static int +mlx5_rx_ibv_get_event(struct mlx5_rxq_obj *rxq_obj) +{ + struct ibv_cq *ev_cq; + void *ev_ctx; + int ret = mlx5_glue->get_cq_event(rxq_obj->ibv_channel, + &ev_cq, &ev_ctx); + + if (ret < 0 || ev_cq != rxq_obj->ibv_cq) + goto exit; + mlx5_glue->ack_cq_events(rxq_obj->ibv_cq, 1); + return 0; +exit: + if (ret < 0) + rte_errno = errno; + else + rte_errno = EINVAL; + return -rte_errno; +} + struct mlx5_obj_ops ibv_obj_ops = { .rxq_obj_modify_vlan_strip = mlx5_rxq_obj_modify_wq_vlan_strip, .rxq_obj_new = mlx5_rxq_ibv_obj_new, + .rxq_event_get = mlx5_rx_ibv_get_event, .rxq_obj_release = mlx5_rxq_ibv_obj_release, }; diff --git a/drivers/net/mlx5/mlx5.h b/drivers/net/mlx5/mlx5.h index eba5df9..f0e2929 100644 --- a/drivers/net/mlx5/mlx5.h +++ b/drivers/net/mlx5/mlx5.h @@ -709,6 +709,7 @@ struct mlx5_obj_ops { int (*rxq_obj_modify_vlan_strip)(struct mlx5_rxq_obj *rxq_obj, int on); struct mlx5_rxq_obj *(*rxq_obj_new)(struct rte_eth_dev *dev, uint16_t idx); + int (*rxq_event_get)(struct mlx5_rxq_obj *rxq_obj); void (*rxq_obj_release)(struct mlx5_rxq_obj *rxq_obj); }; diff --git a/drivers/net/mlx5/mlx5_devx.c b/drivers/net/mlx5/mlx5_devx.c index 191b3c2..39e2ad5 100644 --- a/drivers/net/mlx5/mlx5_devx.c +++ b/drivers/net/mlx5/mlx5_devx.c @@ -136,6 +136,43 @@ } /** + * Get event for an Rx DevX queue object. + * + * @param rxq_obj + * DevX Rx queue object. + * + * @return + * 0 on success, a negative errno value otherwise and rte_errno is set. + */ +static int +mlx5_rx_devx_get_event(struct mlx5_rxq_obj *rxq_obj) +{ +#ifdef HAVE_IBV_DEVX_EVENT + union { + struct mlx5dv_devx_async_event_hdr event_resp; + uint8_t buf[sizeof(struct mlx5dv_devx_async_event_hdr) + 128]; + } out; + int ret = mlx5_glue->devx_get_event(rxq_obj->devx_channel, + &out.event_resp, + sizeof(out.buf)); + + if (ret < 0) { + rte_errno = errno; + return -rte_errno; + } + if (out.event_resp.cookie != (uint64_t)(uintptr_t)rxq_obj->devx_cq) { + rte_errno = EINVAL; + return -rte_errno; + } + return 0; +#else + (void)rxq_obj; + rte_errno = ENOTSUP; + return -rte_errno; +#endif /* HAVE_IBV_DEVX_EVENT */ +} + +/** * Fill common fields of create RQ attributes structure. * * @param rxq_data @@ -606,5 +643,6 @@ struct mlx5_obj_ops devx_obj_ops = { .rxq_obj_modify_vlan_strip = mlx5_rxq_obj_modify_rq_vlan_strip, .rxq_obj_new = mlx5_rxq_devx_obj_new, + .rxq_event_get = mlx5_rx_devx_get_event, .rxq_obj_release = mlx5_rxq_devx_obj_release, }; diff --git a/drivers/net/mlx5/mlx5_rxq.c b/drivers/net/mlx5/mlx5_rxq.c index daa92b6..46d5f6c 100644 --- a/drivers/net/mlx5/mlx5_rxq.c +++ b/drivers/net/mlx5/mlx5_rxq.c @@ -1024,10 +1024,8 @@ int mlx5_rx_intr_disable(struct rte_eth_dev *dev, uint16_t rx_queue_id) { + struct mlx5_priv *priv = dev->data->dev_private; struct mlx5_rxq_ctrl *rxq_ctrl; - struct mlx5_rxq_obj *rxq_obj = NULL; - struct ibv_cq *ev_cq; - void *ev_ctx; int ret = 0; rxq_ctrl = mlx5_rxq_get(dev, rx_queue_id); @@ -1035,42 +1033,20 @@ rte_errno = EINVAL; return -rte_errno; } - if (!rxq_ctrl->irq) { - mlx5_rxq_release(dev, rx_queue_id); - return 0; - } - rxq_obj = rxq_ctrl->obj; - if (!rxq_obj) + if (!rxq_ctrl->obj) goto error; - if (rxq_obj->type == MLX5_RXQ_OBJ_TYPE_IBV) { - ret = mlx5_glue->get_cq_event(rxq_obj->ibv_channel, &ev_cq, - &ev_ctx); - if (ret < 0 || ev_cq != rxq_obj->ibv_cq) - goto error; - mlx5_glue->ack_cq_events(rxq_obj->ibv_cq, 1); - } else if (rxq_obj->type == MLX5_RXQ_OBJ_TYPE_DEVX_RQ) { -#ifdef HAVE_IBV_DEVX_EVENT - union { - struct mlx5dv_devx_async_event_hdr event_resp; - uint8_t buf[sizeof(struct mlx5dv_devx_async_event_hdr) - + 128]; - } out; - - ret = mlx5_glue->devx_get_event - (rxq_obj->devx_channel, &out.event_resp, - sizeof(out.buf)); - if (ret < 0 || out.event_resp.cookie != - (uint64_t)(uintptr_t)rxq_obj->devx_cq) + if (rxq_ctrl->irq) { + ret = priv->obj_ops->rxq_event_get(rxq_ctrl->obj); + if (ret < 0) goto error; -#endif /* HAVE_IBV_DEVX_EVENT */ + rxq_ctrl->rxq.cq_arm_sn++; } - rxq_ctrl->rxq.cq_arm_sn++; mlx5_rxq_release(dev, rx_queue_id); return 0; error: /** - * For ret < 0 save the errno (may be EAGAIN which means the get_event - * function was called before receiving one). + * The ret variable may be EAGAIN which means the get_event function was + * called before receiving one. */ if (ret < 0) rte_errno = errno; -- 1.8.3.1