get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 121878,
    "url": "https://patches.dpdk.org/api/patches/121878/?format=api",
    "web_url": "https://patches.dpdk.org/project/dpdk/patch/20230112075926.2864279-1-mchalla@marvell.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": "<20230112075926.2864279-1-mchalla@marvell.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20230112075926.2864279-1-mchalla@marvell.com",
    "date": "2023-01-12T07:59:26",
    "name": "[v1,1/1] compress/octeontx: scatter gather mode feature support",
    "commit_ref": null,
    "pull_url": null,
    "state": "changes-requested",
    "archived": true,
    "hash": "e2631108279d07d15208d981ff5db367174881c1",
    "submitter": {
        "id": 1532,
        "url": "https://patches.dpdk.org/api/people/1532/?format=api",
        "name": "Mahipal Challa",
        "email": "mchalla@marvell.com"
    },
    "delegate": {
        "id": 6690,
        "url": "https://patches.dpdk.org/api/users/6690/?format=api",
        "username": "akhil",
        "first_name": "akhil",
        "last_name": "goyal",
        "email": "gakhil@marvell.com"
    },
    "mbox": "https://patches.dpdk.org/project/dpdk/patch/20230112075926.2864279-1-mchalla@marvell.com/mbox/",
    "series": [
        {
            "id": 26494,
            "url": "https://patches.dpdk.org/api/series/26494/?format=api",
            "web_url": "https://patches.dpdk.org/project/dpdk/list/?series=26494",
            "date": "2023-01-12T07:59:26",
            "name": "[v1,1/1] compress/octeontx: scatter gather mode feature support",
            "version": 1,
            "mbox": "https://patches.dpdk.org/series/26494/mbox/"
        }
    ],
    "comments": "https://patches.dpdk.org/api/patches/121878/comments/",
    "check": "warning",
    "checks": "https://patches.dpdk.org/api/patches/121878/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 C00FB423B4;\n\tThu, 12 Jan 2023 08:59:40 +0100 (CET)",
            "from mails.dpdk.org (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id B6DFC40E25;\n\tThu, 12 Jan 2023 08:59:40 +0100 (CET)",
            "from mx0b-0016f401.pphosted.com (mx0b-0016f401.pphosted.com\n [67.231.156.173])\n by mails.dpdk.org (Postfix) with ESMTP id CFAF7400EF\n for <dev@dpdk.org>; Thu, 12 Jan 2023 08:59:38 +0100 (CET)",
            "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 30C2RuGi016230 for <dev@dpdk.org>; Wed, 11 Jan 2023 23:59:38 -0800",
            "from dc5-exch01.marvell.com ([199.233.59.181])\n by mx0b-0016f401.pphosted.com (PPS) with ESMTPS id 3n1k56xrg9-1\n (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT)\n for <dev@dpdk.org>; Wed, 11 Jan 2023 23:59:38 -0800",
            "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.42;\n Wed, 11 Jan 2023 23:59:36 -0800",
            "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.42 via Frontend\n Transport; Wed, 11 Jan 2023 23:59:35 -0800",
            "from mahipal-244.marvell.com (unknown [10.29.20.28])\n by maili.marvell.com (Postfix) with ESMTP id 350903F7086;\n Wed, 11 Jan 2023 23:59:33 -0800 (PST)"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=marvell.com;\n h=from : to : cc :\n subject : date : message-id : mime-version : content-transfer-encoding :\n content-type; s=pfpt0220; bh=onjtzYAP1440nUjmJpgItEzHFlgIWDu5hzZmqGOEX/o=;\n b=SzDTYBF69uN5jeLLuZdJqQkKy8eVDdR6RZJp0oIEIcZ9h7pTCzSX5bMLZRYWyCAC+oyw\n PTOWK6jax5M9PUExk+TNziWRE9KNYKmVzG757bNdYcUCU3WMCVU5QM+X3XIuCULJdaTm\n OKsJylk6P+M7Z+Au71kVUtmWeHQZRArBhnBrKFFAo6FAAgYyal9e3UdEd21nn+HnxFPR\n +oBJB9BZxPh4k61nmIUsmQjC1EYZw2CEg89MEwyGgwAtSTiELEpXGm1ddy3fZ8lS2xtt\n kpHQJ6QhUOqNfD/RqfONWluWNpnU0wFfblwA+i1p1elLWkD/106ztOGrauspN/jNFysq VQ==",
        "From": "Mahipal Challa <mchalla@marvell.com>",
        "To": "<dev@dpdk.org>",
        "CC": "<jerinj@marvell.com>, <pathreya@marvell.com>, <ashishg@marvell.com>,\n <mchalla@marvell.com>",
        "Subject": "[dpdk-dev] [PATCH v1 1/1] compress/octeontx: scatter gather mode\n feature support",
        "Date": "Thu, 12 Jan 2023 13:29:26 +0530",
        "Message-ID": "<20230112075926.2864279-1-mchalla@marvell.com>",
        "X-Mailer": "git-send-email 2.25.1",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "Content-Type": "text/plain",
        "X-Proofpoint-ORIG-GUID": "xPpZRrN3oQIq-K9SqKeA5LWlLKw2Kztg",
        "X-Proofpoint-GUID": "xPpZRrN3oQIq-K9SqKeA5LWlLKw2Kztg",
        "X-Proofpoint-Virus-Version": "vendor=baseguard\n engine=ICAP:2.0.219,Aquarius:18.0.923,Hydra:6.0.545,FMLib:17.11.122.1\n definitions=2023-01-12_04,2023-01-11_03,2022-06-22_01",
        "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": "Scatter gather mode feature support is added to compress or decompress\nthe larger data in a single compression or decompression operation.\n\nSigned-off-by: Mahipal Challa <mchalla@marvell.com>\n---\n drivers/compress/octeontx/otx_zip.h     | 155 +++++++++++++++++++++---\n drivers/compress/octeontx/otx_zip_pmd.c |  72 +++++++++--\n 2 files changed, 200 insertions(+), 27 deletions(-)",
    "diff": "diff --git a/drivers/compress/octeontx/otx_zip.h b/drivers/compress/octeontx/otx_zip.h\nindex ee14deb03d..0b68f49609 100644\n--- a/drivers/compress/octeontx/otx_zip.h\n+++ b/drivers/compress/octeontx/otx_zip.h\n@@ -55,10 +55,13 @@ extern int octtx_zip_logtype_driver;\n \t\t\t\tZIP_MAX_NCBP_SIZE)/* ~8072ull */\n \n #define ZIP_BUF_SIZE\t256\n+#define ZIP_SGBUF_SIZE\t(5 * 1024)\n #define ZIP_BURST_SIZE\t64\n \n #define ZIP_MAXSEG_SIZE      59460\n #define ZIP_EXTRABUF_SIZE    4096\n+#define ZIP_MAX_SEGS         300\n+#define ZIP_MAX_DATA_SIZE    (16*1024*1024)\n \n #define ZIP_SGPTR_ALIGN\t16\n #define ZIP_CMDQ_ALIGN\t128\n@@ -102,6 +105,12 @@ struct zipvf_qp;\n typedef int (*comp_func_t)(struct rte_comp_op *op, struct zipvf_qp *qp,\n \t\t\t   struct zip_stream *zstrm, int num);\n \n+/* Scatter Gather list */\n+struct zipvf_sginfo {\n+\tunion zip_zptr_addr_s  sg_addr;\n+\tunion zip_zptr_ctl_s   sg_ctl;\n+} __rte_aligned(16);\n+\n /**\n  * ZIP private stream structure\n  */\n@@ -144,6 +153,11 @@ struct zipvf_qp {\n \t/* Unique Queue Pair Name */\n \tstruct zip_vf *vf;\n \t/* pointer to device, queue belongs to */\n+\tstruct zipvf_sginfo *g_info;\n+\tstruct zipvf_sginfo *s_info;\n+\t/* gather and scatter SGL */\n+\tuint64_t num_sgbuf;\n+\tuint64_t enqed;\n } __rte_cache_aligned;\n \n /**\n@@ -161,50 +175,146 @@ struct zip_vf {\n \tuint32_t  max_nb_queue_pairs;\n \t/* pointer to device qps */\n \tstruct rte_mempool *zip_mp;\n+\tstruct rte_mempool *sg_mp;\n \t/* pointer to pools */\n } __rte_cache_aligned;\n \n \n-static inline void\n-zipvf_prepare_in_buf(union zip_inst_s *inst, struct rte_comp_op *op)\n+static inline int\n+zipvf_prepare_sgl(struct rte_mbuf *buf, int64_t offset, struct zipvf_sginfo *sg_list,\n+\t\t  uint32_t data_len, const uint16_t max_segs, struct zipvf_qp *qp)\n+{\n+\tstruct zipvf_sginfo *sginfo = (struct zipvf_sginfo *)sg_list;\n+\tuint32_t tot_buf_len, sgidx;\n+\tint ret = -EINVAL;\n+\n+\tfor (sgidx = tot_buf_len = 0; buf && sgidx < max_segs; buf = buf->next) {\n+\t\tif (offset >= rte_pktmbuf_data_len(buf)) {\n+\t\t\toffset -= rte_pktmbuf_data_len(buf);\n+\t\t\tcontinue;\n+\t\t}\n+\n+\t\tsginfo[sgidx].sg_ctl.s.length = (uint16_t)(rte_pktmbuf_data_len(buf) - offset);\n+\t\tsginfo[sgidx].sg_addr.s.addr = rte_pktmbuf_iova_offset(buf, offset);\n+\n+\t\toffset = 0;\n+\t\ttot_buf_len += sginfo[sgidx].sg_ctl.s.length;\n+\n+\t\tif (tot_buf_len >= data_len) {\n+\t\t\tsginfo[sgidx].sg_ctl.s.length -= tot_buf_len - data_len;\n+\t\t\tret = 0;\n+\t\t\tbreak;\n+\t\t}\n+\n+#ifdef ZIP_DBG\n+\t\tZIP_PMD_INFO(\"ZIP SGL buf[%d], len = %d, iova = 0x%\"PRIx64\"\\n\",\n+\t\t\t     sgidx, sginfo[sgidx].sg_ctl.s.length,\n+\t\t\t     sginfo[sgidx].sg_addr.s.addr);\n+#endif\n+\t\t++sgidx;\n+\t}\n+\n+\tif (unlikely(ret != 0)) {\n+\t\tif (sgidx == max_segs)\n+\t\t\tZIP_PMD_ERR(\"Exceeded max segments in ZIP SGL (%u)\", max_segs);\n+\t\telse\n+\t\t\tZIP_PMD_ERR(\"Mbuf chain is too short\");\n+\t}\n+\tqp->num_sgbuf = ++sgidx;\n+\n+#ifdef ZIP_DBG\n+\tZIP_PMD_INFO(\"Tot_buf_len:%d max_segs:%d\\n\", tot_buf_len, qp->num_sgbuf);\n+#endif\n+\treturn ret;\n+}\n+\n+static inline int\n+zipvf_prepare_in_buf(union zip_inst_s *inst, struct zipvf_qp *qp, struct rte_comp_op *op)\n {\n \tuint32_t offset, inlen;\n \tstruct rte_mbuf *m_src;\n+\tint ret = 0;\n \n \tinlen = op->src.length;\n \toffset = op->src.offset;\n \tm_src = op->m_src;\n \n+\t/* Gather input */\n+\tif (op->m_src->next != NULL && inlen > ZIP_MAXSEG_SIZE) {\n+\t\tinst->s.dg = 1;\n+\n+\t\tret = zipvf_prepare_sgl(m_src, offset, qp->g_info, inlen,\n+\t\t\t\t\top->m_src->nb_segs, qp);\n+\n+\t\tinst->s.inp_ptr_addr.s.addr = rte_mem_virt2iova(qp->g_info);\n+\t\tinst->s.inp_ptr_ctl.s.length = qp->num_sgbuf;\n+\t\tinst->s.inp_ptr_ctl.s.fw = 0;\n+\n+#ifdef ZIP_DBG\n+\t\tZIP_PMD_INFO(\"Gather(input): len(nb_segs):%d, iova: 0x%\"PRIx64\"\\n\",\n+\t\t\t     inst->s.inp_ptr_ctl.s.length, inst->s.inp_ptr_addr.s.addr);\n+#endif\n+\t\treturn ret;\n+\t}\n+\n \t/* Prepare direct input data pointer */\n \tinst->s.dg = 0;\n-\tinst->s.inp_ptr_addr.s.addr =\n-\t\t\trte_pktmbuf_iova_offset(m_src, offset);\n+\tinst->s.inp_ptr_addr.s.addr = rte_pktmbuf_iova_offset(m_src, offset);\n \tinst->s.inp_ptr_ctl.s.length = inlen;\n+\n+#ifdef ZIP_DBG\n+\tZIP_PMD_INFO(\"Direct input - inlen:%d\\n\", inlen);\n+#endif\n+\treturn ret;\n }\n \n-static inline void\n-zipvf_prepare_out_buf(union zip_inst_s *inst, struct rte_comp_op *op)\n+static inline int\n+zipvf_prepare_out_buf(union zip_inst_s *inst, struct zipvf_qp *qp, struct rte_comp_op *op)\n {\n-\tuint32_t offset;\n+\tuint32_t offset, outlen;\n \tstruct rte_mbuf *m_dst;\n+\tint ret = 0;\n \n \toffset = op->dst.offset;\n \tm_dst = op->m_dst;\n+\toutlen = rte_pktmbuf_pkt_len(m_dst) - op->dst.offset;\n \n-\t/* Prepare direct input data pointer */\n+\t/* Scatter output */\n+\tif (op->m_dst->next != NULL && outlen > ZIP_MAXSEG_SIZE) {\n+\t\tinst->s.ds = 1;\n+\t\tinst->s.totaloutputlength = outlen; /*rte_pktmbuf_pkt_len(m_dst) - op->dst.offset;*/\n+\n+\t\tret = zipvf_prepare_sgl(m_dst, offset, qp->s_info, inst->s.totaloutputlength,\n+\t\t\t\t\tm_dst->nb_segs, qp);\n+\n+\t\tinst->s.out_ptr_addr.s.addr = rte_mem_virt2iova(qp->s_info);\n+\t\tinst->s.out_ptr_ctl.s.length = qp->num_sgbuf;\n+\n+#ifdef ZIP_DBG\n+\t\tZIP_PMD_INFO(\"Scatter(output): nb_segs:%d, iova:0x%\"PRIx64\"\\n\",\n+\t\t\t     inst->s.out_ptr_ctl.s.length, inst->s.out_ptr_addr.s.addr);\n+#endif\n+\t\treturn ret;\n+\t}\n+\n+\t/* Prepare direct output data pointer */\n \tinst->s.ds = 0;\n-\tinst->s.out_ptr_addr.s.addr =\n-\t\t\trte_pktmbuf_iova_offset(m_dst, offset);\n-\tinst->s.totaloutputlength = rte_pktmbuf_pkt_len(m_dst) -\n-\t\t\top->dst.offset;\n+\tinst->s.out_ptr_addr.s.addr = rte_pktmbuf_iova_offset(m_dst, offset);\n+\tinst->s.totaloutputlength = rte_pktmbuf_pkt_len(m_dst) - op->dst.offset;\n \tif (inst->s.totaloutputlength == ZIP_MAXSEG_SIZE)\n \t\tinst->s.totaloutputlength += ZIP_EXTRABUF_SIZE; /* DSTOP */\n \n \tinst->s.out_ptr_ctl.s.length = inst->s.totaloutputlength;\n+\n+#ifdef ZIP_DBG\n+\tZIP_PMD_INFO(\"Direct output - outlen:%d\\n\", inst->s.totaloutputlength);\n+#endif\n+\treturn ret;\n }\n \n-static inline void\n-zipvf_prepare_cmd_stateless(struct rte_comp_op *op, union zip_inst_s *inst)\n+static inline int\n+zipvf_prepare_cmd_stateless(struct rte_comp_op *op, struct zipvf_qp *qp,\n+\t\t\t    union zip_inst_s *inst)\n {\n \t/* set flush flag to always 1*/\n \tinst->s.ef = 1;\n@@ -217,9 +327,18 @@ zipvf_prepare_cmd_stateless(struct rte_comp_op *op, union zip_inst_s *inst)\n \t/* Set input checksum */\n \tinst->s.adlercrc32 = op->input_chksum;\n \n-\t/* Prepare gather buffers */\n-\tzipvf_prepare_in_buf(inst, op);\n-\tzipvf_prepare_out_buf(inst, op);\n+\t/* Prepare input/output buffers */\n+\tif (zipvf_prepare_in_buf(inst, qp, op)) {\n+\t\tZIP_PMD_ERR(\"Con't fill input SGL \");\n+\t\treturn -EINVAL;\n+\t}\n+\n+\tif (zipvf_prepare_out_buf(inst, qp, op)) {\n+\t\tZIP_PMD_ERR(\"Con't fill output SGL \");\n+\t\treturn -EINVAL;\n+\t}\n+\n+\treturn 0;\n }\n \n #ifdef ZIP_DBG\n@@ -229,6 +348,7 @@ zip_dump_instruction(void *inst)\n \tunion zip_inst_s *cmd83 = (union zip_inst_s *)inst;\n \n \tprintf(\"####### START ########\\n\");\n+\tprintf(\"ZIP Instr:0x%\"PRIx64\"\\n\", cmd83);\n \tprintf(\"doneint:%d totaloutputlength:%d\\n\", cmd83->s.doneint,\n \t\tcmd83->s.totaloutputlength);\n \tprintf(\"exnum:%d iv:%d exbits:%d hmif:%d halg:%d\\n\", cmd83->s.exn,\n@@ -248,6 +368,7 @@ zip_dump_instruction(void *inst)\n \tprintf(\"inp_ptr.len:%d\\n\", cmd83->s.inp_ptr_ctl.s.length);\n \tprintf(\"out_ptr.addr:0x%\"PRIx64\"\\n\", cmd83->s.out_ptr_addr.s.addr);\n \tprintf(\"out_ptr.len:%d\\n\", cmd83->s.out_ptr_ctl.s.length);\n+\tprintf(\"result_ptr.addr:0x%\"PRIx64\"\\n\", cmd83->s.res_ptr_addr.s.addr);\n \tprintf(\"result_ptr.len:%d\\n\", cmd83->s.res_ptr_ctl.s.length);\n \tprintf(\"####### END ########\\n\");\n }\ndiff --git a/drivers/compress/octeontx/otx_zip_pmd.c b/drivers/compress/octeontx/otx_zip_pmd.c\nindex 2d856b19bb..2b518a98a6 100644\n--- a/drivers/compress/octeontx/otx_zip_pmd.c\n+++ b/drivers/compress/octeontx/otx_zip_pmd.c\n@@ -16,7 +16,10 @@ static const struct rte_compressdev_capabilities\n \t{\t.algo = RTE_COMP_ALGO_DEFLATE,\n \t\t/* Deflate */\n \t\t.comp_feature_flags =\tRTE_COMP_FF_HUFFMAN_FIXED |\n-\t\t\t\t\tRTE_COMP_FF_HUFFMAN_DYNAMIC,\n+\t\t\t\t\tRTE_COMP_FF_HUFFMAN_DYNAMIC |\n+\t\t\t\t\tRTE_COMP_FF_OOP_SGL_IN_SGL_OUT |\n+\t\t\t\t\tRTE_COMP_FF_OOP_SGL_IN_LB_OUT |\n+\t\t\t\t\tRTE_COMP_FF_OOP_LB_IN_SGL_OUT,\n \t\t/* Non sharable Priv XFORM and Stateless */\n \t\t.window_size = {\n \t\t\t\t.min = 1,\n@@ -46,15 +49,27 @@ zip_process_op(struct rte_comp_op *op,\n \tunion zip_inst_s *inst = zstrm->inst[num];\n \tvolatile union zip_zres_s *zresult = NULL;\n \n-\tif ((op->m_src->nb_segs > 1) || (op->m_dst->nb_segs > 1) ||\n-\t\t\t(op->src.offset > rte_pktmbuf_pkt_len(op->m_src)) ||\n-\t\t\t(op->dst.offset > rte_pktmbuf_pkt_len(op->m_dst))) {\n+\tif (op->m_src->nb_segs > 1)\n+\t\tif (rte_mempool_get(qp->vf->sg_mp, (void *)&qp->g_info) < 0) {\n+\t\t\tZIP_PMD_ERR(\"Can't1 allocate object from SG pool\");\n+\t\t\treturn (-ENOMEM);\n+\t\t}\n+\n+\tif (op->m_dst->nb_segs > 1)\n+\t\tif (rte_mempool_get(qp->vf->sg_mp, (void *)&qp->s_info) < 0) {\n+\t\t\trte_mempool_put(qp->vf->sg_mp, qp->g_info);\n+\t\t\tZIP_PMD_ERR(\"Can't allocate object from SG pool\");\n+\t\t\treturn (-ENOMEM);\n+\t\t}\n+\n+\tif (zipvf_prepare_cmd_stateless(op, qp, inst)) {\n \t\top->status = RTE_COMP_OP_STATUS_INVALID_ARGS;\n-\t\tZIP_PMD_ERR(\"Segmented packet is not supported\\n\");\n-\t\treturn 0;\n-\t}\n+\t\trte_mempool_put(qp->vf->sg_mp, qp->g_info);\n+\t\trte_mempool_put(qp->vf->sg_mp, qp->s_info);\n \n-\tzipvf_prepare_cmd_stateless(op, inst);\n+\t\tZIP_PMD_ERR(\"Can't fill SGL buffers\");\n+\t\treturn -EINVAL;\n+\t}\n \n \tzresult = (union zip_zres_s *)zstrm->bufs[RES_BUF + num];\n \tzresult->s.compcode = 0;\n@@ -174,10 +189,12 @@ static int\n zip_pmd_config(struct rte_compressdev *dev,\n \t\tstruct rte_compressdev_config *config)\n {\n-\tint nb_streams;\n \tchar res_pool[RTE_MEMZONE_NAMESIZE];\n-\tstruct zip_vf *vf;\n+\tchar sg_pool[RTE_MEMZONE_NAMESIZE];\n \tstruct rte_mempool *zip_buf_mp;\n+\tstruct rte_mempool *zip_sg_mp;\n+\tstruct zip_vf *vf;\n+\tint nb_streams;\n \n \tif (!config || !dev)\n \t\treturn -EIO;\n@@ -194,6 +211,9 @@ zip_pmd_config(struct rte_compressdev *dev,\n \tsnprintf(res_pool, RTE_MEMZONE_NAMESIZE, \"octtx_zip_res_pool%u\",\n \t\t dev->data->dev_id);\n \n+\tsnprintf(sg_pool, RTE_MEMZONE_NAMESIZE, \"octtx_zip_sg_pool%u\",\n+\t\t dev->data->dev_id);\n+\n \t/** TBD Should we use the per core object cache for stream resources */\n \tzip_buf_mp = rte_mempool_create(\n \t\t\tres_pool,\n@@ -215,7 +235,31 @@ zip_pmd_config(struct rte_compressdev *dev,\n \t\treturn -1;\n \t}\n \n+\t/* Scatter Gather bufer pool */\n+\tzip_sg_mp = rte_mempool_create(\n+\t\t\tsg_pool,\n+\t\t\t(2 * nb_streams * ZIP_BURST_SIZE * ZIP_MAX_SEGS),\n+\t\t\tZIP_SGBUF_SIZE,\n+\t\t\t0,\n+\t\t\t0,\n+\t\t\tNULL,\n+\t\t\tNULL,\n+\t\t\tNULL,\n+\t\t\tNULL,\n+\t\t\tSOCKET_ID_ANY,\n+\t\t\tMEMPOOL_F_NO_SPREAD);\n+\n+\tif (zip_sg_mp == NULL) {\n+\t\tZIP_PMD_ERR(\n+\t\t\t\"Failed to create SG buf mempool octtx_zip_sg_pool%u\",\n+\t\t\tdev->data->dev_id);\n+\n+\t\trte_mempool_free(vf->zip_mp);\n+\t\treturn -1;\n+\t}\n+\n \tvf->zip_mp = zip_buf_mp;\n+\tvf->sg_mp = zip_sg_mp;\n \n \treturn 0;\n }\n@@ -243,6 +287,7 @@ zip_pmd_close(struct rte_compressdev *dev)\n \n \tstruct zip_vf *vf = (struct zip_vf *)dev->data->dev_private;\n \trte_mempool_free(vf->zip_mp);\n+\trte_mempool_free(vf->sg_mp);\n \n \treturn 0;\n }\n@@ -482,6 +527,7 @@ zip_pmd_enqueue_burst(void *queue_pair,\n \t\t}\n \t}\n \n+\tqp->enqed = enqd;\n #ifdef ZIP_DBG\n \tZIP_PMD_INFO(\"ops_enqd[nb_ops:%d]:%d\\n\", nb_ops, enqd);\n #endif\n@@ -548,6 +594,12 @@ zip_pmd_dequeue_burst(void *queue_pair,\n \t\t/* zstream is reset irrespective of result */\n \t\treset_stream(zstrm->inst[i]);\n \t\tzresult->s.compcode = ZIP_COMP_E_NOTDONE;\n+\n+\t\tif (op->m_src->nb_segs > 1)\n+\t\t\trte_mempool_put(qp->vf->sg_mp, qp->g_info);\n+\n+\t\tif (op->m_dst->nb_segs > 1)\n+\t\t\trte_mempool_put(qp->vf->sg_mp, qp->s_info);\n \t}\n \n #ifdef ZIP_DBG\n",
    "prefixes": [
        "v1",
        "1/1"
    ]
}