From patchwork Thu Oct 12 12:19:39 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Adrien Mazarguil X-Patchwork-Id: 30276 X-Patchwork-Delegate: ferruh.yigit@amd.com Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 62D0A1B338; Thu, 12 Oct 2017 14:20:54 +0200 (CEST) Received: from mail-wm0-f43.google.com (mail-wm0-f43.google.com [74.125.82.43]) by dpdk.org (Postfix) with ESMTP id 9923B1B307 for ; Thu, 12 Oct 2017 14:20:39 +0200 (CEST) Received: by mail-wm0-f43.google.com with SMTP id u138so12893211wmu.4 for ; Thu, 12 Oct 2017 05:20:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=6wind-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=xVtV4W7z+OVz1LQx7YYkveJGc3FK/VigrTjN7Fgsd6k=; b=gA0M2vJll1dx+Wyp5vuq6zylw3v2nUjiWhsYqUauQuqlknenc8JZSvC9EFEkDKH5XM 2pM0sJu+2nxb7JIcF7CQk5QUGdX/RZaOUCd32DdjK76k6+oWhq649ZeEOI5WbtNp5Dwy 1AecMiD9KSGLKwZjXLr5wy3xw7lzOdutaKglU9fNdCxS/ZZzl3sWVB0JSLNH5WcrPyLe 44NOTxDcZHQ5H7aUjLsZ/gbkHJLN1sK7tzUMHRUgDmb5HaSzpgW7cAHOsKfMx1nQCi8i qyIXB+/A4slx5MPziK2iNMubZAKVtRKBLVF2wUV8vQsHI6lrX0PMGaJwmbAuNlOkFaf6 n/zQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=xVtV4W7z+OVz1LQx7YYkveJGc3FK/VigrTjN7Fgsd6k=; b=XxV8C/idSwSD7bfBq728ebgVDgdzJAsXviOgH1ZyLCIuM1jSyE0PFVyWHeqMIyN6rk ZX9/EJpXUVCnZFX/iyjI0XogdtwIlZlKeYFH6gQNVpb2N1W5rllb145z6QG7ucK3vMI7 Rv7NETMTrtz6ZKElq0ujAeMQwaVO1vptxDRv9FLy59VIQbSmHEnrQiySBOsOmOkM8W8F ILyFSd/vd8NSqJkLcFNEYx4eRa0ECDp5lRfM1qE/2lAlwZH5bdtgz2SoT2te9YFEwcUm w4IF+KJDnpzIg+8XjUjqBCMq756rz1rIf+Ah2CljTAwXP5WfBkX/yT6MY5nkRxMn5TqZ 5ZCw== X-Gm-Message-State: AMCzsaXpBN0Pmn6w8s4LCOekXv9TQVlNlrIe1DYi7ExHAofLXZaBvP6b in1hrH/pqbuFMTNVF8OSYdElfByl X-Google-Smtp-Source: AOwi7QBfHu/3kt89pR+3WS31KPSrEQUShhikXpkip8zDE2C0BkvcaL9Z2KplVbbrmk6ztddBf4WtYg== X-Received: by 10.223.157.30 with SMTP id k30mr1779320wre.159.1507810839317; Thu, 12 Oct 2017 05:20:39 -0700 (PDT) Received: from 6wind.com (host.78.145.23.62.rev.coltfrance.com. [62.23.145.78]) by smtp.gmail.com with ESMTPSA id l9sm13779657wrf.70.2017.10.12.05.20.38 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 12 Oct 2017 05:20:38 -0700 (PDT) From: Adrien Mazarguil To: Ferruh Yigit Cc: Nelio Laranjeiro , dev@dpdk.org Date: Thu, 12 Oct 2017 14:19:39 +0200 Message-Id: X-Mailer: git-send-email 2.1.4 In-Reply-To: References: Subject: [dpdk-dev] [PATCH v2 25/29] net/mlx4: convert Rx path to work queues 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" Work queues (WQs) are lower-level than standard queue pairs (QPs). They are dedicated to one traffic direction and have to be used in conjunction with indirection tables and special "hash" QPs to get the same level of functionality. These extra objects however are the building blocks for RSS support brought by subsequent commits, as a single "hash" QP can manage several WQs through an indirection table according to a hash algorithm and other parameters. Signed-off-by: Adrien Mazarguil Acked-by: Nelio Laranjeiro --- drivers/net/mlx4/mlx4.h | 3 ++ drivers/net/mlx4/mlx4_rxq.c | 74 ++++++++++++++++++++++++++++++++------- drivers/net/mlx4/mlx4_rxtx.c | 2 +- drivers/net/mlx4/mlx4_rxtx.h | 2 ++ 4 files changed, 68 insertions(+), 13 deletions(-) diff --git a/drivers/net/mlx4/mlx4.h b/drivers/net/mlx4/mlx4.h index a27399a..b04a104 100644 --- a/drivers/net/mlx4/mlx4.h +++ b/drivers/net/mlx4/mlx4.h @@ -61,6 +61,9 @@ /** Maximum size for inline data. */ #define MLX4_PMD_MAX_INLINE 0 +/** Fixed RSS hash key size in bytes. Cannot be modified. */ +#define MLX4_RSS_HASH_KEY_SIZE 40 + /** * Maximum number of cached Memory Pools (MPs) per TX queue. Each RTE MP * from which buffers are to be transmitted will have to be mapped by this diff --git a/drivers/net/mlx4/mlx4_rxq.c b/drivers/net/mlx4/mlx4_rxq.c index 9978e5d..171fe3f 100644 --- a/drivers/net/mlx4/mlx4_rxq.c +++ b/drivers/net/mlx4/mlx4_rxq.c @@ -268,18 +268,64 @@ mlx4_rx_queue_setup(struct rte_eth_dev *dev, uint16_t idx, uint16_t desc, (void *)dev, strerror(rte_errno)); goto error; } - rxq->qp = ibv_create_qp - (priv->pd, - &(struct ibv_qp_init_attr){ - .send_cq = rxq->cq, - .recv_cq = rxq->cq, - .cap = { - .max_recv_wr = - RTE_MIN(priv->device_attr.max_qp_wr, - desc), - .max_recv_sge = 1, + rxq->wq = ibv_create_wq + (priv->ctx, + &(struct ibv_wq_init_attr){ + .wq_type = IBV_WQT_RQ, + .max_wr = RTE_MIN(priv->device_attr.max_qp_wr, desc), + .max_sge = 1, + .pd = priv->pd, + .cq = rxq->cq, + }); + if (!rxq->wq) { + rte_errno = errno ? errno : EINVAL; + ERROR("%p: WQ creation failure: %s", + (void *)dev, strerror(rte_errno)); + goto error; + } + ret = ibv_modify_wq + (rxq->wq, + &(struct ibv_wq_attr){ + .attr_mask = IBV_WQ_ATTR_STATE, + .wq_state = IBV_WQS_RDY, + }); + if (ret) { + rte_errno = ret; + ERROR("%p: WQ state to IBV_WPS_RDY failed: %s", + (void *)dev, strerror(rte_errno)); + goto error; + } + rxq->ind = ibv_create_rwq_ind_table + (priv->ctx, + &(struct ibv_rwq_ind_table_init_attr){ + .log_ind_tbl_size = 0, + .ind_tbl = (struct ibv_wq *[]){ + rxq->wq, }, + .comp_mask = 0, + }); + if (!rxq->ind) { + rte_errno = errno ? errno : EINVAL; + ERROR("%p: indirection table creation failure: %s", + (void *)dev, strerror(errno)); + goto error; + } + rxq->qp = ibv_create_qp_ex + (priv->ctx, + &(struct ibv_qp_init_attr_ex){ + .comp_mask = (IBV_QP_INIT_ATTR_PD | + IBV_QP_INIT_ATTR_RX_HASH | + IBV_QP_INIT_ATTR_IND_TABLE), .qp_type = IBV_QPT_RAW_PACKET, + .pd = priv->pd, + .rwq_ind_tbl = rxq->ind, + .rx_hash_conf = { + .rx_hash_function = IBV_RX_HASH_FUNC_TOEPLITZ, + .rx_hash_key_len = MLX4_RSS_HASH_KEY_SIZE, + .rx_hash_key = + (uint8_t [MLX4_RSS_HASH_KEY_SIZE]){ 0 }, + .rx_hash_fields_mask = 0, + }, }); if (!rxq->qp) { rte_errno = errno ? errno : EINVAL; @@ -306,8 +352,8 @@ mlx4_rx_queue_setup(struct rte_eth_dev *dev, uint16_t idx, uint16_t desc, (void *)dev, strerror(rte_errno)); goto error; } - ret = ibv_post_recv(rxq->qp, &(*rxq->elts)[0].wr, - &(struct ibv_recv_wr *){ NULL }); + ret = ibv_post_wq_recv(rxq->wq, &(*rxq->elts)[0].wr, + &(struct ibv_recv_wr *){ NULL }); if (ret) { rte_errno = ret; ERROR("%p: ibv_post_recv() failed: %s", @@ -373,6 +419,10 @@ mlx4_rx_queue_release(void *dpdk_rxq) mlx4_rxq_free_elts(rxq); if (rxq->qp) claim_zero(ibv_destroy_qp(rxq->qp)); + if (rxq->ind) + claim_zero(ibv_destroy_rwq_ind_table(rxq->ind)); + if (rxq->wq) + claim_zero(ibv_destroy_wq(rxq->wq)); if (rxq->cq) claim_zero(ibv_destroy_cq(rxq->cq)); if (rxq->channel) diff --git a/drivers/net/mlx4/mlx4_rxtx.c b/drivers/net/mlx4/mlx4_rxtx.c index b5e7777..859f1bd 100644 --- a/drivers/net/mlx4/mlx4_rxtx.c +++ b/drivers/net/mlx4/mlx4_rxtx.c @@ -459,7 +459,7 @@ mlx4_rx_burst(void *dpdk_rxq, struct rte_mbuf **pkts, uint16_t pkts_n) /* Repost WRs. */ *wr_next = NULL; assert(wr_head); - ret = ibv_post_recv(rxq->qp, wr_head, &wr_bad); + ret = ibv_post_wq_recv(rxq->wq, wr_head, &wr_bad); if (unlikely(ret)) { /* Inability to repost WRs is fatal. */ DEBUG("%p: recv_burst(): failed (ret=%d)", diff --git a/drivers/net/mlx4/mlx4_rxtx.h b/drivers/net/mlx4/mlx4_rxtx.h index d90f2f9..897fd2a 100644 --- a/drivers/net/mlx4/mlx4_rxtx.h +++ b/drivers/net/mlx4/mlx4_rxtx.h @@ -73,6 +73,8 @@ struct rxq { struct rte_mempool *mp; /**< Memory pool for allocations. */ struct ibv_mr *mr; /**< Memory region (for mp). */ struct ibv_cq *cq; /**< Completion queue. */ + struct ibv_wq *wq; /**< Work queue. */ + struct ibv_rwq_ind_table *ind; /**< Indirection table. */ struct ibv_qp *qp; /**< Queue pair. */ struct ibv_comp_channel *channel; /**< Rx completion channel. */ unsigned int port_id; /**< Port ID for incoming packets. */