get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/patches/10750/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 10750,
    "url": "https://patches.dpdk.org/api/patches/10750/?format=api",
    "web_url": "https://patches.dpdk.org/project/dpdk/patch/1456165083-28316-4-git-send-email-adrien.mazarguil@6wind.com/",
    "project": {
        "id": 1,
        "url": "https://patches.dpdk.org/api/projects/1/?format=api",
        "name": "DPDK",
        "link_name": "dpdk",
        "list_id": "dev.dpdk.org",
        "list_email": "dev@dpdk.org",
        "web_url": "http://core.dpdk.org",
        "scm_url": "git://dpdk.org/dpdk",
        "webscm_url": "http://git.dpdk.org/dpdk",
        "list_archive_url": "https://inbox.dpdk.org/dev",
        "list_archive_url_format": "https://inbox.dpdk.org/dev/{}",
        "commit_url_format": ""
    },
    "msgid": "<1456165083-28316-4-git-send-email-adrien.mazarguil@6wind.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/1456165083-28316-4-git-send-email-adrien.mazarguil@6wind.com",
    "date": "2016-02-22T18:17:59",
    "name": "[dpdk-dev,v2,3/7] mlx5: remove one indirection level from RX/TX functions",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "0d10fcb9e5a8d0371dabbfb1d4487049e7b96a66",
    "submitter": {
        "id": 165,
        "url": "https://patches.dpdk.org/api/people/165/?format=api",
        "name": "Adrien Mazarguil",
        "email": "adrien.mazarguil@6wind.com"
    },
    "delegate": {
        "id": 10,
        "url": "https://patches.dpdk.org/api/users/10/?format=api",
        "username": "bruce",
        "first_name": "Bruce",
        "last_name": "Richardson",
        "email": "bruce.richardson@intel.com"
    },
    "mbox": "https://patches.dpdk.org/project/dpdk/patch/1456165083-28316-4-git-send-email-adrien.mazarguil@6wind.com/mbox/",
    "series": [],
    "comments": "https://patches.dpdk.org/api/patches/10750/comments/",
    "check": "pending",
    "checks": "https://patches.dpdk.org/api/patches/10750/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dev-bounces@dpdk.org>",
        "X-Original-To": "patchwork@dpdk.org",
        "Delivered-To": "patchwork@dpdk.org",
        "Received": [
            "from [92.243.14.124] (localhost [IPv6:::1])\n\tby dpdk.org (Postfix) with ESMTP id 2CB83388F;\n\tMon, 22 Feb 2016 19:18:32 +0100 (CET)",
            "from mail-wm0-f43.google.com (mail-wm0-f43.google.com\n\t[74.125.82.43]) by dpdk.org (Postfix) with ESMTP id A02333238\n\tfor <dev@dpdk.org>; Mon, 22 Feb 2016 19:18:29 +0100 (CET)",
            "by mail-wm0-f43.google.com with SMTP id b205so167528489wmb.1\n\tfor <dev@dpdk.org>; Mon, 22 Feb 2016 10:18:29 -0800 (PST)",
            "from 6wind.com (guy78-3-82-239-227-177.fbx.proxad.net.\n\t[82.239.227.177]) by smtp.gmail.com with ESMTPSA id\n\tbg1sm25830679wjc.27.2016.02.22.10.18.27\n\t(version=TLSv1/SSLv3 cipher=OTHER);\n\tMon, 22 Feb 2016 10:18:28 -0800 (PST)"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=6wind-com.20150623.gappssmtp.com; s=20150623;\n\th=from:to:cc:subject:date:message-id:in-reply-to:references;\n\tbh=iXUlPx96iTzc0B5krEAf8ul/voEG4A4R274p1SWOd+8=;\n\tb=HaCcqbzMYINgCLdg4V0tIjLA26ODaStD+c4DbdVFWssQmbEqrRoe6CYSIclB2je8sm\n\t0To01Vm3ba2IEvtSpDlk5TQrqDiFKfT7JJwFHqIcyYeln9ry2qod1MLt64NsJkSdj8i0\n\tPeyZUW36aNw2IeUz05JAzRLW8xz2NYwR1ou1xiuyQSXW5PA5cgzsJxiZ2eg/vSf8taNi\n\tURlYKbACg3NrulnnOZFHNVcIvAI0Qc7f5Y7nVogNYyb88eSGjPPa61T/VASI665V2NHo\n\tMOoP15NQoGHtQMEmqUOdgY191msd9dVSfOdx8Wbs/EWVXegy8GwhZEs8p9E1T9HJcahX\n\tdfNw==",
        "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20130820;\n\th=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to\n\t:references;\n\tbh=iXUlPx96iTzc0B5krEAf8ul/voEG4A4R274p1SWOd+8=;\n\tb=kgdN0d12oxICsvLHD1/iGDygC/c8By5hIkHZu3Qzz75xmFPy5rSyzOEAle2aYyTsW4\n\tokgO8NMhdgeRuh3JKt6EdVmsgHHvJlfq88qtZRRbFIX5ZqU1ea8NhhQZxldMArdM8FC/\n\tdVyP61TG5kpkM/7Na27GQ2ildSQVa/6de6yl0M3mW1k4kEuQba7bpnRlCMMBVDAwCuOC\n\tg43fkmelo/2bOG8m/pb1/b6kWo8RaGSgWgGDasWFYfUjlOyQNN6e/AvZFqyJ7tCR5W6u\n\t6J9X+/tytwHcrxSGC0MwLhL++ZiWZg8WS1W83Yd00dynoCS6a4NeNbRbGbvVHVpe75vw\n\tlFdw==",
        "X-Gm-Message-State": "AG10YOTzSHM+oV0vJRZfI097QPGeNPK9v48+WMs/vOvFbQ0QMQffTc/KnEBqbtfzYLH9/W8+",
        "X-Received": "by 10.28.178.208 with SMTP id b199mr13042010wmf.51.1456165109499;\n\tMon, 22 Feb 2016 10:18:29 -0800 (PST)",
        "From": "Adrien Mazarguil <adrien.mazarguil@6wind.com>",
        "To": "dev@dpdk.org",
        "Date": "Mon, 22 Feb 2016 19:17:59 +0100",
        "Message-Id": "<1456165083-28316-4-git-send-email-adrien.mazarguil@6wind.com>",
        "X-Mailer": "git-send-email 2.1.4",
        "In-Reply-To": "<1456165083-28316-1-git-send-email-adrien.mazarguil@6wind.com>",
        "References": "<1454063573-1993-1-git-send-email-adrien.mazarguil@6wind.com>\n\t<1456165083-28316-1-git-send-email-adrien.mazarguil@6wind.com>",
        "Subject": "[dpdk-dev] [PATCH v2 3/7] mlx5: remove one indirection level from\n\tRX/TX functions",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.15",
        "Precedence": "list",
        "List-Id": "patches and discussions about DPDK <dev.dpdk.org>",
        "List-Unsubscribe": "<http://dpdk.org/ml/options/dev>,\n\t<mailto:dev-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://dpdk.org/ml/archives/dev/>",
        "List-Post": "<mailto:dev@dpdk.org>",
        "List-Help": "<mailto:dev-request@dpdk.org?subject=help>",
        "List-Subscribe": "<http://dpdk.org/ml/listinfo/dev>,\n\t<mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org",
        "Sender": "\"dev\" <dev-bounces@dpdk.org>"
    },
    "content": "From: Nelio Laranjeiro <nelio.laranjeiro@6wind.com>\n\nAvoid dereferencing pointers twice to get to fast Verbs functions by\nstoring them directly in RX/TX queue structures.\n\nSigned-off-by: Nelio Laranjeiro <nelio.laranjeiro@6wind.com>\nSigned-off-by: Yaacov Hazan <yaacovh@mellanox.com>\n---\n drivers/net/mlx5/Makefile    |  1 +\n drivers/net/mlx5/mlx5_rxq.c  | 16 ++++++++++++++++\n drivers/net/mlx5/mlx5_rxtx.c | 34 +++++++++-------------------------\n drivers/net/mlx5/mlx5_rxtx.h | 23 +++++++++++++++++------\n drivers/net/mlx5/mlx5_txq.c  | 14 ++++++++++++++\n 5 files changed, 57 insertions(+), 31 deletions(-)",
    "diff": "diff --git a/drivers/net/mlx5/Makefile b/drivers/net/mlx5/Makefile\nindex 46a17e0..39cdf2c 100644\n--- a/drivers/net/mlx5/Makefile\n+++ b/drivers/net/mlx5/Makefile\n@@ -67,6 +67,7 @@ CFLAGS += -g\n CFLAGS += -I.\n CFLAGS += -D_XOPEN_SOURCE=600\n CFLAGS += $(WERROR_FLAGS)\n+CFLAGS += -Wno-strict-prototypes\n LDLIBS += -libverbs\n \n # A few warnings cannot be avoided in external headers.\ndiff --git a/drivers/net/mlx5/mlx5_rxq.c b/drivers/net/mlx5/mlx5_rxq.c\nindex 573ad8f..55d002e 100644\n--- a/drivers/net/mlx5/mlx5_rxq.c\n+++ b/drivers/net/mlx5/mlx5_rxq.c\n@@ -901,6 +901,8 @@ rxq_cleanup(struct rxq *rxq)\n \t\trxq_free_elts_sp(rxq);\n \telse\n \t\trxq_free_elts(rxq);\n+\trxq->poll = NULL;\n+\trxq->recv = NULL;\n \tif (rxq->if_wq != NULL) {\n \t\tassert(rxq->priv != NULL);\n \t\tassert(rxq->priv->ctx != NULL);\n@@ -1103,6 +1105,10 @@ rxq_rehash(struct rte_eth_dev *dev, struct rxq *rxq)\n \t\terr = EIO;\n \t\tgoto error;\n \t}\n+\tif (tmpl.sp)\n+\t\ttmpl.recv = tmpl.if_wq->recv_sg_list;\n+\telse\n+\t\ttmpl.recv = tmpl.if_wq->recv_burst;\n error:\n \t*rxq = tmpl;\n \tassert(err >= 0);\n@@ -1345,6 +1351,16 @@ rxq_setup(struct rte_eth_dev *dev, struct rxq *rxq, uint16_t desc,\n \t*rxq = tmpl;\n \tDEBUG(\"%p: rxq updated with %p\", (void *)rxq, (void *)&tmpl);\n \tassert(ret == 0);\n+\t/* Assign function in queue. */\n+#ifdef HAVE_EXP_DEVICE_ATTR_VLAN_OFFLOADS\n+\trxq->poll = rxq->if_cq->poll_length_flags_cvlan;\n+#else /* HAVE_EXP_DEVICE_ATTR_VLAN_OFFLOADS */\n+\trxq->poll = rxq->if_cq->poll_length_flags;\n+#endif /* HAVE_EXP_DEVICE_ATTR_VLAN_OFFLOADS */\n+\tif (rxq->sp)\n+\t\trxq->recv = rxq->if_wq->recv_sg_list;\n+\telse\n+\t\trxq->recv = rxq->if_wq->recv_burst;\n \treturn 0;\n error:\n \trxq_cleanup(&tmpl);\ndiff --git a/drivers/net/mlx5/mlx5_rxtx.c b/drivers/net/mlx5/mlx5_rxtx.c\nindex bee5ce2..63ddc53 100644\n--- a/drivers/net/mlx5/mlx5_rxtx.c\n+++ b/drivers/net/mlx5/mlx5_rxtx.c\n@@ -93,7 +93,7 @@ txq_complete(struct txq *txq)\n \tDEBUG(\"%p: processing %u work requests completions\",\n \t      (void *)txq, elts_comp);\n #endif\n-\twcs_n = txq->if_cq->poll_cnt(txq->cq, elts_comp);\n+\twcs_n = txq->poll_cnt(txq->cq, elts_comp);\n \tif (unlikely(wcs_n == 0))\n \t\treturn 0;\n \tif (unlikely(wcs_n < 0)) {\n@@ -538,14 +538,14 @@ mlx5_tx_burst(void *dpdk_txq, struct rte_mbuf **pkts, uint16_t pkts_n)\n \t\t\t/* Put packet into send queue. */\n #if MLX5_PMD_MAX_INLINE > 0\n \t\t\tif (length <= txq->max_inline)\n-\t\t\t\terr = txq->if_qp->send_pending_inline\n+\t\t\t\terr = txq->send_pending_inline\n \t\t\t\t\t(txq->qp,\n \t\t\t\t\t (void *)addr,\n \t\t\t\t\t length,\n \t\t\t\t\t send_flags);\n \t\t\telse\n #endif\n-\t\t\t\terr = txq->if_qp->send_pending\n+\t\t\t\terr = txq->send_pending\n \t\t\t\t\t(txq->qp,\n \t\t\t\t\t addr,\n \t\t\t\t\t length,\n@@ -567,7 +567,7 @@ mlx5_tx_burst(void *dpdk_txq, struct rte_mbuf **pkts, uint16_t pkts_n)\n \t\t\t\tgoto stop;\n \t\t\tRTE_MBUF_PREFETCH_TO_FREE(elt_next->buf);\n \t\t\t/* Put SG list into send queue. */\n-\t\t\terr = txq->if_qp->send_pending_sg_list\n+\t\t\terr = txq->send_pending_sg_list\n \t\t\t\t(txq->qp,\n \t\t\t\t sges,\n \t\t\t\t ret.num,\n@@ -599,7 +599,7 @@ stop:\n \ttxq->stats.opackets += i;\n #endif\n \t/* Ring QP doorbell. */\n-\terr = txq->if_qp->send_flush(txq->qp);\n+\terr = txq->send_flush(txq->qp);\n \tif (unlikely(err)) {\n \t\t/* A nonzero value is not supposed to be returned.\n \t\t * Nothing can be done about it. */\n@@ -733,14 +733,7 @@ mlx5_rx_burst_sp(void *dpdk_rxq, struct rte_mbuf **pkts, uint16_t pkts_n)\n \t\t/* Sanity checks. */\n \t\tassert(elts_head < rxq->elts_n);\n \t\tassert(rxq->elts_head < rxq->elts_n);\n-#ifdef HAVE_EXP_DEVICE_ATTR_VLAN_OFFLOADS\n-\t\tret = rxq->if_cq->poll_length_flags_cvlan(rxq->cq, NULL, NULL,\n-\t\t\t\t\t\t\t  &flags, &vlan_tci);\n-#else /* HAVE_EXP_DEVICE_ATTR_VLAN_OFFLOADS */\n-\t\tret = rxq->if_cq->poll_length_flags(rxq->cq, NULL, NULL,\n-\t\t\t\t\t\t    &flags);\n-\t\t(void)vlan_tci;\n-#endif /* HAVE_EXP_DEVICE_ATTR_VLAN_OFFLOADS */\n+\t\tret = rxq->poll(rxq->cq, NULL, NULL, &flags, &vlan_tci);\n \t\tif (unlikely(ret < 0)) {\n \t\t\tstruct ibv_wc wc;\n \t\t\tint wcs_n;\n@@ -877,9 +870,7 @@ mlx5_rx_burst_sp(void *dpdk_rxq, struct rte_mbuf **pkts, uint16_t pkts_n)\n \t\trxq->stats.ibytes += pkt_buf_len;\n #endif\n repost:\n-\t\tret = rxq->if_wq->recv_sg_list(rxq->wq,\n-\t\t\t\t\t       elt->sges,\n-\t\t\t\t\t       RTE_DIM(elt->sges));\n+\t\tret = rxq->recv(rxq->wq, elt->sges, RTE_DIM(elt->sges));\n \t\tif (unlikely(ret)) {\n \t\t\t/* Inability to repost WRs is fatal. */\n \t\t\tDEBUG(\"%p: recv_sg_list(): failed (ret=%d)\",\n@@ -950,14 +941,7 @@ mlx5_rx_burst(void *dpdk_rxq, struct rte_mbuf **pkts, uint16_t pkts_n)\n \t\t */\n \t\trte_prefetch0(seg);\n \t\trte_prefetch0(&seg->cacheline1);\n-#ifdef HAVE_EXP_DEVICE_ATTR_VLAN_OFFLOADS\n-\t\tret = rxq->if_cq->poll_length_flags_cvlan(rxq->cq, NULL, NULL,\n-\t\t\t\t\t\t\t  &flags, &vlan_tci);\n-#else /* HAVE_EXP_DEVICE_ATTR_VLAN_OFFLOADS */\n-\t\tret = rxq->if_cq->poll_length_flags(rxq->cq, NULL, NULL,\n-\t\t\t\t\t\t    &flags);\n-\t\t(void)vlan_tci;\n-#endif /* HAVE_EXP_DEVICE_ATTR_VLAN_OFFLOADS */\n+\t\tret = rxq->poll(rxq->cq, NULL, NULL, &flags, &vlan_tci);\n \t\tif (unlikely(ret < 0)) {\n \t\t\tstruct ibv_wc wc;\n \t\t\tint wcs_n;\n@@ -1049,7 +1033,7 @@ repost:\n #ifdef DEBUG_RECV\n \tDEBUG(\"%p: reposting %u WRs\", (void *)rxq, i);\n #endif\n-\tret = rxq->if_wq->recv_burst(rxq->wq, sges, i);\n+\tret = rxq->recv(rxq->wq, sges, i);\n \tif (unlikely(ret)) {\n \t\t/* Inability to repost WRs is fatal. */\n \t\tDEBUG(\"%p: recv_burst(): failed (ret=%d)\",\ndiff --git a/drivers/net/mlx5/mlx5_rxtx.h b/drivers/net/mlx5/mlx5_rxtx.h\nindex 4a857d8..b239ebf 100644\n--- a/drivers/net/mlx5/mlx5_rxtx.h\n+++ b/drivers/net/mlx5/mlx5_rxtx.h\n@@ -107,12 +107,8 @@ struct rxq {\n \tstruct rte_mempool *mp; /* Memory Pool for allocations. */\n \tstruct ibv_cq *cq; /* Completion Queue. */\n \tstruct ibv_exp_wq *wq; /* Work Queue. */\n-\tstruct ibv_exp_wq_family *if_wq; /* WQ burst interface. */\n-#ifdef HAVE_EXP_DEVICE_ATTR_VLAN_OFFLOADS\n-\tstruct ibv_exp_cq_family_v1 *if_cq; /* CQ interface. */\n-#else /* HAVE_EXP_DEVICE_ATTR_VLAN_OFFLOADS */\n-\tstruct ibv_exp_cq_family *if_cq; /* CQ interface. */\n-#endif /* HAVE_EXP_DEVICE_ATTR_VLAN_OFFLOADS */\n+\tint32_t (*poll)(); /* Verbs poll function. */\n+\tint32_t (*recv)(); /* Verbs receive function. */\n \tunsigned int port_id; /* Port ID for incoming packets. */\n \tunsigned int elts_n; /* (*elts)[] length. */\n \tunsigned int elts_head; /* Current index in (*elts)[]. */\n@@ -130,6 +126,12 @@ struct rxq {\n \tstruct ibv_exp_res_domain *rd; /* Resource Domain. */\n \tstruct fdir_queue fdir_queue; /* Flow director queue. */\n \tstruct ibv_mr *mr; /* Memory Region (for mp). */\n+\tstruct ibv_exp_wq_family *if_wq; /* WQ burst interface. */\n+#ifdef HAVE_EXP_DEVICE_ATTR_VLAN_OFFLOADS\n+\tstruct ibv_exp_cq_family_v1 *if_cq; /* CQ interface. */\n+#else /* HAVE_EXP_DEVICE_ATTR_VLAN_OFFLOADS */\n+\tstruct ibv_exp_cq_family *if_cq; /* CQ interface. */\n+#endif /* HAVE_EXP_DEVICE_ATTR_VLAN_OFFLOADS */\n };\n \n /* Hash RX queue types. */\n@@ -248,6 +250,15 @@ typedef uint8_t linear_t[16384];\n /* TX queue descriptor. */\n struct txq {\n \tstruct priv *priv; /* Back pointer to private data. */\n+\tint32_t (*poll_cnt)(struct ibv_cq *cq, uint32_t max);\n+\tint (*send_pending)();\n+#if MLX5_PMD_MAX_INLINE > 0\n+\tint (*send_pending_inline)();\n+#endif\n+#if MLX5_PMD_SGE_WR_N > 1\n+\tint (*send_pending_sg_list)();\n+#endif\n+\tint (*send_flush)(struct ibv_qp *qp);\n \tstruct ibv_cq *cq; /* Completion Queue. */\n \tstruct ibv_qp *qp; /* Queue Pair. */\n \tstruct txq_elt (*elts)[]; /* TX elements. */\ndiff --git a/drivers/net/mlx5/mlx5_txq.c b/drivers/net/mlx5/mlx5_txq.c\nindex 214a7c1..3364fca 100644\n--- a/drivers/net/mlx5/mlx5_txq.c\n+++ b/drivers/net/mlx5/mlx5_txq.c\n@@ -187,6 +187,11 @@ txq_cleanup(struct txq *txq)\n \n \tDEBUG(\"cleaning up %p\", (void *)txq);\n \ttxq_free_elts(txq);\n+\ttxq->poll_cnt = NULL;\n+#if MLX5_PMD_MAX_INLINE > 0\n+\ttxq->send_pending_inline = NULL;\n+#endif\n+\ttxq->send_flush = NULL;\n \tif (txq->if_qp != NULL) {\n \t\tassert(txq->priv != NULL);\n \t\tassert(txq->priv->ctx != NULL);\n@@ -414,6 +419,15 @@ txq_setup(struct rte_eth_dev *dev, struct txq *txq, uint16_t desc,\n \tDEBUG(\"%p: cleaning-up old txq just in case\", (void *)txq);\n \ttxq_cleanup(txq);\n \t*txq = tmpl;\n+\ttxq->poll_cnt = txq->if_cq->poll_cnt;\n+#if MLX5_PMD_MAX_INLINE > 0\n+\ttxq->send_pending_inline = txq->if_qp->send_pending_inline;\n+#endif\n+#if MLX5_PMD_SGE_WR_N > 1\n+\ttxq->send_pending_sg_list = txq->if_qp->send_pending_sg_list;\n+#endif\n+\ttxq->send_pending = txq->if_qp->send_pending;\n+\ttxq->send_flush = txq->if_qp->send_flush;\n \tDEBUG(\"%p: txq updated with %p\", (void *)txq, (void *)&tmpl);\n \t/* Pre-register known mempools. */\n \trte_mempool_walk(txq_mp2mr_iter, txq);\n",
    "prefixes": [
        "dpdk-dev",
        "v2",
        "3/7"
    ]
}