get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 112776,
    "url": "http://patchwork.dpdk.org/api/patches/112776/?format=api",
    "web_url": "http://patchwork.dpdk.org/project/dpdk/patch/20220615144341.399152-4-spiked@nvidia.com/",
    "project": {
        "id": 1,
        "url": "http://patchwork.dpdk.org/api/projects/1/?format=api",
        "name": "DPDK",
        "link_name": "dpdk",
        "list_id": "dev.dpdk.org",
        "list_email": "dev@dpdk.org",
        "web_url": "http://core.dpdk.org",
        "scm_url": "git://dpdk.org/dpdk",
        "webscm_url": "http://git.dpdk.org/dpdk",
        "list_archive_url": "https://inbox.dpdk.org/dev",
        "list_archive_url_format": "https://inbox.dpdk.org/dev/{}",
        "commit_url_format": ""
    },
    "msgid": "<20220615144341.399152-4-spiked@nvidia.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20220615144341.399152-4-spiked@nvidia.com",
    "date": "2022-06-15T14:43:38",
    "name": "[v9,3/6] net/mlx5: add LWM event handling support",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "02b494cbe7b9801ae228d028e247380f4eaaa2c8",
    "submitter": {
        "id": 2637,
        "url": "http://patchwork.dpdk.org/api/people/2637/?format=api",
        "name": "Spike Du",
        "email": "spiked@nvidia.com"
    },
    "delegate": {
        "id": 3268,
        "url": "http://patchwork.dpdk.org/api/users/3268/?format=api",
        "username": "rasland",
        "first_name": "Raslan",
        "last_name": "Darawsheh",
        "email": "rasland@nvidia.com"
    },
    "mbox": "http://patchwork.dpdk.org/project/dpdk/patch/20220615144341.399152-4-spiked@nvidia.com/mbox/",
    "series": [
        {
            "id": 23541,
            "url": "http://patchwork.dpdk.org/api/series/23541/?format=api",
            "web_url": "http://patchwork.dpdk.org/project/dpdk/list/?series=23541",
            "date": "2022-06-15T14:43:36",
            "name": "introduce per-queue available descriptor threshold and host shaper",
            "version": 9,
            "mbox": "http://patchwork.dpdk.org/series/23541/mbox/"
        }
    ],
    "comments": "http://patchwork.dpdk.org/api/patches/112776/comments/",
    "check": "success",
    "checks": "http://patchwork.dpdk.org/api/patches/112776/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 BCD06A0548;\n\tWed, 15 Jun 2022 16:44:26 +0200 (CEST)",
            "from [217.70.189.124] (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 4603742B89;\n\tWed, 15 Jun 2022 16:44:14 +0200 (CEST)",
            "from NAM10-BN7-obe.outbound.protection.outlook.com\n (mail-bn7nam10on2046.outbound.protection.outlook.com [40.107.92.46])\n by mails.dpdk.org (Postfix) with ESMTP id 5F49F42B78\n for <dev@dpdk.org>; Wed, 15 Jun 2022 16:44:12 +0200 (CEST)",
            "from BN9P220CA0029.NAMP220.PROD.OUTLOOK.COM (2603:10b6:408:13e::34)\n by CY5PR12MB6599.namprd12.prod.outlook.com (2603:10b6:930:41::11)\n with Microsoft SMTP Server (version=TLS1_2,\n cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5332.22; Wed, 15 Jun\n 2022 14:44:10 +0000",
            "from BN8NAM11FT015.eop-nam11.prod.protection.outlook.com\n (2603:10b6:408:13e:cafe::bc) by BN9P220CA0029.outlook.office365.com\n (2603:10b6:408:13e::34) with Microsoft SMTP Server (version=TLS1_2,\n cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5332.15 via Frontend\n Transport; Wed, 15 Jun 2022 14:44:10 +0000",
            "from mail.nvidia.com (12.22.5.235) by\n BN8NAM11FT015.mail.protection.outlook.com (10.13.176.90) with Microsoft SMTP\n Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384) id\n 15.20.5332.12 via Frontend Transport; Wed, 15 Jun 2022 14:44:09 +0000",
            "from rnnvmail201.nvidia.com (10.129.68.8) by DRHQMAIL107.nvidia.com\n (10.27.9.16) with Microsoft SMTP Server (TLS) id 15.0.1497.32;\n Wed, 15 Jun 2022 14:44:08 +0000",
            "from nvidia.com (10.126.230.35) by rnnvmail201.nvidia.com\n (10.129.68.8) with Microsoft SMTP Server (version=TLS1_2,\n cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.986.22; Wed, 15 Jun\n 2022 07:44:05 -0700"
        ],
        "ARC-Seal": "i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none;\n b=EEngliZT4oo2Bo8M0y/mDngBZFwvgMP/2ATVdkV+WmvyD14btX7dBoh6G0DTYEz7kAzhTDsCzuPepVvtjd2eAvb3Ldd6VXg8wBHF/LGTp5SLMP+XDtN6c5PNZpIYb5+w9YTD4x/y+Qv5w/SX3h0ecmeKejAL3COjT8nY+REzOJf9Ihz/H1JvMSeoc+F6NPMHO+itNbSiExtjBr5iXcKCdOSbopMTUWocsMTkVZz9hOR+oeBpEphbYUd9M4W8eSDY2iTzDGOAzIrs8U3ON71yHsm31WMktH73ViZ4UibiKtjOOeS30lAMIBvJf6k2p8zsEH7T3bee7XzUIJdiHBSasw==",
        "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=MbsAPaGLdnAZcEbMNP8bYAKVJgxu850YoRG/4tij3s8=;\n b=jWRJuBH9VCwV6ACkSkHxC1rsubxrerusuH8Po4ObOWCKmZybdoGj0jKXkOLvQLeumVvoAu5hswqSWbluerQCMG9cKyfxyQAgQEmB0jd5h9msLLdVcWx9N73f5CV8g8+DnKmZSnX29Kdv2MepLsEMXh2zqHpk/Uv7P2gJ/oPcg8wOfFOJAeRi5HN3MRCW9Vt4GFSBop+ynhDncqhraDhTt1WSCnbDeNA8PIYf0MxxxEevwpvnBy+ZWe1USfV7waWW9bbEWlwMBoBnxeix+22zKawJ4gbz4uzj+HawkD8kboh4KWfHPKSqnHO7SupkMKl6XroQSJnYnvP/34PO1SXeWg==",
        "ARC-Authentication-Results": "i=1; mx.microsoft.com 1; spf=pass (sender ip is\n 12.22.5.235) smtp.rcpttodomain=smartsharesystems.com\n smtp.mailfrom=nvidia.com; dmarc=pass (p=reject sp=reject pct=100) action=none\n header.from=nvidia.com; dkim=none (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=MbsAPaGLdnAZcEbMNP8bYAKVJgxu850YoRG/4tij3s8=;\n b=ibH75QRGga3O28SlU8029g22EKqeTacpovj5TFWzWG3dGNXn2XAOxtiNlhGNgJhGIuW7mSQKctFx8JiDXvJrhz6U/70ybSEUSks/K03KcRTcQ40hZlfyZufUcZGqkzy2Cacrkg1RrvgtVnEAOhAeS7N1ArWAbZdeUTHjaepGJpFiJW61Juyzb4+2Y6XciBwWw++i5c6O7j0ocJtjF2EgsrVrj819QYAhM5iQUqTFu49vRt52tTow/id1XtGDXl0Dgmw9dlhMt9bifT6DuBTh8YbkVJB6VwGFAib3LwkZGlZLgUN0cSxY7Pm5a9B5cG+qHFLZ7G4ekphndTlL9yjjIg==",
        "X-MS-Exchange-Authentication-Results": "spf=pass (sender IP is 12.22.5.235)\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.235 as permitted sender) receiver=protection.outlook.com;\n client-ip=12.22.5.235; helo=mail.nvidia.com; pr=C",
        "From": "Spike Du <spiked@nvidia.com>",
        "To": "<matan@nvidia.com>, <viacheslavo@nvidia.com>, <orika@nvidia.com>,\n <thomas@monjalon.net>, Shahaf Shuler <shahafs@nvidia.com>",
        "CC": "<andrew.rybchenko@oktetlabs.ru>, <stephen@networkplumber.org>,\n <mb@smartsharesystems.com>, <dev@dpdk.org>, <rasland@nvidia.com>",
        "Subject": "[PATCH v9 3/6] net/mlx5: add LWM event handling support",
        "Date": "Wed, 15 Jun 2022 17:43:38 +0300",
        "Message-ID": "<20220615144341.399152-4-spiked@nvidia.com>",
        "X-Mailer": "git-send-email 2.27.0",
        "In-Reply-To": "<20220615144341.399152-1-spiked@nvidia.com>",
        "References": "<20220615125836.391771-2-spiked@nvidia.com>\n <20220615144341.399152-1-spiked@nvidia.com>",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "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": "424d96a1-77ca-42c5-8e45-08da4edd81ca",
        "X-MS-TrafficTypeDiagnostic": "CY5PR12MB6599:EE_",
        "X-LD-Processed": "43083d15-7273-40c1-b7db-39efd9ccc17a,ExtAddr",
        "X-Microsoft-Antispam-PRVS": "\n <CY5PR12MB6599265A2A3DFA331AEE0019A8AD9@CY5PR12MB6599.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 zX8K5lzRHhm5zThgl4TILYwKhHSKECd5KJwHF08XoQWBJoomSbs770mBi7J48zG9XY1Xbhh1jyWHQVcWEQEpvy0AhYrQtsWyN73I1yuH7Tzy2eHwVU5DCxEdfUwNk8Rm0snlegxfr72i70v9F/9WGB0RjZ7wcfyMcZbsV08eLuIhNAAqj3AmBtOliyefqEBsTrOO/brZ96T9C2a1KU89d5Wz16EZZAlW/YVWvGwy+HDr9xbnK5aRG9PRSprwKsm95+tjL+gotWiN3h8wUXNwYSWAlXk/8OgqdnqW4ZRzU7SRbzZ9BZ3eUTKXS2OYswSe35ZbwC49/QmK78nmG6zOPnwAZ8Jol7EZwyV0CU/S9mmiA08KD8DYKBwgyGj9F1HH1uMKkobJN8JhQn4USUWfemNNMHP3uedVly8MWCUXJ7bJbiJL389vUEcYRlMEKA4NWxQ+x3bkNWJflGVmTnS6sbnAHJOKBJtl4fE4+bY8w/l1sr3Nrvdun/C5ysTiS+PJ7oWKt0VLKEQJ93DcygHLqVGkvL6jzvfDKcdrSebwjjUgfq6Ni9enWTmI1ecRSpGztuhjUlnehxZsNDG3fgNcu2rE0OTTUSQtvMrGQoLE8PFIhisBoqEml8TK9oG5RwHKfa+8RSQs/1MMTO/zq5PnmIRBjrEBwqGSarV+rWyHbqhzUnG9hgVn7RACeBgHsFukSoTOHUzwzqnFV6nRPhWdpQ==",
        "X-Forefront-Antispam-Report": "CIP:12.22.5.235; CTRY:US; LANG:en; SCL:1; SRV:;\n IPV:NLI; SFV:NSPM; H:mail.nvidia.com; PTR:InfoNoRecords; CAT:NONE;\n SFS:(13230016)(4636009)(46966006)(36840700001)(40470700004)(5660300002)(356005)(316002)(16526019)(6666004)(36860700001)(107886003)(2906002)(186003)(82310400005)(2616005)(1076003)(6286002)(26005)(81166007)(40460700003)(86362001)(7696005)(55016003)(70206006)(70586007)(47076005)(4326008)(508600001)(83380400001)(110136005)(8676002)(8936002)(36756003)(426003)(6636002)(336012)(54906003)(36900700001);\n DIR:OUT; SFP:1101;",
        "X-OriginatorOrg": "Nvidia.com",
        "X-MS-Exchange-CrossTenant-OriginalArrivalTime": "15 Jun 2022 14:44:09.5964 (UTC)",
        "X-MS-Exchange-CrossTenant-Network-Message-Id": "\n 424d96a1-77ca-42c5-8e45-08da4edd81ca",
        "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.235];\n Helo=[mail.nvidia.com]",
        "X-MS-Exchange-CrossTenant-AuthSource": "\n BN8NAM11FT015.eop-nam11.prod.protection.outlook.com",
        "X-MS-Exchange-CrossTenant-AuthAs": "Anonymous",
        "X-MS-Exchange-CrossTenant-FromEntityHeader": "HybridOnPrem",
        "X-MS-Exchange-Transport-CrossTenantHeadersStamped": "CY5PR12MB6599",
        "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": "When LWM meets RQ WQE, the kernel driver raises an event to SW.\nUse devx event_channel to catch this and to notify the user.\nAllocate this channel per shared device.\nThe channel has a cookie that informs the specific event port and queue.\n\nSigned-off-by: Spike Du <spiked@nvidia.com>\n---\n drivers/net/mlx5/mlx5.c      | 66 ++++++++++++++++++++++++++++++++++++++++++++\n drivers/net/mlx5/mlx5.h      |  7 +++++\n drivers/net/mlx5/mlx5_devx.c | 47 +++++++++++++++++++++++++++++++\n drivers/net/mlx5/mlx5_rx.c   | 33 ++++++++++++++++++++++\n drivers/net/mlx5/mlx5_rx.h   |  7 +++++\n 5 files changed, 160 insertions(+)",
    "diff": "diff --git a/drivers/net/mlx5/mlx5.c b/drivers/net/mlx5/mlx5.c\nindex f098871..e04a666 100644\n--- a/drivers/net/mlx5/mlx5.c\n+++ b/drivers/net/mlx5/mlx5.c\n@@ -9,6 +9,7 @@\n #include <stdint.h>\n #include <stdlib.h>\n #include <errno.h>\n+#include <fcntl.h>\n \n #include <rte_malloc.h>\n #include <ethdev_driver.h>\n@@ -22,6 +23,7 @@\n #include <rte_eal_paging.h>\n #include <rte_alarm.h>\n #include <rte_cycles.h>\n+#include <rte_interrupts.h>\n \n #include <mlx5_glue.h>\n #include <mlx5_devx_cmds.h>\n@@ -1525,6 +1527,69 @@ struct mlx5_dev_ctx_shared *\n }\n \n /**\n+ * Create LWM event_channel and interrupt handle for shared device\n+ * context. All rxqs sharing the device context share the event_channel.\n+ * A callback is registered in interrupt thread to receive the LWM event.\n+ *\n+ * @param[in] priv\n+ *   Pointer to mlx5_priv instance.\n+ *\n+ * @return\n+ *   0 on success, negative with rte_errno set.\n+ */\n+int\n+mlx5_lwm_setup(struct mlx5_priv *priv)\n+{\n+\tint fd_lwm;\n+\n+\tpthread_mutex_init(&priv->sh->lwm_config_lock, NULL);\n+\tpriv->sh->devx_channel_lwm = mlx5_os_devx_create_event_channel\n+\t\t\t(priv->sh->cdev->ctx,\n+\t\t\t MLX5DV_DEVX_CREATE_EVENT_CHANNEL_FLAGS_OMIT_EV_DATA);\n+\tif (!priv->sh->devx_channel_lwm)\n+\t\tgoto err;\n+\tfd_lwm = mlx5_os_get_devx_channel_fd(priv->sh->devx_channel_lwm);\n+\tpriv->sh->intr_handle_lwm = mlx5_os_interrupt_handler_create\n+\t\t(RTE_INTR_INSTANCE_F_SHARED, true,\n+\t\t fd_lwm, mlx5_dev_interrupt_handler_lwm, priv);\n+\tif (!priv->sh->intr_handle_lwm)\n+\t\tgoto err;\n+\treturn 0;\n+err:\n+\tif (priv->sh->devx_channel_lwm) {\n+\t\tmlx5_os_devx_destroy_event_channel\n+\t\t\t(priv->sh->devx_channel_lwm);\n+\t\tpriv->sh->devx_channel_lwm = NULL;\n+\t}\n+\tpthread_mutex_destroy(&priv->sh->lwm_config_lock);\n+\treturn -rte_errno;\n+}\n+\n+/**\n+ * Destroy LWM event_channel and interrupt handle for shared device\n+ * context before free this context. The interrupt handler is also\n+ * unregistered.\n+ *\n+ * @param[in] sh\n+ *   Pointer to shared device context.\n+ */\n+void\n+mlx5_lwm_unset(struct mlx5_dev_ctx_shared *sh)\n+{\n+\tif (sh->intr_handle_lwm) {\n+\t\tmlx5_os_interrupt_handler_destroy(sh->intr_handle_lwm,\n+\t\t\tmlx5_dev_interrupt_handler_lwm, (void *)-1);\n+\t\tsh->intr_handle_lwm = NULL;\n+\t}\n+\tif (sh->devx_channel_lwm) {\n+\t\tmlx5_os_devx_destroy_event_channel\n+\t\t\t(sh->devx_channel_lwm);\n+\t\tsh->devx_channel_lwm = NULL;\n+\t}\n+\tpthread_mutex_destroy(&sh->lwm_config_lock);\n+}\n+\n+/**\n  * Free shared IB device context. Decrement counter and if zero free\n  * all allocated resources and close handles.\n  *\n@@ -1601,6 +1666,7 @@ struct mlx5_dev_ctx_shared *\n \t\tclaim_zero(mlx5_devx_cmd_destroy(sh->td));\n \tMLX5_ASSERT(sh->geneve_tlv_option_resource == NULL);\n \tpthread_mutex_destroy(&sh->txpp.mutex);\n+\tmlx5_lwm_unset(sh);\n \tmlx5_free(sh);\n \treturn;\n exit:\ndiff --git a/drivers/net/mlx5/mlx5.h b/drivers/net/mlx5/mlx5.h\nindex 7ebb2cc..a76f2fe 100644\n--- a/drivers/net/mlx5/mlx5.h\n+++ b/drivers/net/mlx5/mlx5.h\n@@ -1268,6 +1268,9 @@ struct mlx5_dev_ctx_shared {\n \tstruct mlx5_lb_ctx self_lb; /* QP to enable self loopback for Devx. */\n \tunsigned int flow_max_priority;\n \tenum modify_reg flow_mreg_c[MLX5_MREG_C_NUM];\n+\tvoid *devx_channel_lwm;\n+\tstruct rte_intr_handle *intr_handle_lwm;\n+\tpthread_mutex_t lwm_config_lock;\n \t/* Availability of mreg_c's. */\n \tstruct mlx5_dev_shared_port port[]; /* per device port data array. */\n };\n@@ -1405,6 +1408,7 @@ enum mlx5_txq_modify_type {\n };\n \n struct mlx5_rxq_priv;\n+struct mlx5_priv;\n \n /* HW objects operations structure. */\n struct mlx5_obj_ops {\n@@ -1413,6 +1417,7 @@ struct mlx5_obj_ops {\n \tint (*rxq_event_get)(struct mlx5_rxq_obj *rxq_obj);\n \tint (*rxq_obj_modify)(struct mlx5_rxq_priv *rxq, uint8_t type);\n \tvoid (*rxq_obj_release)(struct mlx5_rxq_priv *rxq);\n+\tint (*rxq_event_get_lwm)(struct mlx5_priv *priv, int *rxq_idx, int *port_id);\n \tint (*ind_table_new)(struct rte_eth_dev *dev, const unsigned int log_n,\n \t\t\t     struct mlx5_ind_table_obj *ind_tbl);\n \tint (*ind_table_modify)(struct rte_eth_dev *dev,\n@@ -1603,6 +1608,8 @@ int mlx5_udp_tunnel_port_add(struct rte_eth_dev *dev,\n bool mlx5_is_hpf(struct rte_eth_dev *dev);\n bool mlx5_is_sf_repr(struct rte_eth_dev *dev);\n void mlx5_age_event_prepare(struct mlx5_dev_ctx_shared *sh);\n+int mlx5_lwm_setup(struct mlx5_priv *priv);\n+void mlx5_lwm_unset(struct mlx5_dev_ctx_shared *sh);\n \n /* Macro to iterate over all valid ports for mlx5 driver. */\n #define MLX5_ETH_FOREACH_DEV(port_id, dev) \\\ndiff --git a/drivers/net/mlx5/mlx5_devx.c b/drivers/net/mlx5/mlx5_devx.c\nindex c918a50..6886ae1 100644\n--- a/drivers/net/mlx5/mlx5_devx.c\n+++ b/drivers/net/mlx5/mlx5_devx.c\n@@ -233,6 +233,52 @@\n }\n \n /**\n+ * Get LWM event for shared context, return the correct port/rxq for this event.\n+ *\n+ * @param priv\n+ *   Mlx5_priv object.\n+ * @param rxq_idx [out]\n+ *   Which rxq gets this event.\n+ * @param port_id [out]\n+ *   Which port gets this event.\n+ *\n+ * @return\n+ *   0 on success, a negative errno value otherwise and rte_errno is set.\n+ */\n+static int\n+mlx5_rx_devx_get_event_lwm(struct mlx5_priv *priv, int *rxq_idx, int *port_id)\n+{\n+#ifdef HAVE_IBV_DEVX_EVENT\n+\tunion {\n+\t\tstruct mlx5dv_devx_async_event_hdr event_resp;\n+\t\tuint8_t buf[sizeof(struct mlx5dv_devx_async_event_hdr) + 128];\n+\t} out;\n+\tint ret;\n+\n+\tmemset(&out, 0, sizeof(out));\n+\tret = mlx5_glue->devx_get_event(priv->sh->devx_channel_lwm,\n+\t\t\t\t\t&out.event_resp,\n+\t\t\t\t\tsizeof(out.buf));\n+\tif (ret < 0) {\n+\t\trte_errno = errno;\n+\t\tDRV_LOG(WARNING, \"%s err\\n\", __func__);\n+\t\treturn -rte_errno;\n+\t}\n+\t*port_id = (((uint32_t)out.event_resp.cookie) >>\n+\t\t    LWM_COOKIE_PORTID_OFFSET) & LWM_COOKIE_PORTID_MASK;\n+\t*rxq_idx = (((uint32_t)out.event_resp.cookie) >>\n+\t\t    LWM_COOKIE_RXQID_OFFSET) & LWM_COOKIE_RXQID_MASK;\n+\treturn 0;\n+#else\n+\t(void)priv;\n+\t(void)rxq_idx;\n+\t(void)port_id;\n+\trte_errno = ENOTSUP;\n+\treturn -rte_errno;\n+#endif /* HAVE_IBV_DEVX_EVENT */\n+}\n+\n+/**\n  * Create a RQ object using DevX.\n  *\n  * @param rxq\n@@ -1421,6 +1467,7 @@ struct mlx5_obj_ops devx_obj_ops = {\n \t.rxq_event_get = mlx5_rx_devx_get_event,\n \t.rxq_obj_modify = mlx5_devx_modify_rq,\n \t.rxq_obj_release = mlx5_rxq_devx_obj_release,\n+\t.rxq_event_get_lwm = mlx5_rx_devx_get_event_lwm,\n \t.ind_table_new = mlx5_devx_ind_table_new,\n \t.ind_table_modify = mlx5_devx_ind_table_modify,\n \t.ind_table_destroy = mlx5_devx_ind_table_destroy,\ndiff --git a/drivers/net/mlx5/mlx5_rx.c b/drivers/net/mlx5/mlx5_rx.c\nindex e5eea0a..197d708 100644\n--- a/drivers/net/mlx5/mlx5_rx.c\n+++ b/drivers/net/mlx5/mlx5_rx.c\n@@ -1187,3 +1187,36 @@ int mlx5_get_monitor_addr(void *rx_queue, struct rte_power_monitor_cond *pmc)\n {\n \treturn -ENOTSUP;\n }\n+\n+/**\n+ * Rte interrupt handler for LWM event.\n+ * It first checks if the event arrives, if so process the callback for\n+ * RTE_ETH_EVENT_RX_LWM.\n+ *\n+ * @param args\n+ *   Generic pointer to mlx5_priv.\n+ */\n+void\n+mlx5_dev_interrupt_handler_lwm(void *args)\n+{\n+\tstruct mlx5_priv *priv = args;\n+\tstruct mlx5_rxq_priv *rxq;\n+\tstruct rte_eth_dev *dev;\n+\tint ret, rxq_idx = 0, port_id = 0;\n+\n+\tret = priv->obj_ops.rxq_event_get_lwm(priv, &rxq_idx, &port_id);\n+\tif (unlikely(ret < 0)) {\n+\t\tDRV_LOG(WARNING, \"Cannot get LWM event context.\");\n+\t\treturn;\n+\t}\n+\tDRV_LOG(INFO, \"%s get LWM event, port_id:%d rxq_id:%d.\", __func__,\n+\t\tport_id, rxq_idx);\n+\tdev = &rte_eth_devices[port_id];\n+\trxq = mlx5_rxq_get(dev, rxq_idx);\n+\tif (rxq) {\n+\t\tpthread_mutex_lock(&priv->sh->lwm_config_lock);\n+\t\trxq->lwm_event_pending = 1;\n+\t\tpthread_mutex_unlock(&priv->sh->lwm_config_lock);\n+\t}\n+\trte_eth_dev_callback_process(dev, RTE_ETH_EVENT_RX_AVAIL_THRESH, NULL);\n+}\ndiff --git a/drivers/net/mlx5/mlx5_rx.h b/drivers/net/mlx5/mlx5_rx.h\nindex 25a5f2c..068dff5 100644\n--- a/drivers/net/mlx5/mlx5_rx.h\n+++ b/drivers/net/mlx5/mlx5_rx.h\n@@ -176,6 +176,7 @@ struct mlx5_rxq_priv {\n \tstruct rte_eth_hairpin_conf hairpin_conf; /* Hairpin configuration. */\n \tuint32_t hairpin_status; /* Hairpin binding status. */\n \tuint32_t lwm:16;\n+\tuint32_t lwm_event_pending:1;\n };\n \n /* External RX queue descriptor. */\n@@ -295,6 +296,7 @@ void mlx5_rxq_info_get(struct rte_eth_dev *dev, uint16_t queue_id,\n int mlx5_rx_burst_mode_get(struct rte_eth_dev *dev, uint16_t rx_queue_id,\n \t\t\t   struct rte_eth_burst_mode *mode);\n int mlx5_get_monitor_addr(void *rx_queue, struct rte_power_monitor_cond *pmc);\n+void mlx5_dev_interrupt_handler_lwm(void *args);\n \n /* Vectorized version of mlx5_rx.c */\n int mlx5_rxq_check_vec_support(struct mlx5_rxq_data *rxq_data);\n@@ -675,4 +677,9 @@ uint16_t mlx5_rx_burst_mprq_vec(void *dpdk_rxq, struct rte_mbuf **pkts,\n \treturn !!__atomic_load_n(&rxq->refcnt, __ATOMIC_RELAXED);\n }\n \n+#define LWM_COOKIE_RXQID_OFFSET 0\n+#define LWM_COOKIE_RXQID_MASK 0xffff\n+#define LWM_COOKIE_PORTID_OFFSET 16\n+#define LWM_COOKIE_PORTID_MASK 0xffff\n+\n #endif /* RTE_PMD_MLX5_RX_H_ */\n",
    "prefixes": [
        "v9",
        "3/6"
    ]
}