get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 53899,
    "url": "http://patches.dpdk.org/api/patches/53899/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/1559211639-17442-2-git-send-email-matan@mellanox.com/",
    "project": {
        "id": 1,
        "url": "http://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": "<1559211639-17442-2-git-send-email-matan@mellanox.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/1559211639-17442-2-git-send-email-matan@mellanox.com",
    "date": "2019-05-30T10:20:31",
    "name": "[v1,1/9] net/mlx5: remove Rx queues indexes correlation",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": true,
    "hash": "db4c690ced4a2989b00ed23a48b96ad6eb72f33f",
    "submitter": {
        "id": 796,
        "url": "http://patches.dpdk.org/api/people/796/?format=api",
        "name": "Matan Azrad",
        "email": "matan@mellanox.com"
    },
    "delegate": {
        "id": 6624,
        "url": "http://patches.dpdk.org/api/users/6624/?format=api",
        "username": "shahafs",
        "first_name": "Shahaf",
        "last_name": "Shuler",
        "email": "shahafs@mellanox.com"
    },
    "mbox": "http://patches.dpdk.org/project/dpdk/patch/1559211639-17442-2-git-send-email-matan@mellanox.com/mbox/",
    "series": [
        {
            "id": 4823,
            "url": "http://patches.dpdk.org/api/series/4823/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=4823",
            "date": "2019-05-30T10:20:30",
            "name": "mlx5: Handle data-path completions with error",
            "version": 1,
            "mbox": "http://patches.dpdk.org/series/4823/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/53899/comments/",
    "check": "fail",
    "checks": "http://patches.dpdk.org/api/patches/53899/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 [127.0.0.1])\n\tby dpdk.org (Postfix) with ESMTP id 4DC6E1B9A2;\n\tThu, 30 May 2019 12:20:56 +0200 (CEST)",
            "from git-send-mailer.rdmz.labs.mlnx (unknown [37.142.13.130])\n\tby dpdk.org (Postfix) with ESMTP id E3BE11B951;\n\tThu, 30 May 2019 12:20:44 +0200 (CEST)"
        ],
        "From": "Matan Azrad <matan@mellanox.com>",
        "To": "Shahaf Shuler <shahafs@mellanox.com>, Yongseok Koh <yskoh@mellanox.com>",
        "Cc": "dev@dpdk.org,\n\tstable@dpdk.org",
        "Date": "Thu, 30 May 2019 10:20:31 +0000",
        "Message-Id": "<1559211639-17442-2-git-send-email-matan@mellanox.com>",
        "X-Mailer": "git-send-email 1.8.3.1",
        "In-Reply-To": "<1559211639-17442-1-git-send-email-matan@mellanox.com>",
        "References": "<1559211639-17442-1-git-send-email-matan@mellanox.com>",
        "Subject": "[dpdk-dev] [PATCH v1 1/9] net/mlx5: remove Rx queues indexes\n\tcorrelation",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.15",
        "Precedence": "list",
        "List-Id": "DPDK patches and discussions <dev.dpdk.org>",
        "List-Unsubscribe": "<https://mails.dpdk.org/options/dev>,\n\t<mailto:dev-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://mails.dpdk.org/archives/dev/>",
        "List-Post": "<mailto:dev@dpdk.org>",
        "List-Help": "<mailto:dev-request@dpdk.org?subject=help>",
        "List-Subscribe": "<https://mails.dpdk.org/listinfo/dev>,\n\t<mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org",
        "Sender": "\"dev\" <dev-bounces@dpdk.org>"
    },
    "content": "There is a full correlation between the CQE indexes to the WQE indexes\nin the vectorized Rx queues management.\n\nWhen the RQ is inserted to the reset state, the correlation may break\nbecause the HW starts the RQ polling from index 0 while the CQ polling\ncontinues regularly.\n\nAs an arrangement to CQE errors handling, when the RQ can be reset,\nthe correlation dependence should be removed from all the Rx queues\nindex managments.\n\nRemove the aformentioned dependence from the vectorized Rx burst\nfunctions.\n\nCc: stable@dpdk.org\n\nSigned-off-by: Matan Azrad <matan@mellanox.com>\n---\n drivers/net/mlx5/mlx5_rxq.c           |  1 +\n drivers/net/mlx5/mlx5_rxtx.h          |  6 +++++-\n drivers/net/mlx5/mlx5_rxtx_vec_neon.h | 26 +++++++++++++-------------\n drivers/net/mlx5/mlx5_rxtx_vec_sse.h  | 26 +++++++++++++-------------\n 4 files changed, 32 insertions(+), 27 deletions(-)",
    "diff": "diff --git a/drivers/net/mlx5/mlx5_rxq.c b/drivers/net/mlx5/mlx5_rxq.c\nindex a00cb12..b248f38 100644\n--- a/drivers/net/mlx5/mlx5_rxq.c\n+++ b/drivers/net/mlx5/mlx5_rxq.c\n@@ -1006,6 +1006,7 @@ struct mlx5_rxq_ibv *\n \trxq_data->cq_uar = cq_info.cq_uar;\n \trxq_data->cqn = cq_info.cqn;\n \trxq_data->cq_arm_sn = 0;\n+\trxq_data->decompressed = 0;\n \t/* Update doorbell counter. */\n \trxq_data->rq_ci = wqe_n >> rxq_data->sges_n;\n \trte_wmb();\ndiff --git a/drivers/net/mlx5/mlx5_rxtx.h b/drivers/net/mlx5/mlx5_rxtx.h\nindex 4339aaf..7bacdba 100644\n--- a/drivers/net/mlx5/mlx5_rxtx.h\n+++ b/drivers/net/mlx5/mlx5_rxtx.h\n@@ -101,11 +101,15 @@ struct mlx5_rxq_data {\n \tuint32_t rq_pi;\n \tuint32_t cq_ci;\n \tuint16_t rq_repl_thresh; /* Threshold for buffer replenishment. */\n+\tunion {\n+\t\tstruct rxq_zip zip; /* Compressed context. */\n+\t\tuint16_t decompressed;\n+\t\t/* Number of ready mbufs decompressed from the CQ. */\n+\t};\n \tstruct mlx5_mr_ctrl mr_ctrl; /* MR control descriptor. */\n \tuint16_t mprq_max_memcpy_len; /* Maximum size of packet to memcpy. */\n \tvolatile void *wqes;\n \tvolatile struct mlx5_cqe(*cqes)[];\n-\tstruct rxq_zip zip; /* Compressed context. */\n \tRTE_STD_C11\n \tunion  {\n \t\tstruct rte_mbuf *(*elts)[];\ndiff --git a/drivers/net/mlx5/mlx5_rxtx_vec_neon.h b/drivers/net/mlx5/mlx5_rxtx_vec_neon.h\nindex 38e915c..6a1b2bb 100644\n--- a/drivers/net/mlx5/mlx5_rxtx_vec_neon.h\n+++ b/drivers/net/mlx5/mlx5_rxtx_vec_neon.h\n@@ -352,8 +352,11 @@\n  * @param elts\n  *   Pointer to SW ring to be filled. The first mbuf has to be pre-built from\n  *   the title completion descriptor to be copied to the rest of mbufs.\n+ *\n+ * @return\n+ *   Number of mini-CQEs successfully decompressed.\n  */\n-static inline void\n+static inline uint16_t\n rxq_cq_decompress_v(struct mlx5_rxq_data *rxq, volatile struct mlx5_cqe *cq,\n \t\t    struct rte_mbuf **elts)\n {\n@@ -505,6 +508,7 @@\n \trxq->stats.ibytes += rcvd_byte;\n #endif\n \trxq->cq_ci += mcqe_n;\n+\treturn mcqe_n;\n }\n \n /**\n@@ -729,24 +733,17 @@\n \trte_prefetch_non_temporal(cq + 2);\n \trte_prefetch_non_temporal(cq + 3);\n \tpkts_n = RTE_MIN(pkts_n, MLX5_VPMD_RX_MAX_BURST);\n-\t/*\n-\t * Order of indexes:\n-\t *   rq_ci >= cq_ci >= rq_pi\n-\t * Definition of indexes:\n-\t *   rq_ci - cq_ci := # of buffers owned by HW (posted).\n-\t *   cq_ci - rq_pi := # of buffers not returned to app (decompressed).\n-\t *   N - (rq_ci - rq_pi) := # of buffers consumed (to be replenished).\n-\t */\n \trepl_n = q_n - (rxq->rq_ci - rxq->rq_pi);\n \tif (repl_n >= rxq->rq_repl_thresh)\n \t\tmlx5_rx_replenish_bulk_mbuf(rxq, repl_n);\n \t/* See if there're unreturned mbufs from compressed CQE. */\n-\trcvd_pkt = rxq->cq_ci - rxq->rq_pi;\n+\trcvd_pkt = rxq->decompressed;\n \tif (rcvd_pkt > 0) {\n \t\trcvd_pkt = RTE_MIN(rcvd_pkt, pkts_n);\n \t\trxq_copy_mbuf_v(rxq, pkts, rcvd_pkt);\n \t\trxq->rq_pi += rcvd_pkt;\n \t\tpkts += rcvd_pkt;\n+\t\trxq->decompressed -= rcvd_pkt;\n \t}\n \telts_idx = rxq->rq_pi & q_mask;\n \telts = &(*rxq->elts)[elts_idx];\n@@ -754,10 +751,11 @@\n \tpkts_n = RTE_ALIGN_FLOOR(pkts_n - rcvd_pkt, MLX5_VPMD_DESCS_PER_LOOP);\n \t/* Not to cross queue end. */\n \tpkts_n = RTE_MIN(pkts_n, q_n - elts_idx);\n+\tpkts_n = RTE_MIN(pkts_n, q_n - cq_idx);\n \tif (!pkts_n)\n \t\treturn rcvd_pkt;\n \t/* At this point, there shouldn't be any remained packets. */\n-\tassert(rxq->rq_pi == rxq->cq_ci);\n+\tassert(rxq->decompressed == 0);\n \t/*\n \t * Note that vectors have reverse order - {v3, v2, v1, v0}, because\n \t * there's no instruction to count trailing zeros. __builtin_clzl() is\n@@ -1003,15 +1001,17 @@\n \t/* Decompress the last CQE if compressed. */\n \tif (comp_idx < MLX5_VPMD_DESCS_PER_LOOP && comp_idx == n) {\n \t\tassert(comp_idx == (nocmp_n % MLX5_VPMD_DESCS_PER_LOOP));\n-\t\trxq_cq_decompress_v(rxq, &cq[nocmp_n], &elts[nocmp_n]);\n+\t\trxq->decompressed = rxq_cq_decompress_v(rxq, &cq[nocmp_n],\n+\t\t\t\t\t\t\t&elts[nocmp_n]);\n \t\t/* Return more packets if needed. */\n \t\tif (nocmp_n < pkts_n) {\n-\t\t\tuint16_t n = rxq->cq_ci - rxq->rq_pi;\n+\t\t\tuint16_t n = rxq->decompressed;\n \n \t\t\tn = RTE_MIN(n, pkts_n - nocmp_n);\n \t\t\trxq_copy_mbuf_v(rxq, &pkts[nocmp_n], n);\n \t\t\trxq->rq_pi += n;\n \t\t\trcvd_pkt += n;\n+\t\t\trxq->decompressed -= n;\n \t\t}\n \t}\n \trte_compiler_barrier();\ndiff --git a/drivers/net/mlx5/mlx5_rxtx_vec_sse.h b/drivers/net/mlx5/mlx5_rxtx_vec_sse.h\nindex fb384ef..cc2f251 100644\n--- a/drivers/net/mlx5/mlx5_rxtx_vec_sse.h\n+++ b/drivers/net/mlx5/mlx5_rxtx_vec_sse.h\n@@ -349,8 +349,11 @@\n  * @param elts\n  *   Pointer to SW ring to be filled. The first mbuf has to be pre-built from\n  *   the title completion descriptor to be copied to the rest of mbufs.\n+ *\n+ * @return\n+ *   Number of mini-CQEs successfully decompressed.\n  */\n-static inline void\n+static inline uint16_t\n rxq_cq_decompress_v(struct mlx5_rxq_data *rxq, volatile struct mlx5_cqe *cq,\n \t\t    struct rte_mbuf **elts)\n {\n@@ -486,6 +489,7 @@\n \trxq->stats.ibytes += rcvd_byte;\n #endif\n \trxq->cq_ci += mcqe_n;\n+\treturn mcqe_n;\n }\n \n /**\n@@ -712,23 +716,16 @@\n \trte_prefetch0(cq + 2);\n \trte_prefetch0(cq + 3);\n \tpkts_n = RTE_MIN(pkts_n, MLX5_VPMD_RX_MAX_BURST);\n-\t/*\n-\t * Order of indexes:\n-\t *   rq_ci >= cq_ci >= rq_pi\n-\t * Definition of indexes:\n-\t *   rq_ci - cq_ci := # of buffers owned by HW (posted).\n-\t *   cq_ci - rq_pi := # of buffers not returned to app (decompressed).\n-\t *   N - (rq_ci - rq_pi) := # of buffers consumed (to be replenished).\n-\t */\n \trepl_n = q_n - (rxq->rq_ci - rxq->rq_pi);\n \tif (repl_n >= rxq->rq_repl_thresh)\n \t\tmlx5_rx_replenish_bulk_mbuf(rxq, repl_n);\n \t/* See if there're unreturned mbufs from compressed CQE. */\n-\trcvd_pkt = rxq->cq_ci - rxq->rq_pi;\n+\trcvd_pkt = rxq->decompressed;\n \tif (rcvd_pkt > 0) {\n \t\trcvd_pkt = RTE_MIN(rcvd_pkt, pkts_n);\n \t\trxq_copy_mbuf_v(rxq, pkts, rcvd_pkt);\n \t\trxq->rq_pi += rcvd_pkt;\n+\t\trxq->decompressed -= rcvd_pkt;\n \t\tpkts += rcvd_pkt;\n \t}\n \telts_idx = rxq->rq_pi & q_mask;\n@@ -737,10 +734,11 @@\n \tpkts_n = RTE_ALIGN_FLOOR(pkts_n - rcvd_pkt, MLX5_VPMD_DESCS_PER_LOOP);\n \t/* Not to cross queue end. */\n \tpkts_n = RTE_MIN(pkts_n, q_n - elts_idx);\n+\tpkts_n = RTE_MIN(pkts_n, q_n - cq_idx);\n \tif (!pkts_n)\n \t\treturn rcvd_pkt;\n \t/* At this point, there shouldn't be any remained packets. */\n-\tassert(rxq->rq_pi == rxq->cq_ci);\n+\tassert(rxq->decompressed == 0);\n \t/*\n \t * A. load first Qword (8bytes) in one loop.\n \t * B. copy 4 mbuf pointers from elts ring to returing pkts.\n@@ -953,15 +951,17 @@\n \t/* Decompress the last CQE if compressed. */\n \tif (comp_idx < MLX5_VPMD_DESCS_PER_LOOP && comp_idx == n) {\n \t\tassert(comp_idx == (nocmp_n % MLX5_VPMD_DESCS_PER_LOOP));\n-\t\trxq_cq_decompress_v(rxq, &cq[nocmp_n], &elts[nocmp_n]);\n+\t\trxq->decompressed = rxq_cq_decompress_v(rxq, &cq[nocmp_n],\n+\t\t\t\t\t\t\t&elts[nocmp_n]);\n \t\t/* Return more packets if needed. */\n \t\tif (nocmp_n < pkts_n) {\n-\t\t\tuint16_t n = rxq->cq_ci - rxq->rq_pi;\n+\t\t\tuint16_t n = rxq->decompressed;\n \n \t\t\tn = RTE_MIN(n, pkts_n - nocmp_n);\n \t\t\trxq_copy_mbuf_v(rxq, &pkts[nocmp_n], n);\n \t\t\trxq->rq_pi += n;\n \t\t\trcvd_pkt += n;\n+\t\t\trxq->decompressed -= n;\n \t\t}\n \t}\n \trte_compiler_barrier();\n",
    "prefixes": [
        "v1",
        "1/9"
    ]
}