get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 107859,
    "url": "http://patches.dpdk.org/api/patches/107859/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/20220220034409.2226860-4-akozyrev@nvidia.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": "<20220220034409.2226860-4-akozyrev@nvidia.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20220220034409.2226860-4-akozyrev@nvidia.com",
    "date": "2022-02-20T03:44:01",
    "name": "[v8,03/11] ethdev: bring in async queue-based flow rules operations",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "29cecc2f3c4dea2ac42db2173070aaec96aa48de",
    "submitter": {
        "id": 1873,
        "url": "http://patches.dpdk.org/api/people/1873/?format=api",
        "name": "Alexander Kozyrev",
        "email": "akozyrev@nvidia.com"
    },
    "delegate": {
        "id": 319,
        "url": "http://patches.dpdk.org/api/users/319/?format=api",
        "username": "fyigit",
        "first_name": "Ferruh",
        "last_name": "Yigit",
        "email": "ferruh.yigit@amd.com"
    },
    "mbox": "http://patches.dpdk.org/project/dpdk/patch/20220220034409.2226860-4-akozyrev@nvidia.com/mbox/",
    "series": [
        {
            "id": 21750,
            "url": "http://patches.dpdk.org/api/series/21750/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=21750",
            "date": "2022-02-20T03:43:58",
            "name": "ethdev: datapath-focused flow rules management",
            "version": 8,
            "mbox": "http://patches.dpdk.org/series/21750/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/107859/comments/",
    "check": "success",
    "checks": "http://patches.dpdk.org/api/patches/107859/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 0C56AA00C2;\n\tSun, 20 Feb 2022 04:44:50 +0100 (CET)",
            "from [217.70.189.124] (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 04CE341147;\n\tSun, 20 Feb 2022 04:44:48 +0100 (CET)",
            "from NAM02-BN1-obe.outbound.protection.outlook.com\n (mail-bn1nam07on2085.outbound.protection.outlook.com [40.107.212.85])\n by mails.dpdk.org (Postfix) with ESMTP id 525DE40395\n for <dev@dpdk.org>; Sun, 20 Feb 2022 04:44:46 +0100 (CET)",
            "from DM6PR12MB2714.namprd12.prod.outlook.com (2603:10b6:5:42::18) by\n BL1PR12MB5286.namprd12.prod.outlook.com (2603:10b6:208:31d::6) with\n Microsoft\n SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id\n 15.20.4995.17; Sun, 20 Feb 2022 03:44:43 +0000",
            "from BN9PR03CA0986.namprd03.prod.outlook.com (2603:10b6:408:109::31)\n by DM6PR12MB2714.namprd12.prod.outlook.com (2603:10b6:5:42::18) with\n Microsoft SMTP Server (version=TLS1_2,\n cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4995.22; Sun, 20 Feb\n 2022 03:44:40 +0000",
            "from BN8NAM11FT005.eop-nam11.prod.protection.outlook.com\n (2603:10b6:408:109:cafe::6e) by BN9PR03CA0986.outlook.office365.com\n (2603:10b6:408:109::31) with Microsoft SMTP Server (version=TLS1_2,\n cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4995.14 via Frontend\n Transport; Sun, 20 Feb 2022 03:44:41 +0000",
            "from mail.nvidia.com (12.22.5.238) by\n BN8NAM11FT005.mail.protection.outlook.com (10.13.176.69) with Microsoft SMTP\n Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384) id\n 15.20.4995.15 via Frontend Transport; Sun, 20 Feb 2022 03:44:40 +0000",
            "from rnnvmail201.nvidia.com (10.129.68.8) by DRHQMAIL105.nvidia.com\n (10.27.9.14) with Microsoft SMTP Server (TLS) id 15.0.1497.18;\n Sun, 20 Feb 2022 03:44:39 +0000",
            "from pegasus01.mtr.labs.mlnx (10.126.230.35) by\n rnnvmail201.nvidia.com (10.129.68.8) with Microsoft SMTP Server\n (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.986.9;\n Sat, 19 Feb 2022 19:44:36 -0800"
        ],
        "ARC-Seal": "i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none;\n b=UvqYnhz7DBWquLgrQYXH+71yIbghTrbowKBOmwILv1N/jRCdMzkdFiB/87ORMHFajszaxQWyFQnRs9zI87uXSPrakG66xTJvRgB1eUzhvHyssYF47LftvYiR78LC354IRSsgwVkxVccHb6YKa+oUz1NDCdvzsEkFIoNIyY/cVHzEUUZm+T/mgKaEv4ilsObF1plGFYlIsIFAObWxZ5F9kXIbtzOMNIAfh9i2OPOGDqQtVyaoCD8QL6PzfH6wtiCQVzQPa9FPuGwVTwSn9iVtcIQ5nffKEYzpSAJYQLVgdxr7pdlxuNk4B8vY9hj4NVmO/vAbxVgRJsCZs34VfvapPQ==",
        "ARC-Message-Signature": "i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com;\n s=arcselector9901;\n h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1;\n bh=IkEkmU8YA6Dg09C0qWhd2ow3+bonFmhApDcJ1yTyYyk=;\n b=exsVlRYoCcWcZAwEYoQuap6c/F/SJiOGO5WbVN536cxcoSaT+4SQo6ULXstCOKqhywRHSd0fe/+U9Z6uP0za5uKM20JlTWp6ja2QDQFLVHcxdvolIRN6UU+Jf/+tb8mrOwXl/8mdE3Jl6q1tCpSqKhcCogJ6EtS9KTlhH7K4b1rFqMJfUHiLbNmXYanc3m9trxwarDPQBQIWZh55/xNtBlitpGIGgvDSvTSKliIE54KGzUuGSdF2JH/vSdm/7O5DqDaqF0iEt/PdO0Fx3X11Fa9VaJrfA/BIJ2MS0bHXaXwSFdKqCB+5Qw+I8c7YVTVS5KyHTtLC9Lfj8jOWQgmUBg==",
        "ARC-Authentication-Results": "i=1; mx.microsoft.com 1; spf=pass (sender ip is\n 12.22.5.238) smtp.rcpttodomain=intel.com smtp.mailfrom=nvidia.com; dmarc=pass\n (p=reject sp=reject pct=100) action=none header.from=nvidia.com; dkim=none\n (message not signed); arc=none",
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com;\n s=selector2;\n h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck;\n bh=IkEkmU8YA6Dg09C0qWhd2ow3+bonFmhApDcJ1yTyYyk=;\n b=Ob549CPLzLmpZfUQyCzw7Rc+9WHMrQ6vCBvjAUTdHybCosS7ckqKEO862lKbbtW5ARlVR7YIrXRz24cHkTYaNSC0c+RQgzMS8avmwLIyCSRXm4NZiBTld0tdONK0X33rDIYrSiTHItqySMcjNc97efP51MSaQmwC1/0p8s7J8Yoso7PC1hEqTeUITnmvSzPK6bZtGVPqpsweLXfedc+c1Z7ThXvwBjbRSqSwbZQHgi5c3Kap3LwBfpBhT8URI3gkwg7HQQT78dE+VgHBWS7y0r3kyCv+6FvF+UuoVrKMS6VIVz91BupTgA2Jt/rBYQeLYzD76PxazbrJy4Vez411wA==",
        "X-MS-Exchange-Authentication-Results": "spf=pass (sender IP is 12.22.5.238)\n smtp.mailfrom=nvidia.com; dkim=none (message not signed)\n header.d=none;dmarc=pass action=none header.from=nvidia.com;",
        "Received-SPF": "Pass (protection.outlook.com: domain of nvidia.com designates\n 12.22.5.238 as permitted sender) receiver=protection.outlook.com;\n client-ip=12.22.5.238; helo=mail.nvidia.com;",
        "From": "Alexander Kozyrev <akozyrev@nvidia.com>",
        "To": "<dev@dpdk.org>",
        "CC": "<orika@nvidia.com>, <thomas@monjalon.net>, <ivan.malov@oktetlabs.ru>,\n <andrew.rybchenko@oktetlabs.ru>, <ferruh.yigit@intel.com>,\n <mohammad.abdul.awal@intel.com>, <qi.z.zhang@intel.com>,\n <jerinj@marvell.com>, <ajit.khaparde@broadcom.com>,\n <bruce.richardson@intel.com>",
        "Subject": "[PATCH v8 03/11] ethdev: bring in async queue-based flow rules\n operations",
        "Date": "Sun, 20 Feb 2022 05:44:01 +0200",
        "Message-ID": "<20220220034409.2226860-4-akozyrev@nvidia.com>",
        "X-Mailer": "git-send-email 2.18.2",
        "In-Reply-To": "<20220220034409.2226860-1-akozyrev@nvidia.com>",
        "References": "<20220219041144.2145380-1-akozyrev@nvidia.com>\n <20220220034409.2226860-1-akozyrev@nvidia.com>",
        "MIME-Version": "1.0",
        "Content-Type": "text/plain",
        "X-Originating-IP": "[10.126.230.35]",
        "X-ClientProxiedBy": "rnnvmail202.nvidia.com (10.129.68.7) To\n rnnvmail201.nvidia.com (10.129.68.8)",
        "X-EOPAttributedMessage": "0",
        "X-MS-PublicTrafficType": "Email",
        "X-MS-Office365-Filtering-Correlation-Id": "769d28a3-dbac-42d7-349e-08d9f4235364",
        "X-MS-TrafficTypeDiagnostic": "DM6PR12MB2714:EE_|BL1PR12MB5286:EE_",
        "X-LD-Processed": "43083d15-7273-40c1-b7db-39efd9ccc17a,ExtAddr,ExtAddr",
        "X-Microsoft-Antispam-PRVS": "\n <DM6PR12MB2714A38E0D3808561AAF35B7AF399@DM6PR12MB2714.namprd12.prod.outlook.com>",
        "X-MS-Exchange-SenderADCheck": "1",
        "X-MS-Exchange-AntiSpam-Relay": "0",
        "X-Microsoft-Antispam": "BCL:0;",
        "X-Microsoft-Antispam-Message-Info": "\n K4ib6Ik2yNuSEPwCSgqXSeOaDFn0BNgM4kQWYUEq2HPGYaNm/8rRWTgEzL+hSm9hEr8Wn5z5rcf4G6Bdvcq8PejxL/pYDvJM0oM3VyFOi6Pv+KYkVDw7yUgwBUiesjt5ZMAn49Cb6TzW3b6yBfMZCf5D26C/dBnoiQD/th5IC0zu8uKkcUTQmcoOMwuGxwuPnOo2yBi7+sFB38j71az9kDFnI3mxdRrgmjYeZi2SHNt+rSoKAJ6vtTsx5F06wZJNSqsrkIEXFkTyRwqVEmG0f1AR3p/lxv+dIxCtzaQCp7R1PUEyJjFGYDbOZ79H99Zj8QqEGTlbCGxs0cf1xXLXq+VB6NSUr1LjKVMpBdwYMjQGAfh6bRpAoOw3a5y/6SV+hBkrf/Mj9yjGqh5axBsR+Ih6dKbZCUJxdVaGbWKaC+G/o3YsPv4sgsA9t5UIWWOIeEdne4JeIJEWqw82kwV1x2F5UQDNs3uTO95OhOUJMfJpxgP4/dr0GbLJ8Cr6EOydq/6jP1tT6hTpjTYbd2i+xMzduUCiqtB+5yA8QD1jUjGeOSaNJd+/8lyBvE+om52QAtxxRUi0VNaERnKFA9G13Zz6D4rJ6yymmFjKr36HCg1lBxHq9KKL2f7M03sUQNFIud2yZ/VQorR1sYQOMKBeDwtDprJCFqVkoR8EZhPQ0ZQk+kJ62n7U9jUbTNYOZPb8XEb7DsFP0SXKH8e9iohr7T7FHSCL+ZhvxQwzkmI8DGXqpD9b/xO+P20wSBUscL8BlYTtJHV2epoQGB/oRaso3nZnqMrzrBPHgFRt4qTtY3A4YjvKpxx3vdkjTP+DrE+3YBpEaeOnwN48gQtDGL+/WavNZ/PAgnVrUmxr9VDnPgk=",
        "X-Forefront-Antispam-Report": "CIP:12.22.5.238; CTRY:US; LANG:en; SCL:1; SRV:;\n IPV:CAL; SFV:NSPM; H:mail.nvidia.com; PTR:InfoNoRecords; CAT:NONE;\n SFS:(13230001)(4636009)(36840700001)(46966006)(40470700004)(186003)(26005)(16526019)(426003)(336012)(47076005)(40460700003)(1076003)(2616005)(356005)(81166007)(36756003)(2906002)(5660300002)(19273905006)(8936002)(7416002)(30864003)(508600001)(70586007)(70206006)(4326008)(82310400004)(6666004)(8676002)(83380400001)(36860700001)(86362001)(316002)(6916009)(54906003)(36900700001)(579004)(563064011);\n DIR:OUT; SFP:1101;",
        "X-OriginatorOrg": "Nvidia.com",
        "X-MS-Exchange-CrossTenant-OriginalArrivalTime": "20 Feb 2022 03:44:40.7244 (UTC)",
        "X-MS-Exchange-CrossTenant-Network-Message-Id": "\n 769d28a3-dbac-42d7-349e-08d9f4235364",
        "X-MS-Exchange-CrossTenant-Id": "43083d15-7273-40c1-b7db-39efd9ccc17a",
        "X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp": "\n TenantId=43083d15-7273-40c1-b7db-39efd9ccc17a; Ip=[12.22.5.238];\n Helo=[mail.nvidia.com]",
        "X-MS-Exchange-CrossTenant-FromEntityHeader": "HybridOnPrem",
        "X-MS-Exchange-CrossTenant-AuthSource": "\n BN8NAM11FT005.eop-nam11.prod.protection.outlook.com",
        "X-MS-Exchange-CrossTenant-AuthAs": "Anonymous",
        "X-MS-Exchange-Transport-CrossTenantHeadersStamped": "BL1PR12MB5286",
        "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": "A new, faster, queue-based flow rules management mechanism is needed for\napplications offloading rules inside the datapath. This asynchronous\nand lockless mechanism frees the CPU for further packet processing and\nreduces the performance impact of the flow rules creation/destruction\non the datapath. Note that queues are not thread-safe and the queue\nshould be accessed from the same thread for all queue operations.\nIt is the responsibility of the app to sync the queue functions in case\nof multi-threaded access to the same queue.\n\nThe rte_flow_async_create() function enqueues a flow creation to the\nrequested queue. It benefits from already configured resources and sets\nunique values on top of item and action templates. A flow rule is enqueued\non the specified flow queue and offloaded asynchronously to the hardware.\nThe function returns immediately to spare CPU for further packet\nprocessing. The application must invoke the rte_flow_pull() function\nto complete the flow rule operation offloading, to clear the queue, and to\nreceive the operation status. The rte_flow_async_destroy() function\nenqueues a flow destruction to the requested queue.\n\nSigned-off-by: Alexander Kozyrev <akozyrev@nvidia.com>\nAcked-by: Ori Kam <orika@nvidia.com>\n---\n .../prog_guide/img/rte_flow_async_init.svg    | 205 ++++++++++\n .../prog_guide/img/rte_flow_async_usage.svg   | 354 ++++++++++++++++++\n doc/guides/prog_guide/rte_flow.rst            | 124 ++++++\n doc/guides/rel_notes/release_22_03.rst        |   7 +\n lib/ethdev/rte_flow.c                         | 110 +++++-\n lib/ethdev/rte_flow.h                         | 251 +++++++++++++\n lib/ethdev/rte_flow_driver.h                  |  35 ++\n lib/ethdev/version.map                        |   4 +\n 8 files changed, 1087 insertions(+), 3 deletions(-)\n create mode 100644 doc/guides/prog_guide/img/rte_flow_async_init.svg\n create mode 100644 doc/guides/prog_guide/img/rte_flow_async_usage.svg",
    "diff": "diff --git a/doc/guides/prog_guide/img/rte_flow_async_init.svg b/doc/guides/prog_guide/img/rte_flow_async_init.svg\nnew file mode 100644\nindex 0000000000..f66e9c73d7\n--- /dev/null\n+++ b/doc/guides/prog_guide/img/rte_flow_async_init.svg\n@@ -0,0 +1,205 @@\n+<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n+<!-- SPDX-License-Identifier: BSD-3-Clause -->\n+\n+<!-- Copyright(c) 2022 NVIDIA Corporation & Affiliates -->\n+\n+<svg\n+   width=\"485\"\n+   height=\"535\"\n+   overflow=\"hidden\"\n+   version=\"1.1\"\n+   id=\"svg61\"\n+   sodipodi:docname=\"rte_flow_async_init.svg\"\n+   inkscape:version=\"1.1.1 (3bf5ae0d25, 2021-09-20)\"\n+   xmlns:inkscape=\"http://www.inkscape.org/namespaces/inkscape\"\n+   xmlns:sodipodi=\"http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd\"\n+   xmlns=\"http://www.w3.org/2000/svg\"\n+   xmlns:svg=\"http://www.w3.org/2000/svg\">\n+  <sodipodi:namedview\n+     id=\"namedview63\"\n+     pagecolor=\"#ffffff\"\n+     bordercolor=\"#666666\"\n+     borderopacity=\"1.0\"\n+     inkscape:pageshadow=\"2\"\n+     inkscape:pageopacity=\"0.0\"\n+     inkscape:pagecheckerboard=\"0\"\n+     showgrid=\"false\"\n+     inkscape:zoom=\"1.517757\"\n+     inkscape:cx=\"242.79249\"\n+     inkscape:cy=\"267.17057\"\n+     inkscape:window-width=\"2400\"\n+     inkscape:window-height=\"1271\"\n+     inkscape:window-x=\"2391\"\n+     inkscape:window-y=\"-9\"\n+     inkscape:window-maximized=\"1\"\n+     inkscape:current-layer=\"g59\" />\n+  <defs\n+     id=\"defs5\">\n+    <clipPath\n+       id=\"clip0\">\n+      <rect\n+         x=\"0\"\n+         y=\"0\"\n+         width=\"485\"\n+         height=\"535\"\n+         id=\"rect2\" />\n+    </clipPath>\n+  </defs>\n+  <g\n+     clip-path=\"url(#clip0)\"\n+     id=\"g59\">\n+    <rect\n+       x=\"0\"\n+       y=\"0\"\n+       width=\"485\"\n+       height=\"535\"\n+       fill=\"#FFFFFF\"\n+       id=\"rect7\" />\n+    <rect\n+       x=\"0.500053\"\n+       y=\"79.5001\"\n+       width=\"482\"\n+       height=\"59\"\n+       stroke=\"#000000\"\n+       stroke-width=\"1.33333\"\n+       stroke-miterlimit=\"8\"\n+       fill=\"#A6A6A6\"\n+       id=\"rect9\" />\n+    <text\n+       font-family=\"Calibri,Calibri_MSFontService,sans-serif\"\n+       font-weight=\"400\"\n+       font-size=\"24\"\n+       transform=\"translate(121.6 116)\"\n+       id=\"text13\">\n+         rte_eth_dev_configure\n+         <tspan\n+   font-size=\"24\"\n+   x=\"224.007\"\n+   y=\"0\"\n+   id=\"tspan11\">()</tspan></text>\n+    <rect\n+       x=\"0.500053\"\n+       y=\"158.5\"\n+       width=\"482\"\n+       height=\"59\"\n+       stroke=\"#000000\"\n+       stroke-width=\"1.33333\"\n+       stroke-miterlimit=\"8\"\n+       fill=\"#FFFFFF\"\n+       id=\"rect15\" />\n+    <text\n+       font-family=\"Calibri,Calibri_MSFontService,sans-serif\"\n+       font-weight=\"400\"\n+       font-size=\"24\"\n+       transform=\"translate(140.273 195)\"\n+       id=\"text17\">\n+         rte_flow_configure()\n+      </text>\n+    <rect\n+       x=\"0.500053\"\n+       y=\"236.5\"\n+       width=\"482\"\n+       height=\"60\"\n+       stroke=\"#000000\"\n+       stroke-width=\"1.33333\"\n+       stroke-miterlimit=\"8\"\n+       fill=\"#FFFFFF\"\n+       id=\"rect19\" />\n+    <text\n+       font-family=\"Calibri, Calibri_MSFontService, sans-serif\"\n+       font-weight=\"400\"\n+       font-size=\"24px\"\n+       id=\"text21\"\n+       x=\"63.425903\"\n+       y=\"274\">rte_flow_pattern_template_create()</text>\n+    <rect\n+       x=\"0.500053\"\n+       y=\"316.5\"\n+       width=\"482\"\n+       height=\"59\"\n+       stroke=\"#000000\"\n+       stroke-width=\"1.33333\"\n+       stroke-miterlimit=\"8\"\n+       fill=\"#FFFFFF\"\n+       id=\"rect23\" />\n+    <text\n+       font-family=\"Calibri, Calibri_MSFontService, sans-serif\"\n+       font-weight=\"400\"\n+       font-size=\"24px\"\n+       id=\"text27\"\n+       x=\"69.379204\"\n+       y=\"353\">rte_flow_actions_template_create()</text>\n+    <rect\n+       x=\"0.500053\"\n+       y=\"0.500053\"\n+       width=\"482\"\n+       height=\"60\"\n+       stroke=\"#000000\"\n+       stroke-width=\"1.33333\"\n+       stroke-miterlimit=\"8\"\n+       fill=\"#A6A6A6\"\n+       id=\"rect29\" />\n+    <text\n+       font-family=\"Calibri, Calibri_MSFontService, sans-serif\"\n+       font-weight=\"400\"\n+       font-size=\"24px\"\n+       transform=\"translate(177.233,37)\"\n+       id=\"text33\">rte_eal_init()</text>\n+    <path\n+       d=\"M2-1.09108e-05 2.00005 9.2445-1.99995 9.24452-2 1.09108e-05ZM6.00004 7.24448 0.000104987 19.2445-5.99996 7.24455Z\"\n+       transform=\"matrix(-1 0 0 1 241 60)\"\n+       id=\"path35\" />\n+    <path\n+       d=\"M2-1.08133e-05 2.00005 9.41805-1.99995 9.41807-2 1.08133e-05ZM6.00004 7.41802 0.000104987 19.4181-5.99996 7.41809Z\"\n+       transform=\"matrix(-1 0 0 1 241 138)\"\n+       id=\"path37\" />\n+    <path\n+       d=\"M2-1.09108e-05 2.00005 9.2445-1.99995 9.24452-2 1.09108e-05ZM6.00004 7.24448 0.000104987 19.2445-5.99996 7.24455Z\"\n+       transform=\"matrix(-1 0 0 1 241 217)\"\n+       id=\"path39\" />\n+    <rect\n+       x=\"0.500053\"\n+       y=\"395.5\"\n+       width=\"482\"\n+       height=\"59\"\n+       stroke=\"#000000\"\n+       stroke-width=\"1.33333\"\n+       stroke-miterlimit=\"8\"\n+       fill=\"#FFFFFF\"\n+       id=\"rect41\" />\n+    <text\n+       font-family=\"Calibri, Calibri_MSFontService, sans-serif\"\n+       font-weight=\"400\"\n+       font-size=\"24px\"\n+       id=\"text47\"\n+       x=\"76.988998\"\n+       y=\"432\">rte_flow_template_table_create()</text>\n+    <path\n+       d=\"M2-1.05859e-05 2.00005 9.83526-1.99995 9.83529-2 1.05859e-05ZM6.00004 7.83524 0.000104987 19.8353-5.99996 7.83531Z\"\n+       transform=\"matrix(-1 0 0 1 241 296)\"\n+       id=\"path49\" />\n+    <path\n+       d=\"M243 375 243 384.191 239 384.191 239 375ZM247 382.191 241 394.191 235 382.191Z\"\n+       id=\"path51\" />\n+    <rect\n+       x=\"0.500053\"\n+       y=\"473.5\"\n+       width=\"482\"\n+       height=\"60\"\n+       stroke=\"#000000\"\n+       stroke-width=\"1.33333\"\n+       stroke-miterlimit=\"8\"\n+       fill=\"#A6A6A6\"\n+       id=\"rect53\" />\n+    <text\n+       font-family=\"Calibri, Calibri_MSFontService, sans-serif\"\n+       font-weight=\"400\"\n+       font-size=\"24px\"\n+       id=\"text55\"\n+       x=\"149.30299\"\n+       y=\"511\">rte_eth_dev_start()</text>\n+    <path\n+       d=\"M245 454 245 463.191 241 463.191 241 454ZM249 461.191 243 473.191 237 461.191Z\"\n+       id=\"path57\" />\n+  </g>\n+</svg>\ndiff --git a/doc/guides/prog_guide/img/rte_flow_async_usage.svg b/doc/guides/prog_guide/img/rte_flow_async_usage.svg\nnew file mode 100644\nindex 0000000000..bb978bca1e\n--- /dev/null\n+++ b/doc/guides/prog_guide/img/rte_flow_async_usage.svg\n@@ -0,0 +1,354 @@\n+<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n+<!-- SPDX-License-Identifier: BSD-3-Clause -->\n+\n+<!-- Copyright(c) 2022 NVIDIA Corporation & Affiliates -->\n+\n+<svg\n+   width=\"880\"\n+   height=\"610\"\n+   overflow=\"hidden\"\n+   version=\"1.1\"\n+   id=\"svg103\"\n+   sodipodi:docname=\"rte_flow_async_usage.svg\"\n+   inkscape:version=\"1.1.1 (3bf5ae0d25, 2021-09-20)\"\n+   xmlns:inkscape=\"http://www.inkscape.org/namespaces/inkscape\"\n+   xmlns:sodipodi=\"http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd\"\n+   xmlns=\"http://www.w3.org/2000/svg\"\n+   xmlns:svg=\"http://www.w3.org/2000/svg\">\n+  <sodipodi:namedview\n+     id=\"namedview105\"\n+     pagecolor=\"#ffffff\"\n+     bordercolor=\"#666666\"\n+     borderopacity=\"1.0\"\n+     inkscape:pageshadow=\"2\"\n+     inkscape:pageopacity=\"0.0\"\n+     inkscape:pagecheckerboard=\"0\"\n+     showgrid=\"false\"\n+     inkscape:zoom=\"1.3311475\"\n+     inkscape:cx=\"439.84607\"\n+     inkscape:cy=\"305.37563\"\n+     inkscape:window-width=\"2400\"\n+     inkscape:window-height=\"1271\"\n+     inkscape:window-x=\"-9\"\n+     inkscape:window-y=\"-9\"\n+     inkscape:window-maximized=\"1\"\n+     inkscape:current-layer=\"g101\" />\n+  <defs\n+     id=\"defs5\">\n+    <clipPath\n+       id=\"clip0\">\n+      <rect\n+         x=\"0\"\n+         y=\"0\"\n+         width=\"880\"\n+         height=\"610\"\n+         id=\"rect2\" />\n+    </clipPath>\n+  </defs>\n+  <g\n+     clip-path=\"url(#clip0)\"\n+     id=\"g101\">\n+    <rect\n+       x=\"0\"\n+       y=\"0\"\n+       width=\"880\"\n+       height=\"610\"\n+       fill=\"#FFFFFF\"\n+       id=\"rect7\" />\n+    <rect\n+       x=\"333.5\"\n+       y=\"0.500053\"\n+       width=\"234\"\n+       height=\"45\"\n+       stroke=\"#000000\"\n+       stroke-width=\"1.33333\"\n+       stroke-miterlimit=\"8\"\n+       fill=\"#A6A6A6\"\n+       id=\"rect9\" />\n+    <text\n+       font-family=\"Consolas, Consolas_MSFontService, sans-serif\"\n+       font-weight=\"400\"\n+       font-size=\"19px\"\n+       transform=\"translate(357.196,29)\"\n+       id=\"text11\">rte_eth_rx_burst()</text>\n+    <rect\n+       x=\"333.5\"\n+       y=\"63.5001\"\n+       width=\"234\"\n+       height=\"45\"\n+       stroke=\"#000000\"\n+       stroke-width=\"1.33333\"\n+       stroke-miterlimit=\"8\"\n+       fill=\"#D9D9D9\"\n+       id=\"rect13\" />\n+    <text\n+       font-family=\"Calibri,Calibri_MSFontService,sans-serif\"\n+       font-weight=\"400\"\n+       font-size=\"19\"\n+       transform=\"translate(394.666 91)\"\n+       id=\"text17\">analyze <tspan\n+   font-size=\"19\"\n+   x=\"60.9267\"\n+   y=\"0\"\n+   id=\"tspan15\">packet </tspan></text>\n+    <rect\n+       x=\"587.84119\"\n+       y=\"279.47534\"\n+       width=\"200.65393\"\n+       height=\"46.049305\"\n+       stroke=\"#000000\"\n+       stroke-width=\"1.20888\"\n+       stroke-miterlimit=\"8\"\n+       fill=\"#ffffff\"\n+       id=\"rect19\" />\n+    <text\n+       font-family=\"Calibri, Calibri_MSFontService, sans-serif\"\n+       font-weight=\"400\"\n+       font-size=\"19px\"\n+       id=\"text21\"\n+       x=\"595.42902\"\n+       y=\"308\">rte_flow_async_create()</text>\n+    <path\n+       d=\"M333.5 384 450.5 350.5 567.5 384 450.5 417.5Z\"\n+       stroke=\"#000000\"\n+       stroke-width=\"1.33333\"\n+       stroke-miterlimit=\"8\"\n+       fill=\"#D9D9D9\"\n+       fill-rule=\"evenodd\"\n+       id=\"path23\" />\n+    <text\n+       font-family=\"Calibri,Calibri_MSFontService,sans-serif\"\n+       font-weight=\"400\"\n+       font-size=\"19\"\n+       transform=\"translate(430.069 378)\"\n+       id=\"text27\">more <tspan\n+   font-size=\"19\"\n+   x=\"-12.94\"\n+   y=\"23\"\n+   id=\"tspan25\">packets?</tspan></text>\n+    <path\n+       d=\"M689.249 325.5 689.249 338.402 450.5 338.402 450.833 338.069 450.833 343.971 450.167 343.971 450.167 337.735 688.916 337.735 688.582 338.069 688.582 325.5ZM454.5 342.638 450.5 350.638 446.5 342.638Z\"\n+       id=\"path29\" />\n+    <path\n+       d=\"M450.833 45.5 450.833 56.8197 450.167 56.8197 450.167 45.5001ZM454.5 55.4864 450.5 63.4864 446.5 55.4864Z\"\n+       id=\"path31\" />\n+    <path\n+       d=\"M450.833 108.5 450.833 120.375 450.167 120.375 450.167 108.5ZM454.5 119.041 450.5 127.041 446.5 119.041Z\"\n+       id=\"path33\" />\n+    <path\n+       d=\"M451.833 507.5 451.833 533.61 451.167 533.61 451.167 507.5ZM455.5 532.277 451.5 540.277 447.5 532.277Z\"\n+       id=\"path35\" />\n+    <path\n+       d=\"M0 0.333333-23.9993 0.333333-23.666 0-23.666 141.649-23.9993 141.316 562.966 141.316 562.633 141.649 562.633 124.315 563.299 124.315 563.299 141.983-24.3327 141.983-24.3327-0.333333 0-0.333333ZM558.966 125.649 562.966 117.649 566.966 125.649Z\"\n+       transform=\"matrix(-6.12323e-17 -1 -1 6.12323e-17 451.149 585.466)\"\n+       id=\"path37\" />\n+    <path\n+       d=\"M333.5 160.5 450.5 126.5 567.5 160.5 450.5 194.5Z\"\n+       stroke=\"#000000\"\n+       stroke-width=\"1.33333\"\n+       stroke-miterlimit=\"8\"\n+       fill=\"#D9D9D9\"\n+       fill-rule=\"evenodd\"\n+       id=\"path39\" />\n+    <text\n+       font-family=\"Calibri,Calibri_MSFontService,sans-serif\"\n+       font-weight=\"400\"\n+       font-size=\"19\"\n+       transform=\"translate(417.576 155)\"\n+       id=\"text43\">add new <tspan\n+   font-size=\"19\"\n+   x=\"13.2867\"\n+   y=\"23\"\n+   id=\"tspan41\">rule?</tspan></text>\n+    <path\n+       d=\"M567.5 160.167 689.267 160.167 689.267 273.228 688.6 273.228 688.6 160.5 688.933 160.833 567.5 160.833ZM692.933 271.894 688.933 279.894 684.933 271.894Z\"\n+       id=\"path45\" />\n+    <rect\n+       x=\"602.5\"\n+       y=\"127.5\"\n+       width=\"46\"\n+       height=\"30\"\n+       stroke=\"#000000\"\n+       stroke-width=\"0.666667\"\n+       stroke-miterlimit=\"8\"\n+       fill=\"#D9D9D9\"\n+       id=\"rect47\" />\n+    <text\n+       font-family=\"Calibri,Calibri_MSFontService,sans-serif\"\n+       font-weight=\"400\"\n+       font-size=\"19\"\n+       transform=\"translate(611.34 148)\"\n+       id=\"text49\">yes</text>\n+    <rect\n+       x=\"254.5\"\n+       y=\"126.5\"\n+       width=\"46\"\n+       height=\"31\"\n+       stroke=\"#000000\"\n+       stroke-width=\"0.666667\"\n+       stroke-miterlimit=\"8\"\n+       fill=\"#D9D9D9\"\n+       id=\"rect51\" />\n+    <text\n+       font-family=\"Calibri,Calibri_MSFontService,sans-serif\"\n+       font-weight=\"400\"\n+       font-size=\"19\"\n+       transform=\"translate(267.182 147)\"\n+       id=\"text53\">no</text>\n+    <path\n+       d=\"M0-0.333333 251.563-0.333333 251.563 298.328 8.00002 298.328 8.00002 297.662 251.229 297.662 250.896 297.995 250.896 0 251.229 0.333333 0 0.333333ZM9.33333 301.995 1.33333 297.995 9.33333 293.995Z\"\n+       transform=\"matrix(1 0 0 -1 567.5 383.495)\"\n+       id=\"path55\" />\n+    <path\n+       d=\"M86.5001 213.5 203.5 180.5 320.5 213.5 203.5 246.5Z\"\n+       stroke=\"#000000\"\n+       stroke-width=\"1.33333\"\n+       stroke-miterlimit=\"8\"\n+       fill=\"#D9D9D9\"\n+       fill-rule=\"evenodd\"\n+       id=\"path57\" />\n+    <text\n+       font-family=\"Calibri,Calibri_MSFontService,sans-serif\"\n+       font-weight=\"400\"\n+       font-size=\"19\"\n+       transform=\"translate(159.155 208)\"\n+       id=\"text61\">destroy the <tspan\n+   font-size=\"19\"\n+   x=\"24.0333\"\n+   y=\"23\"\n+   id=\"tspan59\">rule?</tspan></text>\n+    <path\n+       d=\"M0-0.333333 131.029-0.333333 131.029 12.9778 130.363 12.9778 130.363 0 130.696 0.333333 0 0.333333ZM134.696 11.6445 130.696 19.6445 126.696 11.6445Z\"\n+       transform=\"matrix(-1 1.22465e-16 1.22465e-16 1 334.196 160.5)\"\n+       id=\"path63\" />\n+    <rect\n+       x=\"92.600937\"\n+       y=\"280.48242\"\n+       width=\"210.14578\"\n+       height=\"45.035149\"\n+       stroke=\"#000000\"\n+       stroke-width=\"1.24464\"\n+       stroke-miterlimit=\"8\"\n+       fill=\"#ffffff\"\n+       id=\"rect65\" />\n+    <text\n+       font-family=\"Calibri, Calibri_MSFontService, sans-serif\"\n+       font-weight=\"400\"\n+       font-size=\"19px\"\n+       id=\"text67\"\n+       x=\"100.2282\"\n+       y=\"308\">rte_flow_async_destroy()</text>\n+    <path\n+       d=\"M0 0.333333-24.0001 0.333333-23.6667 0-23.6667 49.9498-24.0001 49.6165 121.748 49.6165 121.748 59.958 121.082 59.958 121.082 49.9498 121.415 50.2832-24.3334 50.2832-24.3334-0.333333 0-0.333333ZM125.415 58.6247 121.415 66.6247 117.415 58.6247Z\"\n+       transform=\"matrix(-1 0 0 1 319.915 213.5)\"\n+       id=\"path69\" />\n+    <path\n+       d=\"M86.5001 213.833 62.5002 213.833 62.8335 213.5 62.8335 383.95 62.5002 383.617 327.511 383.617 327.511 384.283 62.1668 384.283 62.1668 213.167 86.5001 213.167ZM326.178 379.95 334.178 383.95 326.178 387.95Z\"\n+       id=\"path71\" />\n+    <path\n+       d=\"M0-0.333333 12.8273-0.333333 12.8273 252.111 12.494 251.778 18.321 251.778 18.321 252.445 12.1607 252.445 12.1607 0 12.494 0.333333 0 0.333333ZM16.9877 248.111 24.9877 252.111 16.9877 256.111Z\"\n+       transform=\"matrix(1.83697e-16 1 1 -1.83697e-16 198.5 325.5)\"\n+       id=\"path73\" />\n+    <rect\n+       x=\"357.15436\"\n+       y=\"540.45984\"\n+       width=\"183.59026\"\n+       height=\"45.08033\"\n+       stroke=\"#000000\"\n+       stroke-width=\"1.25785\"\n+       stroke-miterlimit=\"8\"\n+       fill=\"#ffffff\"\n+       id=\"rect75\" />\n+    <text\n+       font-family=\"Calibri, Calibri_MSFontService, sans-serif\"\n+       font-weight=\"400\"\n+       font-size=\"19px\"\n+       id=\"text77\"\n+       x=\"393.08301\"\n+       y=\"569\">rte_flow_pull()</text>\n+    <rect\n+       x=\"357.15436\"\n+       y=\"462.45984\"\n+       width=\"183.59026\"\n+       height=\"45.08033\"\n+       stroke=\"#000000\"\n+       stroke-width=\"1.25785\"\n+       stroke-miterlimit=\"8\"\n+       fill=\"#ffffff\"\n+       id=\"rect79\" />\n+    <text\n+       font-family=\"Calibri, Calibri_MSFontService, sans-serif\"\n+       font-weight=\"400\"\n+       font-size=\"19px\"\n+       id=\"text81\"\n+       x=\"389.19\"\n+       y=\"491\">rte_flow_push()</text>\n+    <path\n+       d=\"M450.833 417.495 451.402 455.999 450.735 456.008 450.167 417.505ZM455.048 454.611 451.167 462.669 447.049 454.729Z\"\n+       id=\"path83\" />\n+    <rect\n+       x=\"0.500053\"\n+       y=\"287.5\"\n+       width=\"46\"\n+       height=\"30\"\n+       stroke=\"#000000\"\n+       stroke-width=\"0.666667\"\n+       stroke-miterlimit=\"8\"\n+       fill=\"#D9D9D9\"\n+       id=\"rect85\" />\n+    <text\n+       font-family=\"Calibri,Calibri_MSFontService,sans-serif\"\n+       font-weight=\"400\"\n+       font-size=\"19\"\n+       transform=\"translate(12.8617 308)\"\n+       id=\"text87\">no</text>\n+    <rect\n+       x=\"357.5\"\n+       y=\"223.5\"\n+       width=\"47\"\n+       height=\"31\"\n+       stroke=\"#000000\"\n+       stroke-width=\"0.666667\"\n+       stroke-miterlimit=\"8\"\n+       fill=\"#D9D9D9\"\n+       id=\"rect89\" />\n+    <text\n+       font-family=\"Calibri,Calibri_MSFontService,sans-serif\"\n+       font-weight=\"400\"\n+       font-size=\"19\"\n+       transform=\"translate(367.001 244)\"\n+       id=\"text91\">yes</text>\n+    <rect\n+       x=\"469.5\"\n+       y=\"421.5\"\n+       width=\"46\"\n+       height=\"30\"\n+       stroke=\"#000000\"\n+       stroke-width=\"0.666667\"\n+       stroke-miterlimit=\"8\"\n+       fill=\"#D9D9D9\"\n+       id=\"rect93\" />\n+    <text\n+       font-family=\"Calibri,Calibri_MSFontService,sans-serif\"\n+       font-weight=\"400\"\n+       font-size=\"19\"\n+       transform=\"translate(481.872 442)\"\n+       id=\"text95\">no</text>\n+    <rect\n+       x=\"832.5\"\n+       y=\"223.5\"\n+       width=\"46\"\n+       height=\"31\"\n+       stroke=\"#000000\"\n+       stroke-width=\"0.666667\"\n+       stroke-miterlimit=\"8\"\n+       fill=\"#D9D9D9\"\n+       id=\"rect97\" />\n+    <text\n+       font-family=\"Calibri,Calibri_MSFontService,sans-serif\"\n+       font-weight=\"400\"\n+       font-size=\"19\"\n+       transform=\"translate(841.777 244)\"\n+       id=\"text99\">yes</text>\n+  </g>\n+</svg>\ndiff --git a/doc/guides/prog_guide/rte_flow.rst b/doc/guides/prog_guide/rte_flow.rst\nindex 6cdfea09be..436845717f 100644\n--- a/doc/guides/prog_guide/rte_flow.rst\n+++ b/doc/guides/prog_guide/rte_flow.rst\n@@ -3624,12 +3624,16 @@ Expected number of resources in an application allows PMD to prepare\n and optimize NIC hardware configuration and memory layout in advance.\n ``rte_flow_configure()`` must be called before any flow rule is created,\n but after an Ethernet device is configured.\n+It also creates flow queues for asynchronous flow rules operations via\n+queue-based API, see `Asynchronous operations`_ section.\n \n .. code-block:: c\n \n    int\n    rte_flow_configure(uint16_t port_id,\n                       const struct rte_flow_port_attr *port_attr,\n+                      uint16_t nb_queue,\n+                      const struct rte_flow_queue_attr *queue_attr[],\n                       struct rte_flow_error *error);\n \n Information about the number of available resources can be retrieved via\n@@ -3640,6 +3644,7 @@ Information about the number of available resources can be retrieved via\n    int\n    rte_flow_info_get(uint16_t port_id,\n                      struct rte_flow_port_info *port_info,\n+                     struct rte_flow_queue_info *queue_info,\n                      struct rte_flow_error *error);\n \n Flow templates\n@@ -3777,6 +3782,125 @@ and pattern and actions templates are created.\n \t\t\t\t&actions_templates, nb_actions_templ,\n \t\t\t\t&error);\n \n+Asynchronous operations\n+-----------------------\n+\n+Flow rules management can be done via special lockless flow management queues.\n+- Queue operations are asynchronous and not thread-safe.\n+\n+- Operations can thus be invoked by the app's datapath,\n+  packet processing can continue while queue operations are processed by NIC.\n+\n+- Number of flow queues is configured at initialization stage.\n+\n+- Available operation types: rule creation, rule destruction,\n+  indirect rule creation, indirect rule destruction, indirect rule update.\n+\n+- Operations may be reordered within a queue.\n+\n+- Operations can be postponed and pushed to NIC in batches.\n+\n+- Results pulling must be done on time to avoid queue overflows.\n+\n+- User data is returned as part of the result to identify an operation.\n+\n+- Flow handle is valid once the creation operation is enqueued and must be\n+  destroyed even if the operation is not successful and the rule is not inserted.\n+\n+- Application must wait for the creation operation result before enqueueing\n+  the deletion operation to make sure the creation is processed by NIC.\n+\n+The asynchronous flow rule insertion logic can be broken into two phases.\n+\n+1. Initialization stage as shown here:\n+\n+.. _figure_rte_flow_async_init:\n+\n+.. figure:: img/rte_flow_async_init.*\n+\n+2. Main loop as presented on a datapath application example:\n+\n+.. _figure_rte_flow_async_usage:\n+\n+.. figure:: img/rte_flow_async_usage.*\n+\n+Enqueue creation operation\n+~~~~~~~~~~~~~~~~~~~~~~~~~~\n+\n+Enqueueing a flow rule creation operation is similar to simple creation.\n+\n+.. code-block:: c\n+\n+\tstruct rte_flow *\n+\trte_flow_async_create(uint16_t port_id,\n+\t\t\t      uint32_t queue_id,\n+\t\t\t      const struct rte_flow_q_ops_attr *q_ops_attr,\n+\t\t\t      struct rte_flow_template_table *template_table,\n+\t\t\t      const struct rte_flow_item pattern[],\n+\t\t\t      uint8_t pattern_template_index,\n+\t\t\t      const struct rte_flow_action actions[],\n+\t\t\t      uint8_t actions_template_index,\n+\t\t\t      void *user_data,\n+\t\t\t      struct rte_flow_error *error);\n+\n+A valid handle in case of success is returned. It must be destroyed later\n+by calling ``rte_flow_async_destroy()`` even if the rule is rejected by HW.\n+\n+Enqueue destruction operation\n+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n+\n+Enqueueing a flow rule destruction operation is similar to simple destruction.\n+\n+.. code-block:: c\n+\n+\tint\n+\trte_flow_async_destroy(uint16_t port_id,\n+\t\t\t       uint32_t queue_id,\n+\t\t\t       const struct rte_flow_q_ops_attr *q_ops_attr,\n+\t\t\t       struct rte_flow *flow,\n+\t\t\t       void *user_data,\n+\t\t\t       struct rte_flow_error *error);\n+\n+Push enqueued operations\n+~~~~~~~~~~~~~~~~~~~~~~~~\n+\n+Pushing all internally stored rules from a queue to the NIC.\n+\n+.. code-block:: c\n+\n+\tint\n+\trte_flow_push(uint16_t port_id,\n+\t\t      uint32_t queue_id,\n+\t\t      struct rte_flow_error *error);\n+\n+There is the postpone attribute in the queue operation attributes.\n+When it is set, multiple operations can be bulked together and not sent to HW\n+right away to save SW/HW interactions and prioritize throughput over latency.\n+The application must invoke this function to actually push all outstanding\n+operations to HW in this case.\n+\n+Pull enqueued operations\n+~~~~~~~~~~~~~~~~~~~~~~~~\n+\n+Pulling asynchronous operations results.\n+\n+The application must invoke this function in order to complete asynchronous\n+flow rule operations and to receive flow rule operations statuses.\n+\n+.. code-block:: c\n+\n+\tint\n+\trte_flow_pull(uint16_t port_id,\n+\t\t      uint32_t queue_id,\n+\t\t      struct rte_flow_q_op_res res[],\n+\t\t      uint16_t n_res,\n+\t\t      struct rte_flow_error *error);\n+\n+Multiple outstanding operation results can be pulled simultaneously.\n+User data may be provided during a flow creation/destruction in order\n+to distinguish between multiple operations. User data is returned as part\n+of the result to provide a method to detect which operation is completed.\n+\n .. _flow_isolated_mode:\n \n Flow isolated mode\ndiff --git a/doc/guides/rel_notes/release_22_03.rst b/doc/guides/rel_notes/release_22_03.rst\nindex 7150d06c87..cd495ef40c 100644\n--- a/doc/guides/rel_notes/release_22_03.rst\n+++ b/doc/guides/rel_notes/release_22_03.rst\n@@ -113,6 +113,13 @@ New Features\n     ``rte_flow_template_table_destroy``, ``rte_flow_pattern_template_destroy``\n     and ``rte_flow_actions_template_destroy``.\n \n+* ** Added functions for asynchronous flow rules creation/destruction\n+\n+  * ethdev: Added ``rte_flow_async_create`` and ``rte_flow_async_destroy`` API\n+    to enqueue flow creaion/destruction operations asynchronously as well as\n+    ``rte_flow_pull`` to poll and retrieve results of these operations and\n+    ``rte_flow_push`` to push all the in-flight\toperations to the NIC.\n+\n * **Updated AF_XDP PMD**\n \n   * Added support for libxdp >=v1.2.2.\ndiff --git a/lib/ethdev/rte_flow.c b/lib/ethdev/rte_flow.c\nindex e9f684eedb..4e7b202522 100644\n--- a/lib/ethdev/rte_flow.c\n+++ b/lib/ethdev/rte_flow.c\n@@ -1396,6 +1396,7 @@ rte_flow_flex_item_release(uint16_t port_id,\n int\n rte_flow_info_get(uint16_t port_id,\n \t\t  struct rte_flow_port_info *port_info,\n+\t\t  struct rte_flow_queue_info *queue_info,\n \t\t  struct rte_flow_error *error)\n {\n \tstruct rte_eth_dev *dev = &rte_eth_devices[port_id];\n@@ -1415,7 +1416,7 @@ rte_flow_info_get(uint16_t port_id,\n \t\treturn -rte_errno;\n \tif (likely(!!ops->info_get)) {\n \t\treturn flow_err(port_id,\n-\t\t\t\tops->info_get(dev, port_info, error),\n+\t\t\t\tops->info_get(dev, port_info, queue_info, error),\n \t\t\t\terror);\n \t}\n \treturn rte_flow_error_set(error, ENOTSUP,\n@@ -1426,6 +1427,8 @@ rte_flow_info_get(uint16_t port_id,\n int\n rte_flow_configure(uint16_t port_id,\n \t\t   const struct rte_flow_port_attr *port_attr,\n+\t\t   uint16_t nb_queue,\n+\t\t   const struct rte_flow_queue_attr *queue_attr[],\n \t\t   struct rte_flow_error *error)\n {\n \tstruct rte_eth_dev *dev = &rte_eth_devices[port_id];\n@@ -1433,7 +1436,7 @@ rte_flow_configure(uint16_t port_id,\n \tint ret;\n \n \tdev->data->flow_configured = 0;\n-\tif (port_attr == NULL) {\n+\tif (port_attr == NULL || queue_attr == NULL) {\n \t\tRTE_FLOW_LOG(ERR, \"Port %\"PRIu16\" info is NULL.\\n\", port_id);\n \t\treturn -EINVAL;\n \t}\n@@ -1452,7 +1455,7 @@ rte_flow_configure(uint16_t port_id,\n \tif (unlikely(!ops))\n \t\treturn -rte_errno;\n \tif (likely(!!ops->configure)) {\n-\t\tret = ops->configure(dev, port_attr, error);\n+\t\tret = ops->configure(dev, port_attr, nb_queue, queue_attr, error);\n \t\tif (ret == 0)\n \t\t\tdev->data->flow_configured = 1;\n \t\treturn flow_err(port_id, ret, error);\n@@ -1713,3 +1716,104 @@ rte_flow_template_table_destroy(uint16_t port_id,\n \t\t\t\t  RTE_FLOW_ERROR_TYPE_UNSPECIFIED,\n \t\t\t\t  NULL, rte_strerror(ENOTSUP));\n }\n+\n+struct rte_flow *\n+rte_flow_async_create(uint16_t port_id,\n+\t\t      uint32_t queue_id,\n+\t\t      const struct rte_flow_q_ops_attr *q_ops_attr,\n+\t\t      struct rte_flow_template_table *template_table,\n+\t\t      const struct rte_flow_item pattern[],\n+\t\t      uint8_t pattern_template_index,\n+\t\t      const struct rte_flow_action actions[],\n+\t\t      uint8_t actions_template_index,\n+\t\t      void *user_data,\n+\t\t      struct rte_flow_error *error)\n+{\n+\tstruct rte_eth_dev *dev = &rte_eth_devices[port_id];\n+\tconst struct rte_flow_ops *ops = rte_flow_ops_get(port_id, error);\n+\tstruct rte_flow *flow;\n+\n+\tif (unlikely(!ops))\n+\t\treturn NULL;\n+\tif (likely(!!ops->async_create)) {\n+\t\tflow = ops->async_create(dev, queue_id,\n+\t\t\t\t\t q_ops_attr, template_table,\n+\t\t\t\t\t pattern, pattern_template_index,\n+\t\t\t\t\t actions, actions_template_index,\n+\t\t\t\t\t user_data, error);\n+\t\tif (flow == NULL)\n+\t\t\tflow_err(port_id, -rte_errno, error);\n+\t\treturn flow;\n+\t}\n+\trte_flow_error_set(error, ENOTSUP,\n+\t\t\t   RTE_FLOW_ERROR_TYPE_UNSPECIFIED,\n+\t\t\t   NULL, rte_strerror(ENOTSUP));\n+\treturn NULL;\n+}\n+\n+int\n+rte_flow_async_destroy(uint16_t port_id,\n+\t\t       uint32_t queue_id,\n+\t\t       const struct rte_flow_q_ops_attr *q_ops_attr,\n+\t\t       struct rte_flow *flow,\n+\t\t       void *user_data,\n+\t\t       struct rte_flow_error *error)\n+{\n+\tstruct rte_eth_dev *dev = &rte_eth_devices[port_id];\n+\tconst struct rte_flow_ops *ops = rte_flow_ops_get(port_id, error);\n+\n+\tif (unlikely(!ops))\n+\t\treturn -rte_errno;\n+\tif (likely(!!ops->async_destroy)) {\n+\t\treturn flow_err(port_id,\n+\t\t\t\tops->async_destroy(dev, queue_id,\n+\t\t\t\t\t\t   q_ops_attr, flow,\n+\t\t\t\t\t\t   user_data, error),\n+\t\t\t\terror);\n+\t}\n+\treturn rte_flow_error_set(error, ENOTSUP,\n+\t\t\t\t  RTE_FLOW_ERROR_TYPE_UNSPECIFIED,\n+\t\t\t\t  NULL, rte_strerror(ENOTSUP));\n+}\n+\n+int\n+rte_flow_push(uint16_t port_id,\n+\t      uint32_t queue_id,\n+\t      struct rte_flow_error *error)\n+{\n+\tstruct rte_eth_dev *dev = &rte_eth_devices[port_id];\n+\tconst struct rte_flow_ops *ops = rte_flow_ops_get(port_id, error);\n+\n+\tif (unlikely(!ops))\n+\t\treturn -rte_errno;\n+\tif (likely(!!ops->push)) {\n+\t\treturn flow_err(port_id,\n+\t\t\t\tops->push(dev, queue_id, error),\n+\t\t\t\terror);\n+\t}\n+\treturn rte_flow_error_set(error, ENOTSUP,\n+\t\t\t\t  RTE_FLOW_ERROR_TYPE_UNSPECIFIED,\n+\t\t\t\t  NULL, rte_strerror(ENOTSUP));\n+}\n+\n+int\n+rte_flow_pull(uint16_t port_id,\n+\t      uint32_t queue_id,\n+\t      struct rte_flow_q_op_res res[],\n+\t      uint16_t n_res,\n+\t      struct rte_flow_error *error)\n+{\n+\tstruct rte_eth_dev *dev = &rte_eth_devices[port_id];\n+\tconst struct rte_flow_ops *ops = rte_flow_ops_get(port_id, error);\n+\tint ret;\n+\n+\tif (unlikely(!ops))\n+\t\treturn -rte_errno;\n+\tif (likely(!!ops->pull)) {\n+\t\tret = ops->pull(dev, queue_id, res, n_res, error);\n+\t\treturn ret ? ret : flow_err(port_id, ret, error);\n+\t}\n+\treturn rte_flow_error_set(error, ENOTSUP,\n+\t\t\t\t  RTE_FLOW_ERROR_TYPE_UNSPECIFIED,\n+\t\t\t\t  NULL, rte_strerror(ENOTSUP));\n+}\ndiff --git a/lib/ethdev/rte_flow.h b/lib/ethdev/rte_flow.h\nindex 776e8ccc11..9e71a576f6 100644\n--- a/lib/ethdev/rte_flow.h\n+++ b/lib/ethdev/rte_flow.h\n@@ -4884,6 +4884,10 @@ rte_flow_flex_item_release(uint16_t port_id,\n  *\n  */\n struct rte_flow_port_info {\n+\t/**\n+\t * Maximum umber of queues for asynchronous operations.\n+\t */\n+\tuint32_t max_nb_queues;\n \t/**\n \t * Maximum number of counters.\n \t * @see RTE_FLOW_ACTION_TYPE_COUNT\n@@ -4901,6 +4905,21 @@ struct rte_flow_port_info {\n \tuint32_t max_nb_meters;\n };\n \n+/**\n+ * @warning\n+ * @b EXPERIMENTAL: this API may change without prior notice.\n+ *\n+ * Information about flow engine asynchronous queues.\n+ * The value only valid if @p port_attr.max_nb_queues is not zero.\n+ *\n+ */\n+struct rte_flow_queue_info {\n+\t/**\n+\t * Maximum number of operations a queue can hold.\n+\t */\n+\tuint32_t max_size;\n+};\n+\n /**\n  * @warning\n  * @b EXPERIMENTAL: this API may change without prior notice.\n@@ -4912,6 +4931,9 @@ struct rte_flow_port_info {\n  * @param[out] port_info\n  *   A pointer to a structure of type *rte_flow_port_info*\n  *   to be filled with the resources information of the port.\n+ * @param[out] queue_info\n+ *   A pointer to a structure of type *rte_flow_queue_info*\n+ *   to be filled with the asynchronous queues information.\n  * @param[out] error\n  *   Perform verbose error reporting if not NULL.\n  *   PMDs initialize this structure in case of error only.\n@@ -4923,6 +4945,7 @@ __rte_experimental\n int\n rte_flow_info_get(uint16_t port_id,\n \t\t  struct rte_flow_port_info *port_info,\n+\t\t  struct rte_flow_queue_info *queue_info,\n \t\t  struct rte_flow_error *error);\n \n /**\n@@ -4951,6 +4974,21 @@ struct rte_flow_port_attr {\n \tuint32_t nb_meters;\n };\n \n+/**\n+ * @warning\n+ * @b EXPERIMENTAL: this API may change without prior notice.\n+ *\n+ * Flow engine asynchronous queues settings.\n+ * The value means default value picked by PMD.\n+ *\n+ */\n+struct rte_flow_queue_attr {\n+\t/**\n+\t * Number of flow rule operations a queue can hold.\n+\t */\n+\tuint32_t size;\n+};\n+\n /**\n  * @warning\n  * @b EXPERIMENTAL: this API may change without prior notice.\n@@ -4970,6 +5008,11 @@ struct rte_flow_port_attr {\n  *   Port identifier of Ethernet device.\n  * @param[in] port_attr\n  *   Port configuration attributes.\n+ * @param[in] nb_queue\n+ *   Number of flow queues to be configured.\n+ * @param[in] queue_attr\n+ *   Array that holds attributes for each flow queue.\n+ *   Number of elements is set in @p port_attr.nb_queues.\n  * @param[out] error\n  *   Perform verbose error reporting if not NULL.\n  *   PMDs initialize this structure in case of error only.\n@@ -4981,6 +5024,8 @@ __rte_experimental\n int\n rte_flow_configure(uint16_t port_id,\n \t\t   const struct rte_flow_port_attr *port_attr,\n+\t\t   uint16_t nb_queue,\n+\t\t   const struct rte_flow_queue_attr *queue_attr[],\n \t\t   struct rte_flow_error *error);\n \n /**\n@@ -5257,6 +5302,212 @@ rte_flow_template_table_destroy(uint16_t port_id,\n \t\tstruct rte_flow_template_table *template_table,\n \t\tstruct rte_flow_error *error);\n \n+/**\n+ * @warning\n+ * @b EXPERIMENTAL: this API may change without prior notice.\n+ *\n+ * Queue operation attributes.\n+ */\n+__extension__\n+struct rte_flow_q_ops_attr {\n+\t /**\n+\t  * When set, the requested action will not be sent to the HW immediately.\n+\t  * The application must call the rte_flow_queue_push to actually send it.\n+\t  */\n+\tuint32_t postpone:1;\n+};\n+\n+/**\n+ * @warning\n+ * @b EXPERIMENTAL: this API may change without prior notice.\n+ *\n+ * Enqueue rule creation operation.\n+ *\n+ * @param port_id\n+ *   Port identifier of Ethernet device.\n+ * @param queue_id\n+ *   Flow queue used to insert the rule.\n+ * @param[in] q_ops_attr\n+ *   Rule creation operation attributes.\n+ * @param[in] template_table\n+ *   Template table to select templates from.\n+ * @param[in] pattern\n+ *   List of pattern items to be used.\n+ *   The list order should match the order in the pattern template.\n+ *   The spec is the only relevant member of the item that is being used.\n+ * @param[in] pattern_template_index\n+ *   Pattern template index in the table.\n+ * @param[in] actions\n+ *   List of actions to be used.\n+ *   The list order should match the order in the actions template.\n+ * @param[in] actions_template_index\n+ *   Actions template index in the table.\n+ * @param[in] user_data\n+ *   The user data that will be returned on the completion events.\n+ * @param[out] error\n+ *   Perform verbose error reporting if not NULL.\n+ *   PMDs initialize this structure in case of error only.\n+ *\n+ * @return\n+ *   Handle on success, NULL otherwise and rte_errno is set.\n+ *   The rule handle doesn't mean that the rule has been populated.\n+ *   Only completion result indicates that if there was success or failure.\n+ */\n+__rte_experimental\n+struct rte_flow *\n+rte_flow_async_create(uint16_t port_id,\n+\t\t      uint32_t queue_id,\n+\t\t      const struct rte_flow_q_ops_attr *q_ops_attr,\n+\t\t      struct rte_flow_template_table *template_table,\n+\t\t      const struct rte_flow_item pattern[],\n+\t\t      uint8_t pattern_template_index,\n+\t\t      const struct rte_flow_action actions[],\n+\t\t      uint8_t actions_template_index,\n+\t\t      void *user_data,\n+\t\t      struct rte_flow_error *error);\n+\n+/**\n+ * @warning\n+ * @b EXPERIMENTAL: this API may change without prior notice.\n+ *\n+ * Enqueue rule destruction operation.\n+ *\n+ * This function enqueues a destruction operation on the queue.\n+ * Application should assume that after calling this function\n+ * the rule handle is not valid anymore.\n+ * Completion indicates the full removal of the rule from the HW.\n+ *\n+ * @param port_id\n+ *   Port identifier of Ethernet device.\n+ * @param queue_id\n+ *   Flow queue which is used to destroy the rule.\n+ *   This must match the queue on which the rule was created.\n+ * @param[in] q_ops_attr\n+ *   Rule destroy operation attributes.\n+ * @param[in] flow\n+ *   Flow handle to be destroyed.\n+ * @param[in] user_data\n+ *   The user data that will be returned on the completion events.\n+ * @param[out] error\n+ *   Perform verbose error reporting if not NULL.\n+ *   PMDs initialize this structure in case of error only.\n+ *\n+ * @return\n+ *   0 on success, a negative errno value otherwise and rte_errno is set.\n+ */\n+__rte_experimental\n+int\n+rte_flow_async_destroy(uint16_t port_id,\n+\t\t       uint32_t queue_id,\n+\t\t       const struct rte_flow_q_ops_attr *q_ops_attr,\n+\t\t       struct rte_flow *flow,\n+\t\t       void *user_data,\n+\t\t       struct rte_flow_error *error);\n+\n+/**\n+ * @warning\n+ * @b EXPERIMENTAL: this API may change without prior notice.\n+ *\n+ * Push all internally stored rules to the HW.\n+ * Postponed rules are rules that were inserted with the postpone flag set.\n+ * Can be used to notify the HW about batch of rules prepared by the SW to\n+ * reduce the number of communications between the HW and SW.\n+ *\n+ * @param port_id\n+ *   Port identifier of Ethernet device.\n+ * @param queue_id\n+ *   Flow queue to be pushed.\n+ * @param[out] error\n+ *   Perform verbose error reporting if not NULL.\n+ *   PMDs initialize this structure in case of error only.\n+ *\n+ * @return\n+ *   0 on success, a negative errno value otherwise and rte_errno is set\n+ *   to one of the error codes defined:\n+ *   - (ENODEV) if *port_id* invalid.\n+ *   - (ENOSYS) if underlying device does not support this functionality.\n+ *   - (EIO) if underlying device is removed.\n+ *   - (EINVAL) if *queue_id* invalid.\n+ */\n+__rte_experimental\n+int\n+rte_flow_push(uint16_t port_id,\n+\t      uint32_t queue_id,\n+\t      struct rte_flow_error *error);\n+\n+/**\n+ * @warning\n+ * @b EXPERIMENTAL: this API may change without prior notice.\n+ *\n+ * Queue operation status.\n+ */\n+enum rte_flow_q_op_status {\n+\t/**\n+\t * The operation was completed successfully.\n+\t */\n+\tRTE_FLOW_Q_OP_SUCCESS,\n+\t/**\n+\t * The operation was not completed successfully.\n+\t */\n+\tRTE_FLOW_Q_OP_ERROR,\n+};\n+\n+/**\n+ * @warning\n+ * @b EXPERIMENTAL: this API may change without prior notice.\n+ *\n+ * Queue operation results.\n+ */\n+__extension__\n+struct rte_flow_q_op_res {\n+\t/**\n+\t * Returns the status of the operation that this completion signals.\n+\t */\n+\tenum rte_flow_q_op_status status;\n+\t/**\n+\t * The user data that will be returned on the completion events.\n+\t */\n+\tvoid *user_data;\n+};\n+\n+/**\n+ * @warning\n+ * @b EXPERIMENTAL: this API may change without prior notice.\n+ *\n+ * Pull a rte flow operation.\n+ * The application must invoke this function in order to complete\n+ * the flow rule offloading and to retrieve the flow rule operation status.\n+ *\n+ * @param port_id\n+ *   Port identifier of Ethernet device.\n+ * @param queue_id\n+ *   Flow queue which is used to pull the operation.\n+ * @param[out] res\n+ *   Array of results that will be set.\n+ * @param[in] n_res\n+ *   Maximum number of results that can be returned.\n+ *   This value is equal to the size of the res array.\n+ * @param[out] error\n+ *   Perform verbose error reporting if not NULL.\n+ *   PMDs initialize this structure in case of error only.\n+ *\n+ * @return\n+ *   Number of results that were pulled,\n+ *   a negative errno value otherwise and rte_errno is set\n+ *   to one of the error codes defined:\n+ *   - (ENODEV) if *port_id* invalid.\n+ *   - (ENOSYS) if underlying device does not support this functionality.\n+ *   - (EIO) if underlying device is removed.\n+ *   - (EINVAL) if *queue_id* invalid.\n+ */\n+__rte_experimental\n+int\n+rte_flow_pull(uint16_t port_id,\n+\t      uint32_t queue_id,\n+\t      struct rte_flow_q_op_res res[],\n+\t      uint16_t n_res,\n+\t      struct rte_flow_error *error);\n+\n #ifdef __cplusplus\n }\n #endif\ndiff --git a/lib/ethdev/rte_flow_driver.h b/lib/ethdev/rte_flow_driver.h\nindex 2d96db1dc7..332783cf78 100644\n--- a/lib/ethdev/rte_flow_driver.h\n+++ b/lib/ethdev/rte_flow_driver.h\n@@ -156,11 +156,14 @@ struct rte_flow_ops {\n \tint (*info_get)\n \t\t(struct rte_eth_dev *dev,\n \t\t struct rte_flow_port_info *port_info,\n+\t\t struct rte_flow_queue_info *queue_info,\n \t\t struct rte_flow_error *err);\n \t/** See rte_flow_configure() */\n \tint (*configure)\n \t\t(struct rte_eth_dev *dev,\n \t\t const struct rte_flow_port_attr *port_attr,\n+\t\t uint16_t nb_queue,\n+\t\t const struct rte_flow_queue_attr *queue_attr[],\n \t\t struct rte_flow_error *err);\n \t/** See rte_flow_pattern_template_create() */\n \tstruct rte_flow_pattern_template *(*pattern_template_create)\n@@ -199,6 +202,38 @@ struct rte_flow_ops {\n \t\t(struct rte_eth_dev *dev,\n \t\t struct rte_flow_template_table *template_table,\n \t\t struct rte_flow_error *err);\n+\t/** See rte_flow_async_create() */\n+\tstruct rte_flow *(*async_create)\n+\t\t(struct rte_eth_dev *dev,\n+\t\t uint32_t queue_id,\n+\t\t const struct rte_flow_q_ops_attr *q_ops_attr,\n+\t\t struct rte_flow_template_table *template_table,\n+\t\t const struct rte_flow_item pattern[],\n+\t\t uint8_t pattern_template_index,\n+\t\t const struct rte_flow_action actions[],\n+\t\t uint8_t actions_template_index,\n+\t\t void *user_data,\n+\t\t struct rte_flow_error *err);\n+\t/** See rte_flow_async_destroy() */\n+\tint (*async_destroy)\n+\t\t(struct rte_eth_dev *dev,\n+\t\t uint32_t queue_id,\n+\t\t const struct rte_flow_q_ops_attr *q_ops_attr,\n+\t\t struct rte_flow *flow,\n+\t\t void *user_data,\n+\t\t struct rte_flow_error *err);\n+\t/** See rte_flow_push() */\n+\tint (*push)\n+\t\t(struct rte_eth_dev *dev,\n+\t\t uint32_t queue_id,\n+\t\t struct rte_flow_error *err);\n+\t/** See rte_flow_pull() */\n+\tint (*pull)\n+\t\t(struct rte_eth_dev *dev,\n+\t\t uint32_t queue_id,\n+\t\t struct rte_flow_q_op_res res[],\n+\t\t uint16_t n_res,\n+\t\t struct rte_flow_error *error);\n };\n \n /**\ndiff --git a/lib/ethdev/version.map b/lib/ethdev/version.map\nindex 62ff791261..13c1a22118 100644\n--- a/lib/ethdev/version.map\n+++ b/lib/ethdev/version.map\n@@ -272,6 +272,10 @@ EXPERIMENTAL {\n \trte_flow_actions_template_destroy;\n \trte_flow_template_table_create;\n \trte_flow_template_table_destroy;\n+\trte_flow_async_create;\n+\trte_flow_async_destroy;\n+\trte_flow_push;\n+\trte_flow_pull;\n };\n \n INTERNAL {\n",
    "prefixes": [
        "v8",
        "03/11"
    ]
}