get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 53901,
    "url": "http://patches.dpdk.org/api/patches/53901/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/1559211639-17442-9-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-9-git-send-email-matan@mellanox.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/1559211639-17442-9-git-send-email-matan@mellanox.com",
    "date": "2019-05-30T10:20:38",
    "name": "[v1,8/9] net/mlx5: recover secondary process Rx errors",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": true,
    "hash": "c982e38227dac9cbdee218d9b0eebd2fb94d0abf",
    "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-9-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/53901/comments/",
    "check": "fail",
    "checks": "http://patches.dpdk.org/api/patches/53901/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 7CD991B9B7;\n\tThu, 30 May 2019 12:21:00 +0200 (CEST)",
            "from git-send-mailer.rdmz.labs.mlnx (unknown [37.142.13.130])\n\tby dpdk.org (Postfix) with ESMTP id 4B3DB1B958;\n\tThu, 30 May 2019 12:20:45 +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:38 +0000",
        "Message-Id": "<1559211639-17442-9-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 8/9] net/mlx5: recover secondary process Rx\n\terrors",
        "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": "The RQ errors recovery mechanism in the PMD invokes a Verbs functions to\nmodify the RQ states in order to reset the RQ and to reactivate it.\n\nThese Verbs functions are not allowed to be invoked from a secondary\nprocess, hence the PMD skips the recovery when the error is captured by\nsecondary processes queues.\n\nUsing the DPDK IPC mechanism the secondary process can request Verbs\nqueues state modifications to be done synchronically by the primary\nprocess.\n\nAdd support for secondary process Rx errors recovery.\n\nCc: stable@dpdk.org\n\nSigned-off-by: Matan Azrad <matan@mellanox.com>\n---\n drivers/net/mlx5/mlx5.h         | 11 +++++\n drivers/net/mlx5/mlx5_mp.c      | 46 +++++++++++++++++++\n drivers/net/mlx5/mlx5_rxtx.c    | 98 +++++++++++++++++++++++++++++++++--------\n drivers/net/mlx5/mlx5_rxtx.h    |  3 ++\n drivers/net/mlx5/mlx5_trigger.c |  1 +\n 5 files changed, 141 insertions(+), 18 deletions(-)",
    "diff": "diff --git a/drivers/net/mlx5/mlx5.h b/drivers/net/mlx5/mlx5.h\nindex 4c339d0..85a6d02 100644\n--- a/drivers/net/mlx5/mlx5.h\n+++ b/drivers/net/mlx5/mlx5.h\n@@ -61,6 +61,13 @@ enum mlx5_mp_req_type {\n \tMLX5_MP_REQ_CREATE_MR,\n \tMLX5_MP_REQ_START_RXTX,\n \tMLX5_MP_REQ_STOP_RXTX,\n+\tMLX5_MP_REQ_QUEUE_STATE_MODIFY,\n+};\n+\n+struct mlx5_mp_arg_queue_state_modify {\n+\tuint8_t is_wq; /* Set if WQ. */\n+\tuint16_t queue_id; /* DPDK queue ID. */\n+\tenum ibv_wq_state state; /* WQ requested state. */\n };\n \n /* Pameters for IPC. */\n@@ -71,6 +78,8 @@ struct mlx5_mp_param {\n \tRTE_STD_C11\n \tunion {\n \t\tuintptr_t addr; /* MLX5_MP_REQ_CREATE_MR */\n+\t\tstruct mlx5_mp_arg_queue_state_modify state_modify;\n+\t\t/* MLX5_MP_REQ_QUEUE_STATE_MODIFY */\n \t} args;\n };\n \n@@ -542,6 +551,8 @@ int mlx5_ctrl_flow(struct rte_eth_dev *dev,\n void mlx5_mp_req_stop_rxtx(struct rte_eth_dev *dev);\n int mlx5_mp_req_mr_create(struct rte_eth_dev *dev, uintptr_t addr);\n int mlx5_mp_req_verbs_cmd_fd(struct rte_eth_dev *dev);\n+int mlx5_mp_req_queue_state_modify(struct rte_eth_dev *dev,\n+\t\t\t\t   struct mlx5_mp_arg_queue_state_modify *sm);\n void mlx5_mp_init_primary(void);\n void mlx5_mp_uninit_primary(void);\n void mlx5_mp_init_secondary(void);\ndiff --git a/drivers/net/mlx5/mlx5_mp.c b/drivers/net/mlx5/mlx5_mp.c\nindex cea74ad..3ccae51 100644\n--- a/drivers/net/mlx5/mlx5_mp.c\n+++ b/drivers/net/mlx5/mlx5_mp.c\n@@ -85,6 +85,12 @@\n \t\tres->result = 0;\n \t\tret = rte_mp_reply(&mp_res, peer);\n \t\tbreak;\n+\tcase MLX5_MP_REQ_QUEUE_STATE_MODIFY:\n+\t\tmp_init_msg(dev, &mp_res, param->type);\n+\t\tres->result = mlx5_queue_state_modify_primary\n+\t\t\t\t\t(dev, &param->args.state_modify);\n+\t\tret = rte_mp_reply(&mp_res, peer);\n+\t\tbreak;\n \tdefault:\n \t\trte_errno = EINVAL;\n \t\tDRV_LOG(ERR, \"port %u invalid mp request type\",\n@@ -271,6 +277,46 @@\n }\n \n /**\n+ * Request Verbs queue state modification to the primary process.\n+ *\n+ * @param[in] dev\n+ *   Pointer to Ethernet structure.\n+ * @param sm\n+ *   State modify parameters.\n+ *\n+ * @return\n+ *   0 on success, a negative errno value otherwise and rte_errno is set.\n+ */\n+int\n+mlx5_mp_req_queue_state_modify(struct rte_eth_dev *dev,\n+\t\t\t       struct mlx5_mp_arg_queue_state_modify *sm)\n+{\n+\tstruct rte_mp_msg mp_req;\n+\tstruct rte_mp_msg *mp_res;\n+\tstruct rte_mp_reply mp_rep;\n+\tstruct mlx5_mp_param *req = (struct mlx5_mp_param *)mp_req.param;\n+\tstruct mlx5_mp_param *res;\n+\tstruct timespec ts = {.tv_sec = MLX5_MP_REQ_TIMEOUT_SEC, .tv_nsec = 0};\n+\tint ret;\n+\n+\tassert(rte_eal_process_type() == RTE_PROC_SECONDARY);\n+\tmp_init_msg(dev, &mp_req, MLX5_MP_REQ_QUEUE_STATE_MODIFY);\n+\treq->args.state_modify = *sm;\n+\tret = rte_mp_request_sync(&mp_req, &mp_rep, &ts);\n+\tif (ret) {\n+\t\tDRV_LOG(ERR, \"port %u request to primary process failed\",\n+\t\t\tdev->data->port_id);\n+\t\treturn -rte_errno;\n+\t}\n+\tassert(mp_rep.nb_received == 1);\n+\tmp_res = &mp_rep.msgs[0];\n+\tres = (struct mlx5_mp_param *)mp_res->param;\n+\tret = res->result;\n+\tfree(mp_rep.msgs);\n+\treturn ret;\n+}\n+\n+/**\n  * Request Verbs command file descriptor for mmap to the primary process.\n  *\n  * @param[in] dev\ndiff --git a/drivers/net/mlx5/mlx5_rxtx.c b/drivers/net/mlx5/mlx5_rxtx.c\nindex 36e2dd3..cb3baad 100644\n--- a/drivers/net/mlx5/mlx5_rxtx.c\n+++ b/drivers/net/mlx5/mlx5_rxtx.c\n@@ -2031,6 +2031,75 @@\n }\n \n /**\n+ * Modify a Verbs queue state.\n+ * This must be called from the primary process.\n+ *\n+ * @param dev\n+ *   Pointer to Ethernet device.\n+ * @param sm\n+ *   State modify request parameters.\n+ *\n+ * @return\n+ *   0 in case of success else non-zero value and rte_errno is set.\n+ */\n+int\n+mlx5_queue_state_modify_primary(struct rte_eth_dev *dev,\n+\t\t\tconst struct mlx5_mp_arg_queue_state_modify *sm)\n+{\n+\tint ret;\n+\tstruct mlx5_priv *priv = dev->data->dev_private;\n+\n+\tif (sm->is_wq) {\n+\t\tstruct ibv_wq_attr mod = {\n+\t\t\t.attr_mask = IBV_WQ_ATTR_STATE,\n+\t\t\t.wq_state = sm->state,\n+\t\t};\n+\t\tstruct mlx5_rxq_data *rxq = (*priv->rxqs)[sm->queue_id];\n+\t\tstruct mlx5_rxq_ctrl *rxq_ctrl =\n+\t\t\tcontainer_of(rxq, struct mlx5_rxq_ctrl, rxq);\n+\n+\t\tret = mlx5_glue->modify_wq(rxq_ctrl->ibv->wq, &mod);\n+\t\tif (ret) {\n+\t\t\tDRV_LOG(ERR, \"Cannot change Rx WQ state to %u  - %s\\n\",\n+\t\t\t\t\tsm->state, strerror(errno));\n+\t\t\trte_errno = errno;\n+\t\t\treturn ret;\n+\t\t}\n+\t}\n+\treturn 0;\n+}\n+\n+/**\n+ * Modify a Verbs queue state.\n+ *\n+ * @param dev\n+ *   Pointer to Ethernet device.\n+ * @param sm\n+ *   State modify request parameters.\n+ *\n+ * @return\n+ *   0 in case of success else non-zero value.\n+ */\n+static int\n+mlx5_queue_state_modify(struct rte_eth_dev *dev,\n+\t\t\tstruct mlx5_mp_arg_queue_state_modify *sm)\n+{\n+\tint ret = 0;\n+\n+\tswitch (rte_eal_process_type()) {\n+\tcase RTE_PROC_PRIMARY:\n+\t\tret = mlx5_queue_state_modify_primary(dev, sm);\n+\t\tbreak;\n+\tcase RTE_PROC_SECONDARY:\n+\t\tret = mlx5_mp_req_queue_state_modify(dev, sm);\n+\t\tbreak;\n+\tdefault:\n+\t\tbreak;\n+\t}\n+\treturn ret;\n+}\n+\n+/**\n  * Handle a Rx error.\n  * The function inserts the RQ state to reset when the first error CQE is\n  * shown, then drains the CQ by the caller function loop. When the CQ is empty,\n@@ -2053,15 +2122,13 @@\n \tconst unsigned int wqe_n = 1 << rxq->elts_n;\n \tstruct mlx5_rxq_ctrl *rxq_ctrl =\n \t\t\tcontainer_of(rxq, struct mlx5_rxq_ctrl, rxq);\n-\tstruct ibv_wq_attr mod = {\n-\t\t.attr_mask = IBV_WQ_ATTR_STATE,\n-\t};\n \tunion {\n \t\tvolatile struct mlx5_cqe *cqe;\n \t\tvolatile struct mlx5_err_cqe *err_cqe;\n \t} u = {\n \t\t.cqe = &(*rxq->cqes)[rxq->cq_ci & cqe_mask],\n \t};\n+\tstruct mlx5_mp_arg_queue_state_modify sm;\n \tint ret;\n \n \tswitch (rxq->err_state) {\n@@ -2069,21 +2136,17 @@\n \t\trxq->err_state = MLX5_RXQ_ERR_STATE_NEED_RESET;\n \t\t/* Fall-through */\n \tcase MLX5_RXQ_ERR_STATE_NEED_RESET:\n-\t\tif (rte_eal_process_type() != RTE_PROC_PRIMARY)\n+\t\tsm.is_wq = 1;\n+\t\tsm.queue_id = rxq->idx;\n+\t\tsm.state = IBV_WQS_RESET;\n+\t\tif (mlx5_queue_state_modify(ETH_DEV(rxq_ctrl->priv), &sm))\n \t\t\treturn -1;\n-\t\tmod.wq_state = IBV_WQS_RESET;\n-\t\tret = mlx5_glue->modify_wq(rxq_ctrl->ibv->wq, &mod);\n-\t\tif (ret) {\n-\t\t\tDRV_LOG(ERR, \"Cannot change Rx WQ state to RESET %s\\n\",\n-\t\t\t\tstrerror(errno));\n-\t\t\treturn -1;\n-\t\t}\n \t\tif (rxq_ctrl->dump_file_n <\n \t\t    rxq_ctrl->priv->config.max_dump_files_num) {\n \t\t\tMKSTR(err_str, \"Unexpected CQE error syndrome \"\n \t\t\t      \"0x%02x CQN = %u RQN = %u wqe_counter = %u\"\n \t\t\t      \" rq_ci = %u cq_ci = %u\", u.err_cqe->syndrome,\n-\t\t\t      rxq->cqn, rxq_ctrl->ibv->wq->wq_num,\n+\t\t\t      rxq->cqn, rxq_ctrl->wqn,\n \t\t\t      rte_be_to_cpu_16(u.err_cqe->wqe_counter),\n \t\t\t      rxq->rq_ci << rxq->sges_n, rxq->cq_ci);\n \t\t\tMKSTR(name, \"dpdk_mlx5_port_%u_rxq_%u_%u\",\n@@ -2113,13 +2176,12 @@\n \t\t\t */\n \t\t\t*rxq->rq_db = rte_cpu_to_be_32(0);\n \t\t\trte_cio_wmb();\n-\t\t\tmod.wq_state = IBV_WQS_RDY;\n-\t\t\tret = mlx5_glue->modify_wq(rxq_ctrl->ibv->wq, &mod);\n-\t\t\tif (ret) {\n-\t\t\t\tDRV_LOG(ERR, \"Cannot change Rx WQ state to RDY\"\n-\t\t\t\t\t\" %s\\n\", strerror(errno));\n+\t\t\tsm.is_wq = 1;\n+\t\t\tsm.queue_id = rxq->idx;\n+\t\t\tsm.state = IBV_WQS_RDY;\n+\t\t\tif (mlx5_queue_state_modify(ETH_DEV(rxq_ctrl->priv),\n+\t\t\t\t\t\t    &sm))\n \t\t\t\treturn -1;\n-\t\t\t}\n \t\t\tif (mbuf_prepare) {\n \t\t\t\tconst uint16_t q_mask = wqe_n - 1;\n \t\t\t\tuint16_t elt_idx;\ndiff --git a/drivers/net/mlx5/mlx5_rxtx.h b/drivers/net/mlx5/mlx5_rxtx.h\nindex f4538eb..92fba29 100644\n--- a/drivers/net/mlx5/mlx5_rxtx.h\n+++ b/drivers/net/mlx5/mlx5_rxtx.h\n@@ -161,6 +161,7 @@ struct mlx5_rxq_ctrl {\n \tunsigned int irq:1; /* Whether IRQ is enabled. */\n \tuint32_t flow_mark_n; /* Number of Mark/Flag flows using this Queue. */\n \tuint32_t flow_tunnels_n[MLX5_FLOW_TUNNEL]; /* Tunnels counters. */\n+\tuint32_t wqn; /* WQ number. */\n \tuint16_t dump_file_n; /* Number of dump files. */\n };\n \n@@ -374,6 +375,8 @@ uint16_t removed_rx_burst(void *dpdk_rxq, struct rte_mbuf **pkts,\n uint32_t mlx5_rx_queue_count(struct rte_eth_dev *dev, uint16_t rx_queue_id);\n void mlx5_dump_debug_information(const char *path, const char *title,\n \t\t\t\t const void *buf, unsigned int len);\n+int mlx5_queue_state_modify_primary(struct rte_eth_dev *dev,\n+\t\t\tconst struct mlx5_mp_arg_queue_state_modify *sm);\n \n /* Vectorized version of mlx5_rxtx.c */\n int mlx5_check_raw_vec_tx_support(struct rte_eth_dev *dev);\ndiff --git a/drivers/net/mlx5/mlx5_trigger.c b/drivers/net/mlx5/mlx5_trigger.c\nindex b7fde35..b6af539 100644\n--- a/drivers/net/mlx5/mlx5_trigger.c\n+++ b/drivers/net/mlx5/mlx5_trigger.c\n@@ -126,6 +126,7 @@\n \t\trxq_ctrl->ibv = mlx5_rxq_ibv_new(dev, i);\n \t\tif (!rxq_ctrl->ibv)\n \t\t\tgoto error;\n+\t\trxq_ctrl->wqn = rxq_ctrl->ibv->wq->wq_num;\n \t}\n \treturn 0;\n error:\n",
    "prefixes": [
        "v1",
        "8/9"
    ]
}