get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 43255,
    "url": "http://patches.dpdk.org/api/patches/43255/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/1532197069-24224-5-git-send-email-shally.verma@caviumnetworks.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": "<1532197069-24224-5-git-send-email-shally.verma@caviumnetworks.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/1532197069-24224-5-git-send-email-shally.verma@caviumnetworks.com",
    "date": "2018-07-21T18:17:48",
    "name": "[v3,4/5] compress/zlib: support burst enqueue/dequeue",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "0f80d61bb320bd84c5a67301e6d0455f9a450ce4",
    "submitter": {
        "id": 960,
        "url": "http://patches.dpdk.org/api/people/960/?format=api",
        "name": "Shally Verma",
        "email": "shally.verma@caviumnetworks.com"
    },
    "delegate": {
        "id": 22,
        "url": "http://patches.dpdk.org/api/users/22/?format=api",
        "username": "pdelarag",
        "first_name": "Pablo",
        "last_name": "de Lara Guarch",
        "email": "pablo.de.lara.guarch@intel.com"
    },
    "mbox": "http://patches.dpdk.org/project/dpdk/patch/1532197069-24224-5-git-send-email-shally.verma@caviumnetworks.com/mbox/",
    "series": [
        {
            "id": 703,
            "url": "http://patches.dpdk.org/api/series/703/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=703",
            "date": "2018-07-21T18:17:44",
            "name": "compress: add ZLIB compression PMD",
            "version": 3,
            "mbox": "http://patches.dpdk.org/series/703/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/43255/comments/",
    "check": "success",
    "checks": "http://patches.dpdk.org/api/patches/43255/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 D496D2F4F;\n\tSat, 21 Jul 2018 20:22:21 +0200 (CEST)",
            "from NAM02-BL2-obe.outbound.protection.outlook.com\n\t(mail-bl2nam02on0087.outbound.protection.outlook.com [104.47.38.87])\n\tby dpdk.org (Postfix) with ESMTP id 41DA32BF5\n\tfor <dev@dpdk.org>; Sat, 21 Jul 2018 20:22:18 +0200 (CEST)",
            "from hyd1sverma-dt.caveonetworks.com (115.113.156.2) by\n\tCY4PR0701MB3634.namprd07.prod.outlook.com (2603:10b6:910:92::36) with\n\tMicrosoft SMTP Server (version=TLS1_2,\n\tcipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.973.21;\n\tSat, 21 Jul 2018 18:18:29 +0000"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=CAVIUMNETWORKS.onmicrosoft.com; s=selector1-cavium-com;\n\th=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck;\n\tbh=OI5DapzutNlcRdsg36D1kYvTIhG3tCfKG9yuhbWgaxg=;\n\tb=chtDWPhNdTvIzEbStMfDmEROZN1/50uHUrzMniC9E2WaCjqh5CoLD3AmQ1zcnWS8WiRbj1kyfCsk01r14ZMViFLrSz3WFZvcTtkGmJcZa4IujlHjccQb8G7p/KU5tPptppUxbIq4/PbKjAkeUUjhJytT6qS5cVhHpJrpOcS+qhI=",
        "Authentication-Results": "spf=none (sender IP is )\n\tsmtp.mailfrom=Shally.Verma@cavium.com; ",
        "From": "Shally Verma <shally.verma@caviumnetworks.com>",
        "To": "pablo.de.lara.guarch@intel.com",
        "Cc": "dev@dpdk.org, pathreya@caviumnetworks.com, mchalla@caviumnetworks.com,\n\tashish.gupta@caviumnetworks.com, sunila.sahu@caviumnetworks.com,\n\tSunila Sahu <ssahu@caviumnetworks.com>",
        "Date": "Sat, 21 Jul 2018 23:47:48 +0530",
        "Message-Id": "<1532197069-24224-5-git-send-email-shally.verma@caviumnetworks.com>",
        "X-Mailer": "git-send-email 1.9.1",
        "In-Reply-To": "<1532197069-24224-1-git-send-email-shally.verma@caviumnetworks.com>",
        "References": "<1532197069-24224-1-git-send-email-shally.verma@caviumnetworks.com>",
        "MIME-Version": "1.0",
        "Content-Type": "text/plain",
        "X-Originating-IP": "[115.113.156.2]",
        "X-ClientProxiedBy": "MA1PR01CA0103.INDPRD01.PROD.OUTLOOK.COM\n\t(2603:1096:a00:1::19) To CY4PR0701MB3634.namprd07.prod.outlook.com\n\t(2603:10b6:910:92::36)",
        "X-MS-PublicTrafficType": "Email",
        "X-MS-Office365-Filtering-Correlation-Id": "4dc49347-2ff8-49db-8ae5-08d5ef365d71",
        "X-Microsoft-Antispam": "BCL:0; PCL:0;\n\tRULEID:(7020095)(4652040)(8989117)(5600073)(711020)(4534165)(7168020)(4627221)(201703031133081)(201702281549075)(8990107)(2017052603328)(7153060)(7193020);\n\tSRVR:CY4PR0701MB3634; ",
        "X-Microsoft-Exchange-Diagnostics": [
            "1; CY4PR0701MB3634;\n\t3:jQNrpoNaPZgBew8ZjERL4bxmmPr4JnGeh3hEybSWJrd6U9uZw7dxBgbYuRN9mHVXO7t3+p5SiXfJh4VHL518xM76dZjPBxNYymCK0i3g3Xp1UYysd/XZewrunVoDIakttbUZAxtlJ0/E9U11Wrr85XUvHui3/rqZdEGfsHlcySHEkNr5GoHCYzYcmqFscd+P158qF2j1AULx8QBSqCd8lyOKiMtBn85f9IubQZPH9ImB3FgBzZC4H1k5xO8g8Ngi;\n\t25:i/FO/+tbUb1EnZsHajQhaZCCCDVyHm90e+GYwOm9jtk82Wm8/fC5G1ldRpud4lwiVxlhprPX4gYJMxX2feWL3J1QXByI+TfszSbdfpY0SvUFvBb1CmvX/QRs5QeG254xrkOkv+e174SZ9DDo5UmJwpc8y0dztlH+CwwuCzXRuDQdsegtEj3JXPFYPpsFEWDjmAaIDz09wb7f311bkBCiedkG9ce5ediMCVhkR4zwtMoHFAt5YuAtOK0B52vquHryHs1JddHVCInk8VKmHFJ7+xhNKdz+E25awlN7ev53XbUfxGSx4h96Uf/Sz5uhXXhdKsCBIMwTPQ5T1Owo6K5+VA==;\n\t31:dTu0Lak284p1efPuOmgGq/AmYsOMC+MkLAySIjeztPwWh7BJHGwRzCQbfgoQLAHQiem8U9pN+zRPtG/1Jh43T6eyBBfHhOe3HoyujEqok+QjYNVrNUkFtIcIIGm85qm45A+9WApBhLA2FzYKMfzo54k95Rye6NjlMIhMBZLBBqXg0G4Z8fJxppNbAPLShg5Fl3AEidVVZgjhQ6JcmEVh6JjkJ2pHOCCJ9FmRJpsKG7Q=",
            "1; CY4PR0701MB3634;\n\t20:tDaeXafCQqsdDzHG/cbWPBEB9m+4j0bVU6jWyzZScxe3//W8mbkg61u2x/jWBoiwvxDW8lV1SbmL0DX5GftoQRB4nEaK74NlM3gdyotF3SX+CFGMLe+rBa42HESjHrfoNkJszrlHJF/BOKwI8jgn+O+4gmavGUwmnaBWjEA4JVvQ8yHKIFvzWlrtPdfD8z5R31jISn8CWAjK8YJ7OOKHNX5YjWpfWpSRFRVAtO3aQCO3vgUiqXvfIkNHyeIkz4VntFKUSlpsSw5uLN234Zzj9LFkvZF2XITNlWnawBqvjZ/Pk4WPDra/N/UV0rtflO5RCcdSQXS9kifpH3uM+rF9ojqxJuPJeqRq67TdCeGfQWTrZRmH/ZF4cJ4Ju8lF+8hU5wIqZNngGso/BgBK1+ckem2gYGXe1dJPY0U1DXhMTDUZ8jTUybd18gjBRnvstEnLSUWgMB8wqjjYBBfaB+8R87fPnplhnaEIsWqqdeWt0cKpVIM2yqqyHPlDHQ6jgmM72zqcf49gQDb/jPtpODZ/XlJmK/RiUUHxVlaI40o7gMvbyjlwMDipUIlylcnEXifVtMESucooe5x1Wti0plpjj8TGwbokGp4TeX08d3Hg46A=;\n\t4:DaQnk4I4m2LuiqLHiyDVs4Y2qK/Sf18StoCLSdfijcgHjspJpEfSJiHI0xOkJG302iFKcTJ+KP2PS3h9flEjCmBp9kiCTDXBsxKV/kzsE46YsKJ5hfeeYJrZikpuwlaZf6EuIH8ima5ADhPFy9nkv3LbrsWElVjUjxJqbvY3xiYmkcas0vTF6wkP0VSIYbcPG/YNv8XDwOiJNCGBQJmnCRdfkcodYSsC4lD5MsGpLpw/wvR7qwjacq2bAULhiM39RdRsO64f5avl0WVkOwdDuA==",
            "=?us-ascii?Q?1; CY4PR0701MB3634;\n\t23:hDaPhPI2wpx5cUORBBkBkx7EOr23H9KiWqdeShU?=\n\tZ2IfHta0KBFb9YF2y5u3C+J7I+DhM3Gj5wND+f4g0BS0DMCDJm8YqWefWJprJKvWS0t5wJOkOGgZ63CwrQRtVjeEZzD76k30r89gxC5PoWTanbrP1rm/h/0byZCB+kIKpIIdiwEgcSTAwf9VWFvhnWv03yUXeFc80q6df1XHYXHY7SFi1L6nchqNZArIwJr+QKLpBjv5fTzCH2jjZbMV8Lz+CVbWg8NJhxM7+h4xX6B3LTXzYjjxcJmZ/gnaFi3fdjBHaxboVORkz41vTTJuLRi2lyK39LfJ4CqVvjXNDklJmufALa+Ulh7YXJqK/RrzkCdKKBu3sCDzpQZ7Oxpx8g0FTOXB2hKaGvpvVR4hkw3oanrJ1w6hcHIGqDlSi5tpShbF3sqtoyT3HXJdTicq85j+wwdaTHp0wf0kKvyLBDT6X4n1tc3IIFU0/zMzvxjzfymMY58oktBP2WA9OsV8qls/REr5TooVa3GEY4vewjSGV5Ubf5Wa2HPV2lDplGW4ubaG3eClAkujdlAXKjLA/0rn0hSZ+8EchabyIeiTogMKfkdMf7BItVgb6iWoTreaEkgdrtbrPAKQMDwijH0iFdADF0yiCk32U9IDZmiwscNiLVAGjKcc5ZcF2V8h5tyC0CZUqAuP3the/QZCxBBJRH1Ect0uIParYFDLtTcu1X2/t8FNoZlcWKgffnXv6Uzjoqez+jwoRdHjfG8p869Y3SXrw3BP4vk67sgH0goJklATrR04iGpskNScTAXWTuNMgvCvV7eHrj9H5CEv37ouoHhc408GyKR2r6Wy9/e5nSS/sVCn2c2LxDJUEPOQLDy6/bo8/Dzl7cWSGrAPKjlEtf+u2VVVIE/QtpPcCk5XUQznYIv8fKU0PctpyfxnIaAtnzj9C8iYHK+/f+RLt6Y0q85M6k/WoW0RGSQdc4b/a1F8r9YPs1LlwU75gQstL+SWC70wVItJSdaq8XCgkkoYYPUsc45GdoBqZp1yv04nbmKU9L6iJY+TXpdF8O31cQWhaVrb0SmrDgM6zdfFLwyf8Kw3K2gx8jcNohWTZWzKXdTFO7m3orWdph3oqHUOzguK+10tsu/ire0AlTPxFROQB7MTK+NoliQX+MdFdUO/n7f2GmJNXC5Ir4EwWx1pej0LAdA7mQWAd0D185mBgsSDLDrBuwPnbZtCIABx2cY1PaIM7hi/Ka6G2OsscRbvYCEGrzE1VQ+oe5fCHOZnCLKnV7Aryi2wgyykhxDBA2TgA6sv1UQokUN2N9QhEp5fe+wjlMycQqmiyN6rC8bNxrRwnsqFLWmHlK83ZKBdlFXVgY9VJ8g==",
            "1; CY4PR0701MB3634;\n\t6:xRtcMLfM3nSjOUE30UdXrZ9PQrzZ8exRhRB6Gz8LFdmolKvdKk9PmzM7o0/blh/TKF7coVyFCNcr0SCom/9RLSTC6+D6zIxfe0WqDNvG6rghRtckXm8jzOMjP3tjIkamR2MwkTHAS8th1Yo+YQvMZ1zpnvNstyv22uWP58aVLgq+nxpjOBrNMFxMqqeb5nCh6Qhbueh2ABAldG2BlRAj1GwJhGKAYjYJE39nY7V7UeQW/eTLQ3sfHUdxNCc4JZ3wWAZ43d3gCphmKX9+xzgioJR05CwfZIUybeUmof1mMn00M+2dULy63naokaZEtQYQkUzf03znusg6PXwG+55QDT/OO96w0mtrCadzPZ7gmNPx86KYTQ3bMghDuy4DqMIBXqVd6PPktrDOHMIHIzT4HfQeJnrVJFZ98HN9mbGZGXLd6DHpyPwFHY3ENq1XMaRNady+GJ5j7TiBo0WVf1qLmg==;\n\t5:hpzwe2CEZp1bjeTwflnIgPrXEM0a8ij5KyLvTJixuOu+8ioOyGwYWBUnaqqmu6wcwdmKkN3gEYccWKT9uXDt2kY9ATi1RjinuOLeV/L0y6gv4Wi4bhvBOcR47/bcd1Wudc/fC2LWWfAxqgSiBLPGAUj8itJd0MJZjajVV9xfD0o=;\n\t7:0BAtYr+8BOwhGeutddpsg8PgU5i0C2D8E797sQnquQUsI2TJq2KKYt229cMcdMbguTtSV/OTgZ4MummbHRfD0H82kwj5TEluUoy28YgBBJSf5la0Zogjw+mRQfAi1r7sKli58mAS4fnRa9+0gsInjxQBKB+6+hC8Jyu6tYR6Me1awMRnKXCTQNMpTDKPv3QLc/IA3HPaAiRL6UKQNf9VqHa70OA4ftl6IySpzlSxqY+tAaYyyMzdJwkMzOPzd6Ll"
        ],
        "X-MS-TrafficTypeDiagnostic": "CY4PR0701MB3634:",
        "X-Microsoft-Antispam-PRVS": "<CY4PR0701MB36342D989E55FA97F15C8F66F0500@CY4PR0701MB3634.namprd07.prod.outlook.com>",
        "X-Exchange-Antispam-Report-Test": "UriScan:;",
        "X-MS-Exchange-SenderADCheck": "1",
        "X-Exchange-Antispam-Report-CFA-Test": "BCL:0; PCL:0;\n\tRULEID:(8211001083)(6040522)(2401047)(8121501046)(5005006)(10201501046)(3002001)(93006095)(3231311)(944501410)(52105095)(149027)(150027)(6041310)(20161123564045)(20161123562045)(20161123558120)(20161123560045)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(6072148)(201708071742011)(7699016);\n\tSRVR:CY4PR0701MB3634; BCL:0; PCL:0; RULEID:; SRVR:CY4PR0701MB3634; ",
        "X-Forefront-PRVS": "074040B844",
        "X-Forefront-Antispam-Report": "SFV:NSPM;\n\tSFS:(10009020)(366004)(136003)(346002)(396003)(39850400004)(376002)(199004)(189003)(69596002)(25786009)(6512007)(316002)(6116002)(3846002)(55236004)(7736002)(305945005)(26005)(4326008)(107886003)(53936002)(16526019)(186003)(16586007)(97736004)(478600001)(6486002)(72206003)(2351001)(48376002)(8676002)(47776003)(2361001)(66066001)(50466002)(36756003)(106356001)(81156014)(81166006)(53416004)(105586002)(11346002)(486006)(68736007)(5660300001)(446003)(476003)(2616005)(956004)(14444005)(44832011)(42882007)(76176011)(6506007)(6666003)(6916009)(8936002)(386003)(51416003)(50226002)(2906002)(52116002);\n\tDIR:OUT; SFP:1101; SCL:1; SRVR:CY4PR0701MB3634;\n\tH:hyd1sverma-dt.caveonetworks.com; FPR:; SPF:None; LANG:en;\n\tPTR:InfoNoRecords; A:1; MX:1; ",
        "Received-SPF": "None (protection.outlook.com: cavium.com does not designate\n\tpermitted sender hosts)",
        "X-Microsoft-Antispam-Message-Info": "Y8F84lcEsbO/WJtNiLU6Q/JvKxY+PpqNrmXXsH5g0VV0dWsUM0POyb/IPB8pGoGCvvvWDJWLpNuksZA7g3hxsRSZXyFAtcJQk47qylyvk4t+OECQ0vEE+hQtjpyNveTWUkWkCddZWqMZGpnRvFLffMARqGqaqFkxiaJhILQ0aGCKCra2ogq3EuSbaLd863e7Yj2X2083pJeKvmoToQxrl0Iqa0DVEpKEmv/PiLsYHvAQeO/nWPS5jpJOfdNyp3dTwxjE0E25F33m+mIz2OtXh9+mEOMhz2z9hsskY/8lt8IOU8tLRMV+qiFV31d0uR2eieez87uYQ/hXViBm/Dqo0bg9VsF6ntoZDbh1ix8F3VE=",
        "SpamDiagnosticOutput": "1:99",
        "SpamDiagnosticMetadata": "NSPM",
        "X-OriginatorOrg": "caviumnetworks.com",
        "X-MS-Exchange-CrossTenant-OriginalArrivalTime": "21 Jul 2018 18:18:29.5401\n\t(UTC)",
        "X-MS-Exchange-CrossTenant-Network-Message-Id": "4dc49347-2ff8-49db-8ae5-08d5ef365d71",
        "X-MS-Exchange-CrossTenant-FromEntityHeader": "Hosted",
        "X-MS-Exchange-CrossTenant-Id": "711e4ccf-2e9b-4bcf-a551-4094005b6194",
        "X-MS-Exchange-Transport-CrossTenantHeadersStamped": "CY4PR0701MB3634",
        "Subject": "[dpdk-dev] [PATCH v3 4/5] compress/zlib: support burst\n\tenqueue/dequeue",
        "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": "From: Sunila Sahu <ssahu@caviumnetworks.com>\n\nSigned-off-by: Sunila Sahu <sunila.sahu@caviumnetworks.com>\nSigned-off-by: Shally Verma <shally.verma@caviumnetworks.com>\nSigned-off-by: Ashish Gupta <ashish.gupta@caviumnetworks.com>\n---\n drivers/compress/zlib/zlib_pmd.c | 254 ++++++++++++++++++++++++++++++++++++++-\n 1 file changed, 253 insertions(+), 1 deletion(-)",
    "diff": "diff --git a/drivers/compress/zlib/zlib_pmd.c b/drivers/compress/zlib/zlib_pmd.c\nindex 9a464ee..44baa67 100644\n--- a/drivers/compress/zlib/zlib_pmd.c\n+++ b/drivers/compress/zlib/zlib_pmd.c\n@@ -7,7 +7,213 @@\n \n #include \"zlib_pmd_private.h\"\n \n-/** Parse comp xform and set private xform/stream parameters */\n+/** Compute next mbuf in the list, assign data buffer and length,\n+ *  returns 0 if mbuf is NULL\n+ */\n+#define COMPUTE_BUF(mbuf, data, len)\t\t\\\n+\t\t((mbuf = mbuf->next) ?\t\t\\\n+\t\t(data = rte_pktmbuf_mtod(mbuf, uint8_t *)),\t\\\n+\t\t(len = rte_pktmbuf_data_len(mbuf)) : 0)\n+\n+static void\n+process_zlib_deflate(struct rte_comp_op *op, z_stream *strm)\n+{\n+\tint ret, flush, fin_flush;\n+\tstruct rte_mbuf *mbuf_src = op->m_src;\n+\tstruct rte_mbuf *mbuf_dst = op->m_dst;\n+\n+\tswitch (op->flush_flag) {\n+\tcase RTE_COMP_FLUSH_FULL:\n+\tcase RTE_COMP_FLUSH_FINAL:\n+\t\tfin_flush = Z_FINISH;\n+\t\tbreak;\n+\tdefault:\n+\t\top->status = RTE_COMP_OP_STATUS_INVALID_ARGS;\n+\t\tZLIB_PMD_ERR(\"Invalid flush value\\n\");\n+\t}\n+\n+\tif (unlikely(!strm)) {\n+\t\top->status = RTE_COMP_OP_STATUS_INVALID_ARGS;\n+\t\tZLIB_PMD_ERR(\"Invalid z_stream\\n\");\n+\t\treturn;\n+\t}\n+\t/* Update z_stream with the inputs provided by application */\n+\tstrm->next_in = rte_pktmbuf_mtod_offset(mbuf_src, uint8_t *,\n+\t\t\top->src.offset);\n+\n+\tstrm->avail_in = rte_pktmbuf_data_len(mbuf_src) - op->src.offset;\n+\n+\tstrm->next_out = rte_pktmbuf_mtod_offset(mbuf_dst, uint8_t *,\n+\t\t\top->dst.offset);\n+\n+\tstrm->avail_out = rte_pktmbuf_data_len(mbuf_dst) - op->dst.offset;\n+\n+\t/* Set flush value to NO_FLUSH unless it is last mbuf */\n+\tflush = Z_NO_FLUSH;\n+\t/* Initialize status to SUCCESS */\n+\top->status = RTE_COMP_OP_STATUS_SUCCESS;\n+\n+\tdo {\n+\t\t/* Set flush value to Z_FINISH for last block */\n+\t\tif ((op->src.length - strm->total_in) <= strm->avail_in) {\n+\t\t\tstrm->avail_in = (op->src.length - strm->total_in);\n+\t\t\tflush = fin_flush;\n+\t\t}\n+\t\tdo {\n+\t\t\tret = deflate(strm, flush);\n+\t\t\tif (unlikely(ret == Z_STREAM_ERROR)) {\n+\t\t\t\t/* error return, do not process further */\n+\t\t\t\top->status =  RTE_COMP_OP_STATUS_ERROR;\n+\t\t\t\tgoto def_end;\n+\t\t\t}\n+\t\t\t/* Break if Z_STREAM_END is encountered */\n+\t\t\tif (ret == Z_STREAM_END)\n+\t\t\t\tgoto def_end;\n+\n+\t\t/* Keep looping until input mbuf is consumed.\n+\t\t * Exit if destination mbuf gets exhausted.\n+\t\t */\n+\t\t} while ((strm->avail_out == 0) &&\n+\t\t\tCOMPUTE_BUF(mbuf_dst, strm->next_out, strm->avail_out));\n+\n+\t\tif (!strm->avail_out) {\n+\t\t\t/* there is no space for compressed output */\n+\t\t\top->status = RTE_COMP_OP_STATUS_OUT_OF_SPACE_TERMINATED;\n+\t\t\tbreak;\n+\t\t}\n+\n+\t/* Update source buffer to next mbuf\n+\t * Exit if input buffers are fully consumed\n+\t */\n+\t} while (COMPUTE_BUF(mbuf_src, strm->next_in, strm->avail_in));\n+\n+def_end:\n+\t/* Update op stats */\n+\tswitch (op->status) {\n+\tcase RTE_COMP_OP_STATUS_SUCCESS:\n+\t\top->consumed += strm->total_in;\n+\tcase RTE_COMP_OP_STATUS_OUT_OF_SPACE_TERMINATED:\n+\t\top->produced += strm->total_out;\n+\t\tbreak;\n+\tdefault:\n+\t\tZLIB_PMD_ERR(\"stats not updated for status:%d\\n\",\n+\t\t\t\top->status);\n+\t}\n+\n+\tdeflateReset(strm);\n+}\n+\n+static void\n+process_zlib_inflate(struct rte_comp_op *op, z_stream *strm)\n+{\n+\tint ret, flush;\n+\tstruct rte_mbuf *mbuf_src = op->m_src;\n+\tstruct rte_mbuf *mbuf_dst = op->m_dst;\n+\n+\tif (unlikely(!strm)) {\n+\t\top->status = RTE_COMP_OP_STATUS_INVALID_ARGS;\n+\t\tZLIB_PMD_ERR(\"Invalid z_stream\\n\");\n+\t\treturn;\n+\t}\n+\tstrm->next_in = rte_pktmbuf_mtod_offset(mbuf_src, uint8_t *,\n+\t\t\top->src.offset);\n+\n+\tstrm->avail_in = rte_pktmbuf_data_len(mbuf_src) - op->src.offset;\n+\n+\tstrm->next_out = rte_pktmbuf_mtod_offset(mbuf_dst, uint8_t *,\n+\t\t\top->dst.offset);\n+\n+\tstrm->avail_out = rte_pktmbuf_data_len(mbuf_dst) - op->dst.offset;\n+\n+\t/** Ignoring flush value provided from application for decompression */\n+\tflush = Z_NO_FLUSH;\n+\t/* initialize status to SUCCESS */\n+\top->status = RTE_COMP_OP_STATUS_SUCCESS;\n+\n+\tdo {\n+\t\tdo {\n+\t\t\tret = inflate(strm, flush);\n+\n+\t\t\tswitch (ret) {\n+\t\t\t/* Fall-through */\n+\t\t\tcase Z_NEED_DICT:\n+\t\t\t\tret = Z_DATA_ERROR;\n+\t\t\t/* Fall-through */\n+\t\t\tcase Z_DATA_ERROR:\n+\t\t\t/* Fall-through */\n+\t\t\tcase Z_MEM_ERROR:\n+\t\t\t/* Fall-through */\n+\t\t\tcase Z_STREAM_ERROR:\n+\t\t\t\top->status = RTE_COMP_OP_STATUS_ERROR;\n+\t\t\t/* Fall-through */\n+\t\t\tcase Z_STREAM_END:\n+\t\t\t\t/* no further computation needed if\n+\t\t\t\t * Z_STREAM_END is encountered\n+\t\t\t\t */\n+\t\t\t\tgoto inf_end;\n+\t\t\tdefault:\n+\t\t\t\t/* success */\n+\t\t\t\tbreak;\n+\n+\t\t\t}\n+\t\t/* Keep looping until input mbuf is consumed.\n+\t\t * Exit if destination mbuf gets exhausted.\n+\t\t */\n+\t\t} while ((strm->avail_out == 0) &&\n+\t\t\tCOMPUTE_BUF(mbuf_dst, strm->next_out, strm->avail_out));\n+\n+\t\tif (!strm->avail_out) {\n+\t\t\t/* there is no more space for decompressed output */\n+\t\t\top->status = RTE_COMP_OP_STATUS_OUT_OF_SPACE_TERMINATED;\n+\t\t\tbreak;\n+\t\t}\n+\t/* Read next input buffer to be processed, exit if compressed\n+\t * blocks are fully read\n+\t */\n+\t} while (COMPUTE_BUF(mbuf_src, strm->next_in, strm->avail_in));\n+\n+inf_end:\n+\t/* Update op stats */\n+\tswitch (op->status) {\n+\tcase RTE_COMP_OP_STATUS_SUCCESS:\n+\t\top->consumed += strm->total_in;\n+\t/* Fall-through */\n+\tcase RTE_COMP_OP_STATUS_OUT_OF_SPACE_TERMINATED:\n+\t\top->produced += strm->total_out;\n+\t\tbreak;\n+\tdefault:\n+\t\tZLIB_PMD_ERR(\"stats not produced for status:%d\\n\",\n+\t\t\t\top->status);\n+\t}\n+\n+\tinflateReset(strm);\n+}\n+\n+/** Process comp operation for mbuf */\n+static inline int\n+process_zlib_op(struct zlib_qp *qp, struct rte_comp_op *op)\n+{\n+\tstruct zlib_stream *stream;\n+\tstruct zlib_priv_xform *private_xform;\n+\n+\tif ((op->op_type == RTE_COMP_OP_STATEFUL) ||\n+\t    (op->src.offset > rte_pktmbuf_data_len(op->m_src)) ||\n+\t    (op->dst.offset > rte_pktmbuf_data_len(op->m_dst))) {\n+\t\top->status = RTE_COMP_OP_STATUS_INVALID_ARGS;\n+\t\tZLIB_PMD_ERR(\"Invalid source or destination buffers or \"\n+\t\t\t     \"invalid Operation requested\\n\");\n+\t} else {\n+\t\tprivate_xform = (struct zlib_priv_xform *)op->private_xform;\n+\t\tstream = &private_xform->stream;\n+\t\tstream->comp(op, &stream->strm);\n+\t}\n+\t/* whatever is out of op, put it into completion queue with\n+\t * its status\n+\t */\n+\treturn rte_ring_enqueue(qp->processed_pkts, (void *)op);\n+}\n+\n+/** Parse comp xform and set private xform/Stream parameters */\n int\n zlib_set_stream_parameters(const struct rte_comp_xform *xform,\n \t\tstruct zlib_stream *stream)\n@@ -22,6 +228,8 @@ zlib_set_stream_parameters(const struct rte_comp_xform *xform,\n \n \tswitch (xform->type) {\n \tcase RTE_COMP_COMPRESS:\n+\t\tstream->comp = process_zlib_deflate;\n+\t\tstream->free = deflateEnd;\n \t\t/** Compression window bits */\n \t\tswitch (xform->compress.algo) {\n \t\tcase RTE_COMP_ALGO_DEFLATE:\n@@ -79,6 +287,8 @@ zlib_set_stream_parameters(const struct rte_comp_xform *xform,\n \tbreak;\n \n \tcase RTE_COMP_DECOMPRESS:\n+\t\tstream->comp = process_zlib_inflate;\n+\t\tstream->free = inflateEnd;\n \t\t/** window bits */\n \t\tswitch (xform->decompress.algo) {\n \t\tcase RTE_COMP_ALGO_DEFLATE:\n@@ -100,6 +310,44 @@ zlib_set_stream_parameters(const struct rte_comp_xform *xform,\n \treturn 0;\n }\n \n+static uint16_t\n+zlib_pmd_enqueue_burst(void *queue_pair,\n+\t\t\tstruct rte_comp_op **ops, uint16_t nb_ops)\n+{\n+\tstruct zlib_qp *qp = queue_pair;\n+\tint ret;\n+\tuint16_t i;\n+\tuint16_t enqd = 0;\n+\tfor (i = 0; i < nb_ops; i++) {\n+\t\tret = process_zlib_op(qp, ops[i]);\n+\t\tif (unlikely(ret < 0)) {\n+\t\t\t/* increment count if failed to push to completion\n+\t\t\t * queue\n+\t\t\t */\n+\t\t\tqp->qp_stats.enqueue_err_count++;\n+\t\t} else {\n+\t\t\tqp->qp_stats.enqueued_count++;\n+\t\t\tenqd++;\n+\t\t}\n+\t}\n+\treturn enqd;\n+}\n+\n+static uint16_t\n+zlib_pmd_dequeue_burst(void *queue_pair,\n+\t\t\tstruct rte_comp_op **ops, uint16_t nb_ops)\n+{\n+\tstruct zlib_qp *qp = queue_pair;\n+\n+\tunsigned int nb_dequeued = 0;\n+\n+\tnb_dequeued = rte_ring_dequeue_burst(qp->processed_pkts,\n+\t\t\t(void **)ops, nb_ops, NULL);\n+\tqp->qp_stats.dequeued_count += nb_dequeued;\n+\n+\treturn nb_dequeued;\n+}\n+\n static int\n zlib_create(const char *name,\n \t\tstruct rte_vdev_device *vdev,\n@@ -116,6 +364,10 @@ zlib_create(const char *name,\n \n \tdev->dev_ops = rte_zlib_pmd_ops;\n \n+\t/* register rx/tx burst functions for data path */\n+\tdev->dequeue_burst = zlib_pmd_dequeue_burst;\n+\tdev->enqueue_burst = zlib_pmd_enqueue_burst;\n+\n \treturn 0;\n }\n \n",
    "prefixes": [
        "v3",
        "4/5"
    ]
}