From patchwork Tue Aug 1 16:54:12 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Adrien Mazarguil X-Patchwork-Id: 27341 Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [IPv6:::1]) by dpdk.org (Postfix) with ESMTP id 69DF9A1EA; Tue, 1 Aug 2017 18:55:56 +0200 (CEST) Received: from mail-wm0-f48.google.com (mail-wm0-f48.google.com [74.125.82.48]) by dpdk.org (Postfix) with ESMTP id BC997A122 for ; Tue, 1 Aug 2017 18:55:26 +0200 (CEST) Received: by mail-wm0-f48.google.com with SMTP id t201so20380473wmt.0 for ; Tue, 01 Aug 2017 09:55:26 -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=Ae7FCM5MQ/Nr45mWc+MmItATdz3+6zf/rKBlGAQ+QnQ=; b=XVlpFwH2rxTxmHkQLEnUNqu4cLeJXUR/S8j67kgEFzP3y91yDHeaZ/sL8A3fJcSZc9 EFdrKfzX+PcV6A9oYlGD/XXgVC4ltEkDLjr6AxgMUzPbmEPEPhQe8tsT0wcrT0FiU/Ou 2iPy8zxIIHBX6uvIbXFhOgqW4cCDzT9IIfPsWdtd7EzT/9EQXwdoOSYmQcpb0Ei7zBT5 Wzjxxis0LCqF+tCNKW+EJwhU4ghc4vI0we1Dy1Tv77XI3aSVcc5lgTETmO+mcdwYfYWd k4oQGl5cK9fcFcy86V1ZhmON1SnOvrXcJfMpa18Y4CvIXG7X6GrujvSVSwVoLEwLw5bm opsw== 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=Ae7FCM5MQ/Nr45mWc+MmItATdz3+6zf/rKBlGAQ+QnQ=; b=NzuZHo/wDgrnS/u02am2MPvecxlp7tujFK62YNJIJxPVnNWl0xeP0LPJ/QRYUUzcJb pPa7PFSDPazr00igCFUFyoTC4Lg7DAE/pc1AbiZZvp8hXxg9mqI7MLcvsjitmy7cWNvD qbWx3eCQmySM0TsaIPHHCdwM0XnpVmR+j4prtFYTXi6nTUIFoPGt89xwnKU09KsIO51E 1fmqPPG5pqfCzpcucC2ZQT8L9ck8J4u2T2C6xTWgFWB5bepZW3xMCONpt3+LyWD4XY9R MF0E7x7F8IL24R/o2pLCVeeMbjFLFrUJuH2MVEwzPVu6G5MMCReLR3iyzAIPHEbR+u5P RiHA== X-Gm-Message-State: AIVw1104kFwOvx2sZpEBwkIf9OvSqvhGTE43VQlOBqe23ImO4MLPzwky 4GbjCdx/AcXuk2MSgrQ= X-Received: by 10.28.167.134 with SMTP id q128mr2011003wme.145.1501606526224; Tue, 01 Aug 2017 09:55:26 -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 g16sm1709852wmd.37.2017.08.01.09.55.25 (version=TLS1_2 cipher=AES128-SHA bits=128/128); Tue, 01 Aug 2017 09:55:25 -0700 (PDT) From: Adrien Mazarguil To: dev@dpdk.org Cc: Moti Haimovsky Date: Tue, 1 Aug 2017 18:54:12 +0200 Message-Id: X-Mailer: git-send-email 2.1.4 In-Reply-To: References: Subject: [dpdk-dev] [PATCH v1 25/48] net/mlx4: revert fast Verbs interface for Rx 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" This reverts commit acac55f164128fc76da8d93cae1e8c1e560e99f6. "Fast Verbs" is a nonstandard experimental interface that must be reverted for compatibility reasons. Its replacement is slower but temporary, performance will be restored by a subsequent commit through an enhanced data path implementation. This one focuses on maintaining basic functionality in the meantime. Signed-off-by: Moti Haimovsky Signed-off-by: Adrien Mazarguil --- drivers/net/mlx4/mlx4.c | 127 +++++++++++-------------------------------- drivers/net/mlx4/mlx4.h | 2 - 2 files changed, 33 insertions(+), 96 deletions(-) diff --git a/drivers/net/mlx4/mlx4.c b/drivers/net/mlx4/mlx4.c index 812f29c..5b7238e 100644 --- a/drivers/net/mlx4/mlx4.c +++ b/drivers/net/mlx4/mlx4.c @@ -1628,32 +1628,8 @@ priv_mac_addr_add(struct priv *priv) static void rxq_cleanup(struct rxq *rxq) { - struct ibv_exp_release_intf_params params; - DEBUG("cleaning up %p", (void *)rxq); rxq_free_elts(rxq); - if (rxq->if_qp != NULL) { - assert(rxq->priv != NULL); - assert(rxq->priv->ctx != NULL); - assert(rxq->qp != NULL); - params = (struct ibv_exp_release_intf_params){ - .comp_mask = 0, - }; - claim_zero(ibv_exp_release_intf(rxq->priv->ctx, - rxq->if_qp, - ¶ms)); - } - if (rxq->if_cq != NULL) { - assert(rxq->priv != NULL); - assert(rxq->priv->ctx != NULL); - assert(rxq->cq != NULL); - params = (struct ibv_exp_release_intf_params){ - .comp_mask = 0, - }; - claim_zero(ibv_exp_release_intf(rxq->priv->ctx, - rxq->if_cq, - ¶ms)); - } if (rxq->qp != NULL) claim_zero(ibv_destroy_qp(rxq->qp)); if (rxq->cq != NULL) @@ -1687,23 +1663,37 @@ mlx4_rx_burst(void *dpdk_rxq, struct rte_mbuf **pkts, uint16_t pkts_n) struct rxq_elt (*elts)[rxq->elts_n] = rxq->elts; const unsigned int elts_n = rxq->elts_n; unsigned int elts_head = rxq->elts_head; - struct ibv_sge sges[pkts_n]; + struct ibv_wc wcs[pkts_n]; + struct ibv_recv_wr *wr_head = NULL; + struct ibv_recv_wr **wr_next = &wr_head; + struct ibv_recv_wr *wr_bad = NULL; unsigned int i; unsigned int pkts_ret = 0; int ret; - for (i = 0; (i != pkts_n); ++i) { + ret = ibv_poll_cq(rxq->cq, pkts_n, wcs); + if (unlikely(ret == 0)) + return 0; + if (unlikely(ret < 0)) { + DEBUG("rxq=%p, ibv_poll_cq() failed (wc_n=%d)", + (void *)rxq, ret); + return 0; + } + assert(ret <= (int)pkts_n); + /* For each work completion. */ + for (i = 0; i != (unsigned int)ret; ++i) { + struct ibv_wc *wc = &wcs[i]; struct rxq_elt *elt = &(*elts)[elts_head]; struct ibv_recv_wr *wr = &elt->wr; uint64_t wr_id = wr->wr_id; - unsigned int len; + uint32_t len = wc->byte_len; struct rte_mbuf *seg = (void *)((uintptr_t)elt->sge.addr - WR_ID(wr_id).offset); struct rte_mbuf *rep; - uint32_t flags; /* Sanity checks. */ assert(WR_ID(wr_id).id < rxq->elts_n); + assert(wr_id == wc->wr_id); assert(wr->sg_list == &elt->sge); assert(wr->num_sge == 1); assert(elts_head < rxq->elts_n); @@ -1714,41 +1704,19 @@ mlx4_rx_burst(void *dpdk_rxq, struct rte_mbuf **pkts, uint16_t pkts_n) */ rte_mbuf_prefetch_part1(seg); rte_mbuf_prefetch_part2(seg); - ret = rxq->if_cq->poll_length_flags(rxq->cq, NULL, NULL, - &flags); - if (unlikely(ret < 0)) { - struct ibv_wc wc; - int wcs_n; - - DEBUG("rxq=%p, poll_length() failed (ret=%d)", - (void *)rxq, ret); - /* ibv_poll_cq() must be used in case of failure. */ - wcs_n = ibv_poll_cq(rxq->cq, 1, &wc); - if (unlikely(wcs_n == 0)) - break; - if (unlikely(wcs_n < 0)) { - DEBUG("rxq=%p, ibv_poll_cq() failed (wcs_n=%d)", - (void *)rxq, wcs_n); - break; - } - assert(wcs_n == 1); - if (unlikely(wc.status != IBV_WC_SUCCESS)) { - /* Whatever, just repost the offending WR. */ - DEBUG("rxq=%p, wr_id=%" PRIu64 ": bad work" - " completion status (%d): %s", - (void *)rxq, wc.wr_id, wc.status, - ibv_wc_status_str(wc.status)); - /* Increment dropped packets counter. */ - ++rxq->stats.idropped; - /* Add SGE to array for repost. */ - sges[i] = elt->sge; - goto repost; - } - ret = wc.byte_len; + /* Link completed WRs together for repost. */ + *wr_next = wr; + wr_next = &wr->next; + if (unlikely(wc->status != IBV_WC_SUCCESS)) { + /* Whatever, just repost the offending WR. */ + DEBUG("rxq=%p, wr_id=%" PRIu64 ": bad work completion" + " status (%d): %s", + (void *)rxq, wr_id, wc->status, + ibv_wc_status_str(wc->status)); + /* Increment dropped packets counter. */ + ++rxq->stats.idropped; + goto repost; } - if (ret == 0) - break; - len = ret; rep = rte_mbuf_raw_alloc(rxq->mp); if (unlikely(rep == NULL)) { /* @@ -1761,8 +1729,6 @@ mlx4_rx_burst(void *dpdk_rxq, struct rte_mbuf **pkts, uint16_t pkts_n) /* Increase out of memory counters. */ ++rxq->stats.rx_nombuf; ++rxq->priv->dev->data->rx_mbuf_alloc_failed; - /* Add SGE to array for repost. */ - sges[i] = elt->sge; goto repost; } @@ -1774,9 +1740,6 @@ mlx4_rx_burst(void *dpdk_rxq, struct rte_mbuf **pkts, uint16_t pkts_n) (uintptr_t)rep); assert(WR_ID(wr->wr_id).id == WR_ID(wr_id).id); - /* Add SGE to array for repost. */ - sges[i] = elt->sge; - /* Update seg information. */ SET_DATA_OFF(seg, RTE_PKTMBUF_HEADROOM); NB_SEGS(seg) = 1; @@ -1800,7 +1763,9 @@ mlx4_rx_burst(void *dpdk_rxq, struct rte_mbuf **pkts, uint16_t pkts_n) if (unlikely(i == 0)) return 0; /* Repost WRs. */ - ret = rxq->if_qp->recv_burst(rxq->qp, sges, i); + *wr_next = NULL; + assert(wr_head); + ret = ibv_post_recv(rxq->qp, wr_head, &wr_bad); if (unlikely(ret)) { /* Inability to repost WRs is fatal. */ DEBUG("%p: recv_burst(): failed (ret=%d)", @@ -1881,10 +1846,6 @@ rxq_setup(struct rte_eth_dev *dev, struct rxq *rxq, uint16_t desc, .socket = socket }; struct ibv_qp_attr mod; - union { - struct ibv_exp_query_intf_params params; - } attr; - enum ibv_exp_query_intf_status status; struct ibv_recv_wr *bad_wr; unsigned int mb_len; int ret = 0; @@ -1986,28 +1947,6 @@ rxq_setup(struct rte_eth_dev *dev, struct rxq *rxq, uint16_t desc, /* Save port ID. */ tmpl.port_id = dev->data->port_id; DEBUG("%p: RTE port ID: %u", (void *)rxq, tmpl.port_id); - attr.params = (struct ibv_exp_query_intf_params){ - .intf_scope = IBV_EXP_INTF_GLOBAL, - .intf = IBV_EXP_INTF_CQ, - .obj = tmpl.cq, - }; - tmpl.if_cq = ibv_exp_query_intf(priv->ctx, &attr.params, &status); - if (tmpl.if_cq == NULL) { - ERROR("%p: CQ interface family query failed with status %d", - (void *)dev, status); - goto error; - } - attr.params = (struct ibv_exp_query_intf_params){ - .intf_scope = IBV_EXP_INTF_GLOBAL, - .intf = IBV_EXP_INTF_QP_BURST, - .obj = tmpl.qp, - }; - tmpl.if_qp = ibv_exp_query_intf(priv->ctx, &attr.params, &status); - if (tmpl.if_qp == NULL) { - ERROR("%p: QP interface family query failed with status %d", - (void *)dev, status); - goto error; - } /* Clean up rxq in case we're reinitializing it. */ DEBUG("%p: cleaning-up old rxq just in case", (void *)rxq); rxq_cleanup(rxq); diff --git a/drivers/net/mlx4/mlx4.h b/drivers/net/mlx4/mlx4.h index 11c8885..635036e 100644 --- a/drivers/net/mlx4/mlx4.h +++ b/drivers/net/mlx4/mlx4.h @@ -152,8 +152,6 @@ struct rxq { struct ibv_mr *mr; /* Memory Region (for mp). */ struct ibv_cq *cq; /* Completion Queue. */ struct ibv_qp *qp; /* Queue Pair. */ - struct ibv_exp_qp_burst_family *if_qp; /* QP burst interface. */ - struct ibv_exp_cq_family *if_cq; /* CQ interface. */ struct ibv_comp_channel *channel; unsigned int port_id; /* Port ID for incoming packets. */ unsigned int elts_n; /* (*elts)[] length. */