get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 132489,
    "url": "http://patchwork.dpdk.org/api/patches/132489/?format=api",
    "web_url": "http://patchwork.dpdk.org/project/dpdk/patch/20231011015054.524907-3-vattunuru@marvell.com/",
    "project": {
        "id": 1,
        "url": "http://patchwork.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": "<20231011015054.524907-3-vattunuru@marvell.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20231011015054.524907-3-vattunuru@marvell.com",
    "date": "2023-10-11T01:50:53",
    "name": "[2/3] net/octeon_ep: clean up receive routine",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "ed8a349b17f6a61177af3d9f7d48b4844e1cbd6c",
    "submitter": {
        "id": 1277,
        "url": "http://patchwork.dpdk.org/api/people/1277/?format=api",
        "name": "Vamsi Krishna Attunuru",
        "email": "vattunuru@marvell.com"
    },
    "delegate": {
        "id": 310,
        "url": "http://patchwork.dpdk.org/api/users/310/?format=api",
        "username": "jerin",
        "first_name": "Jerin",
        "last_name": "Jacob",
        "email": "jerinj@marvell.com"
    },
    "mbox": "http://patchwork.dpdk.org/project/dpdk/patch/20231011015054.524907-3-vattunuru@marvell.com/mbox/",
    "series": [
        {
            "id": 29803,
            "url": "http://patchwork.dpdk.org/api/series/29803/?format=api",
            "web_url": "http://patchwork.dpdk.org/project/dpdk/list/?series=29803",
            "date": "2023-10-11T01:50:51",
            "name": "rewrite fastpath routines",
            "version": 1,
            "mbox": "http://patchwork.dpdk.org/series/29803/mbox/"
        }
    ],
    "comments": "http://patchwork.dpdk.org/api/patches/132489/comments/",
    "check": "warning",
    "checks": "http://patchwork.dpdk.org/api/patches/132489/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dev-bounces@dpdk.org>",
        "X-Original-To": "patchwork@inbox.dpdk.org",
        "Delivered-To": "patchwork@inbox.dpdk.org",
        "Received": [
            "from mails.dpdk.org (mails.dpdk.org [217.70.189.124])\n\tby inbox.dpdk.org (Postfix) with ESMTP id 38E7042358;\n\tWed, 11 Oct 2023 03:51:27 +0200 (CEST)",
            "from mails.dpdk.org (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id C411C40608;\n\tWed, 11 Oct 2023 03:51:15 +0200 (CEST)",
            "from mx0b-0016f401.pphosted.com (mx0b-0016f401.pphosted.com\n [67.231.156.173])\n by mails.dpdk.org (Postfix) with ESMTP id DD259402E9\n for <dev@dpdk.org>; Wed, 11 Oct 2023 03:51:13 +0200 (CEST)",
            "from pps.filterd (m0045851.ppops.net [127.0.0.1])\n by mx0b-0016f401.pphosted.com (8.17.1.19/8.17.1.19) with ESMTP id\n 39AI2nME013017 for <dev@dpdk.org>; Tue, 10 Oct 2023 18:51:13 -0700",
            "from dc5-exch01.marvell.com ([199.233.59.181])\n by mx0b-0016f401.pphosted.com (PPS) with ESMTPS id 3tkh7ck8fh-1\n (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT)\n for <dev@dpdk.org>; Tue, 10 Oct 2023 18:51:13 -0700",
            "from DC5-EXCH01.marvell.com (10.69.176.38) by DC5-EXCH01.marvell.com\n (10.69.176.38) with Microsoft SMTP Server (TLS) id 15.0.1497.48;\n Tue, 10 Oct 2023 18:51:11 -0700",
            "from maili.marvell.com (10.69.176.80) by DC5-EXCH01.marvell.com\n (10.69.176.38) with Microsoft SMTP Server id 15.0.1497.48 via Frontend\n Transport; Tue, 10 Oct 2023 18:51:11 -0700",
            "from localhost.localdomain (unknown [10.28.36.156])\n by maili.marvell.com (Postfix) with ESMTP id 478A95B693C;\n Tue, 10 Oct 2023 18:51:09 -0700 (PDT)"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=marvell.com;\n h=from : to : cc :\n subject : date : message-id : in-reply-to : references : mime-version :\n content-transfer-encoding : content-type; s=pfpt0220;\n bh=1eka5HDTKeci+4y4b4oDvRTMskEHXGlElzJgKXvP3oc=;\n b=COwrdyU90DufC4XtaDO+qy6/O2JhEeDw0hpuyvZ2Wku74y36oCS8HH2AMDearHy9cBh5\n rZ26Mj4VtxWrVG4iL/3oWiJcFgw8rc0vn+D4oj7vRFDvcs3c4+RPZOjtbiuVHQXbUfrC\n shB+jJzch6t569GQVLZTgwpX1yWu/LdeYfOYzanv4vwDoRoUfc+R6QVnR82x+QZzXh+b\n y13NVMdBVQPVwfh8RAWR7zhY2k9ZkTshV55ixq21e8rCRI2jvYsS6X8X8ZVeNwuDYa20\n koUsOgbIDMTIJUDfjyREERD6d7fw+E3+k5ChG9eHm72ax9qugZ+ZiUTsxO8zvgZ23koR cw==",
        "From": "Vamsi Attunuru <vattunuru@marvell.com>",
        "To": "<dev@dpdk.org>, <jerinj@marvell.com>",
        "CC": "<sthotton@marvell.com>, Vamsi Attunuru <vattunuru@marvell.com>",
        "Subject": "[PATCH 2/3] net/octeon_ep: clean up receive routine",
        "Date": "Tue, 10 Oct 2023 18:50:53 -0700",
        "Message-ID": "<20231011015054.524907-3-vattunuru@marvell.com>",
        "X-Mailer": "git-send-email 2.25.1",
        "In-Reply-To": "<20231011015054.524907-1-vattunuru@marvell.com>",
        "References": "<20231011015054.524907-1-vattunuru@marvell.com>",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "Content-Type": "text/plain",
        "X-Proofpoint-GUID": "-TFmwjJDLcVoPcLmCHn9oorlG9ikKUAY",
        "X-Proofpoint-ORIG-GUID": "-TFmwjJDLcVoPcLmCHn9oorlG9ikKUAY",
        "X-Proofpoint-Virus-Version": "vendor=baseguard\n engine=ICAP:2.0.267,Aquarius:18.0.980,Hydra:6.0.619,FMLib:17.11.176.26\n definitions=2023-10-10_19,2023-10-10_01,2023-05-22_02",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.29",
        "Precedence": "list",
        "List-Id": "DPDK patches and discussions <dev.dpdk.org>",
        "List-Unsubscribe": "<https://mails.dpdk.org/options/dev>,\n <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 <mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org"
    },
    "content": "Patch improves Rx routine and pkt count update routines,\npacket count update routines need to drain inflight ISM\nmemory updates while decrementing the packet count register.\n\nSigned-off-by: Vamsi Attunuru <vattunuru@marvell.com>\n---\n drivers/net/octeon_ep/otx_ep_rxtx.c | 162 ++++++++++++----------------\n 1 file changed, 68 insertions(+), 94 deletions(-)",
    "diff": "diff --git a/drivers/net/octeon_ep/otx_ep_rxtx.c b/drivers/net/octeon_ep/otx_ep_rxtx.c\nindex 5b759d759b..ea7c9a5d62 100644\n--- a/drivers/net/octeon_ep/otx_ep_rxtx.c\n+++ b/drivers/net/octeon_ep/otx_ep_rxtx.c\n@@ -442,7 +442,14 @@ otx_vf_update_read_index(struct otx_ep_instr_queue *iq)\n \t\t * when count above halfway to saturation.\n \t\t */\n \t\trte_write32(val, iq->inst_cnt_reg);\n-\t\t*iq->inst_cnt_ism = 0;\n+\t\trte_mb();\n+\n+\t\trte_write64(OTX2_SDP_REQUEST_ISM, iq->inst_cnt_reg);\n+\t\twhile (__atomic_load_n(iq->inst_cnt_ism, __ATOMIC_RELAXED) >= val) {\n+\t\t\trte_write64(OTX2_SDP_REQUEST_ISM, iq->inst_cnt_reg);\n+\t\t\trte_mb();\n+\t\t}\n+\n \t\tiq->inst_cnt_ism_prev = 0;\n \t}\n \trte_write64(OTX2_SDP_REQUEST_ISM, iq->inst_cnt_reg);\n@@ -565,9 +572,7 @@ prepare_xmit_gather_list(struct otx_ep_instr_queue *iq, struct rte_mbuf *m, uint\n \n \tfinfo = &iq->req_list[iq->host_write_index].finfo;\n \t*dptr = rte_mem_virt2iova(finfo->g.sg);\n-\tih->s.tlen = pkt_len + ih->s.fsz;\n-\tih->s.gsz = frags;\n-\tih->s.gather = 1;\n+\tih->u64 |= ((1ULL << 62) | ((uint64_t)frags << 48) | (pkt_len + ih->s.fsz));\n \n \twhile (frags--) {\n \t\tfinfo->g.sg[(j >> 2)].ptr[(j & mask)] = rte_mbuf_data_iova(m);\n@@ -750,36 +755,26 @@ otx2_ep_xmit_pkts(void *tx_queue, struct rte_mbuf **pkts, uint16_t nb_pkts)\n static uint32_t\n otx_ep_droq_refill(struct otx_ep_droq *droq)\n {\n-\tstruct otx_ep_droq_desc *desc_ring;\n+\tstruct otx_ep_droq_desc *desc_ring = droq->desc_ring;\n \tstruct otx_ep_droq_info *info;\n \tstruct rte_mbuf *buf = NULL;\n \tuint32_t desc_refilled = 0;\n \n-\tdesc_ring = droq->desc_ring;\n-\n \twhile (droq->refill_count && (desc_refilled < droq->nb_desc)) {\n-\t\t/* If a valid buffer exists (happens if there is no dispatch),\n-\t\t * reuse the buffer, else allocate.\n-\t\t */\n-\t\tif (droq->recv_buf_list[droq->refill_idx] != NULL)\n-\t\t\tbreak;\n-\n \t\tbuf = rte_pktmbuf_alloc(droq->mpool);\n \t\t/* If a buffer could not be allocated, no point in\n \t\t * continuing\n \t\t */\n-\t\tif (buf == NULL) {\n+\t\tif (unlikely(!buf)) {\n \t\t\tdroq->stats.rx_alloc_failure++;\n \t\t\tbreak;\n \t\t}\n \t\tinfo = rte_pktmbuf_mtod(buf, struct otx_ep_droq_info *);\n-\t\tmemset(info, 0, sizeof(*info));\n+\t\tinfo->length = 0;\n \n \t\tdroq->recv_buf_list[droq->refill_idx] = buf;\n \t\tdesc_ring[droq->refill_idx].buffer_ptr =\n \t\t\t\t\trte_mbuf_data_iova_default(buf);\n-\n-\n \t\tdroq->refill_idx = otx_ep_incr_index(droq->refill_idx, 1,\n \t\t\t\tdroq->nb_desc);\n \n@@ -791,21 +786,18 @@ otx_ep_droq_refill(struct otx_ep_droq *droq)\n }\n \n static struct rte_mbuf *\n-otx_ep_droq_read_packet(struct otx_ep_device *otx_ep,\n-\t\t\tstruct otx_ep_droq *droq, int next_fetch)\n+otx_ep_droq_read_packet(struct otx_ep_device *otx_ep, struct otx_ep_droq *droq, int next_fetch)\n {\n \tvolatile struct otx_ep_droq_info *info;\n-\tstruct rte_mbuf *droq_pkt2 = NULL;\n-\tstruct rte_mbuf *droq_pkt = NULL;\n-\tstruct rte_net_hdr_lens hdr_lens;\n-\tstruct otx_ep_droq_info *info2;\n+\tstruct rte_mbuf *mbuf_next = NULL;\n+\tstruct rte_mbuf *mbuf = NULL;\n \tuint64_t total_pkt_len;\n \tuint32_t pkt_len = 0;\n \tint next_idx;\n \n-\tdroq_pkt  = droq->recv_buf_list[droq->read_idx];\n-\tdroq_pkt2  = droq->recv_buf_list[droq->read_idx];\n-\tinfo = rte_pktmbuf_mtod(droq_pkt, struct otx_ep_droq_info *);\n+\tmbuf = droq->recv_buf_list[droq->read_idx];\n+\tinfo = rte_pktmbuf_mtod(mbuf, struct otx_ep_droq_info *);\n+\n \t/* make sure info is available */\n \trte_rmb();\n \tif (unlikely(!info->length)) {\n@@ -826,32 +818,25 @@ otx_ep_droq_read_packet(struct otx_ep_device *otx_ep,\n \t\t\tassert(0);\n \t\t}\n \t}\n+\n \tif (next_fetch) {\n \t\tnext_idx = otx_ep_incr_index(droq->read_idx, 1, droq->nb_desc);\n-\t\tdroq_pkt2  = droq->recv_buf_list[next_idx];\n-\t\tinfo2 = rte_pktmbuf_mtod(droq_pkt2, struct otx_ep_droq_info *);\n-\t\trte_prefetch_non_temporal((const void *)info2);\n+\t\tmbuf_next = droq->recv_buf_list[next_idx];\n+\t\trte_prefetch0(rte_pktmbuf_mtod(mbuf_next, void *));\n \t}\n \n-\tinfo->length = rte_bswap64(info->length);\n+\tinfo->length = rte_bswap16(info->length >> 48);\n \t/* Deduce the actual data size */\n \ttotal_pkt_len = info->length + OTX_EP_INFO_SIZE;\n \tif (total_pkt_len <= droq->buffer_size) {\n-\t\tdroq_pkt  = droq->recv_buf_list[droq->read_idx];\n-\t\tif (likely(droq_pkt != NULL)) {\n-\t\t\tdroq_pkt->data_off += OTX_EP_INFO_SIZE;\n-\t\t\t/* otx_ep_dbg(\"OQ: pkt_len[%ld], buffer_size %d\\n\",\n-\t\t\t * (long)info->length, droq->buffer_size);\n-\t\t\t */\n-\t\t\tpkt_len = (uint32_t)info->length;\n-\t\t\tdroq_pkt->pkt_len  = pkt_len;\n-\t\t\tdroq_pkt->data_len  = pkt_len;\n-\t\t\tdroq_pkt->port = otx_ep->port_id;\n-\t\t\tdroq->recv_buf_list[droq->read_idx] = NULL;\n-\t\t\tdroq->read_idx = otx_ep_incr_index(droq->read_idx, 1,\n-\t\t\t\t\t\t\t   droq->nb_desc);\n-\t\t\tdroq->refill_count++;\n-\t\t}\n+\t\tmbuf->data_off += OTX_EP_INFO_SIZE;\n+\t\tpkt_len = (uint32_t)info->length;\n+\t\tmbuf->pkt_len  = pkt_len;\n+\t\tmbuf->data_len  = pkt_len;\n+\t\tmbuf->port = otx_ep->port_id;\n+\t\tdroq->recv_buf_list[droq->read_idx] = NULL;\n+\t\tdroq->read_idx = otx_ep_incr_index(droq->read_idx, 1, droq->nb_desc);\n+\t\tdroq->refill_count++;\n \t} else {\n \t\tstruct rte_mbuf *first_buf = NULL;\n \t\tstruct rte_mbuf *last_buf = NULL;\n@@ -863,61 +848,50 @@ otx_ep_droq_read_packet(struct otx_ep_device *otx_ep,\n \t\twhile (pkt_len < total_pkt_len) {\n \t\t\tint cpy_len = 0;\n \n-\t\t\tcpy_len = ((pkt_len + droq->buffer_size) >\n-\t\t\t\t\ttotal_pkt_len)\n-\t\t\t\t\t? ((uint32_t)total_pkt_len -\n-\t\t\t\t\t\tpkt_len)\n+\t\t\tcpy_len = ((pkt_len + droq->buffer_size) > total_pkt_len)\n+\t\t\t\t\t? ((uint32_t)total_pkt_len - pkt_len)\n \t\t\t\t\t: droq->buffer_size;\n \n-\t\t\tdroq_pkt = droq->recv_buf_list[droq->read_idx];\n+\t\t\tmbuf = droq->recv_buf_list[droq->read_idx];\n \t\t\tdroq->recv_buf_list[droq->read_idx] = NULL;\n \n-\t\t\tif (likely(droq_pkt != NULL)) {\n+\t\t\tif (likely(mbuf)) {\n \t\t\t\t/* Note the first seg */\n \t\t\t\tif (!pkt_len)\n-\t\t\t\t\tfirst_buf = droq_pkt;\n+\t\t\t\t\tfirst_buf = mbuf;\n \n-\t\t\t\tdroq_pkt->port = otx_ep->port_id;\n+\t\t\t\tmbuf->port = otx_ep->port_id;\n \t\t\t\tif (!pkt_len) {\n-\t\t\t\t\tdroq_pkt->data_off +=\n-\t\t\t\t\t\tOTX_EP_INFO_SIZE;\n-\t\t\t\t\tdroq_pkt->pkt_len =\n-\t\t\t\t\t\tcpy_len - OTX_EP_INFO_SIZE;\n-\t\t\t\t\tdroq_pkt->data_len =\n-\t\t\t\t\t\tcpy_len - OTX_EP_INFO_SIZE;\n+\t\t\t\t\tmbuf->data_off += OTX_EP_INFO_SIZE;\n+\t\t\t\t\tmbuf->pkt_len = cpy_len - OTX_EP_INFO_SIZE;\n+\t\t\t\t\tmbuf->data_len = cpy_len - OTX_EP_INFO_SIZE;\n \t\t\t\t} else {\n-\t\t\t\t\tdroq_pkt->pkt_len = cpy_len;\n-\t\t\t\t\tdroq_pkt->data_len = cpy_len;\n+\t\t\t\t\tmbuf->pkt_len = cpy_len;\n+\t\t\t\t\tmbuf->data_len = cpy_len;\n \t\t\t\t}\n \n \t\t\t\tif (pkt_len) {\n \t\t\t\t\tfirst_buf->nb_segs++;\n-\t\t\t\t\tfirst_buf->pkt_len += droq_pkt->pkt_len;\n+\t\t\t\t\tfirst_buf->pkt_len += mbuf->pkt_len;\n \t\t\t\t}\n \n \t\t\t\tif (last_buf)\n-\t\t\t\t\tlast_buf->next = droq_pkt;\n+\t\t\t\t\tlast_buf->next = mbuf;\n \n-\t\t\t\tlast_buf = droq_pkt;\n+\t\t\t\tlast_buf = mbuf;\n \t\t\t} else {\n \t\t\t\totx_ep_err(\"no buf\\n\");\n \t\t\t\tassert(0);\n \t\t\t}\n \n \t\t\tpkt_len += cpy_len;\n-\t\t\tdroq->read_idx = otx_ep_incr_index(droq->read_idx, 1,\n-\t\t\t\t\t\t\t   droq->nb_desc);\n+\t\t\tdroq->read_idx = otx_ep_incr_index(droq->read_idx, 1, droq->nb_desc);\n \t\t\tdroq->refill_count++;\n \t\t}\n-\t\tdroq_pkt = first_buf;\n+\t\tmbuf = first_buf;\n \t}\n-\tdroq_pkt->packet_type = rte_net_get_ptype(droq_pkt, &hdr_lens,\n-\t\t\t\t\tRTE_PTYPE_ALL_MASK);\n-\tdroq_pkt->l2_len = hdr_lens.l2_len;\n-\tdroq_pkt->l3_len = hdr_lens.l3_len;\n-\tdroq_pkt->l4_len = hdr_lens.l4_len;\n \n-\treturn droq_pkt;\n+\treturn mbuf;\n }\n \n static inline uint32_t\n@@ -941,7 +915,14 @@ otx_ep_check_droq_pkts(struct otx_ep_droq *droq)\n \t\t * when count above halfway to saturation.\n \t\t */\n \t\trte_write32(val, droq->pkts_sent_reg);\n-\t\t*droq->pkts_sent_ism = 0;\n+\t\trte_mb();\n+\n+\t\trte_write64(OTX2_SDP_REQUEST_ISM, droq->pkts_sent_reg);\n+\t\twhile (__atomic_load_n(droq->pkts_sent_ism, __ATOMIC_RELAXED) >= val) {\n+\t\t\trte_write64(OTX2_SDP_REQUEST_ISM, droq->pkts_sent_reg);\n+\t\t\trte_mb();\n+\t\t}\n+\n \t\tdroq->pkts_sent_ism_prev = 0;\n \t}\n \trte_write64(OTX2_SDP_REQUEST_ISM, droq->pkts_sent_reg);\n@@ -950,36 +931,30 @@ otx_ep_check_droq_pkts(struct otx_ep_droq *droq)\n \treturn new_pkts;\n }\n \n+static inline int32_t __rte_hot\n+otx_ep_rx_pkts_to_process(struct otx_ep_droq *droq, uint16_t nb_pkts)\n+{\n+\tif (unlikely(droq->pkts_pending < nb_pkts))\n+\t\totx_ep_check_droq_pkts(droq);\n+\n+\treturn RTE_MIN(nb_pkts, droq->pkts_pending);\n+}\n+\n /* Check for response arrival from OCTEON 9\n  * returns number of requests completed\n  */\n uint16_t\n-otx_ep_recv_pkts(void *rx_queue,\n-\t\t  struct rte_mbuf **rx_pkts,\n-\t\t  uint16_t budget)\n+otx_ep_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, uint16_t nb_pkts)\n {\n \tstruct otx_ep_droq *droq = rx_queue;\n \tstruct otx_ep_device *otx_ep;\n \tstruct rte_mbuf *oq_pkt;\n-\n-\tuint32_t pkts = 0;\n+\tuint16_t pkts, new_pkts;\n \tuint32_t valid_pkts = 0;\n-\tuint32_t new_pkts = 0;\n \tint next_fetch;\n \n \totx_ep = droq->otx_ep_dev;\n-\n-\tif (droq->pkts_pending > budget) {\n-\t\tnew_pkts = budget;\n-\t} else {\n-\t\tnew_pkts = droq->pkts_pending;\n-\t\tnew_pkts += otx_ep_check_droq_pkts(droq);\n-\t\tif (new_pkts > budget)\n-\t\t\tnew_pkts = budget;\n-\t}\n-\n-\tif (!new_pkts)\n-\t\tgoto update_credit; /* No pkts at this moment */\n+\tnew_pkts = otx_ep_rx_pkts_to_process(droq, nb_pkts);\n \n \tfor (pkts = 0; pkts < new_pkts; pkts++) {\n \t\t/* Push the received pkt to application */\n@@ -1004,7 +979,6 @@ otx_ep_recv_pkts(void *rx_queue,\n \tdroq->pkts_pending -= pkts;\n \n \t/* Refill DROQ buffers */\n-update_credit:\n \tif (droq->refill_count >= DROQ_REFILL_THRESHOLD) {\n \t\tint desc_refilled = otx_ep_droq_refill(droq);\n \n@@ -1012,7 +986,7 @@ otx_ep_recv_pkts(void *rx_queue,\n \t\t * that when we update the credits the data in memory is\n \t\t * accurate.\n \t\t */\n-\t\trte_wmb();\n+\t\trte_io_wmb();\n \t\trte_write32(desc_refilled, droq->pkts_credit_reg);\n \t} else {\n \t\t/*\n",
    "prefixes": [
        "2/3"
    ]
}