get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 132001,
    "url": "http://patchwork.dpdk.org/api/patches/132001/?format=api",
    "web_url": "http://patchwork.dpdk.org/project/dpdk/patch/20230927114515.1245213-3-david.marchand@redhat.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": "<20230927114515.1245213-3-david.marchand@redhat.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20230927114515.1245213-3-david.marchand@redhat.com",
    "date": "2023-09-27T11:45:14",
    "name": "[v4,2/3] ethdev: avoid panicking in absence of ethdev shared data",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": true,
    "hash": "fa3ba8bf209cbf7763fea08f744b6378fb7dfa8e",
    "submitter": {
        "id": 1173,
        "url": "http://patchwork.dpdk.org/api/people/1173/?format=api",
        "name": "David Marchand",
        "email": "david.marchand@redhat.com"
    },
    "delegate": {
        "id": 1,
        "url": "http://patchwork.dpdk.org/api/users/1/?format=api",
        "username": "tmonjalo",
        "first_name": "Thomas",
        "last_name": "Monjalon",
        "email": "thomas@monjalon.net"
    },
    "mbox": "http://patchwork.dpdk.org/project/dpdk/patch/20230927114515.1245213-3-david.marchand@redhat.com/mbox/",
    "series": [
        {
            "id": 29654,
            "url": "http://patchwork.dpdk.org/api/series/29654/?format=api",
            "web_url": "http://patchwork.dpdk.org/project/dpdk/list/?series=29654",
            "date": "2023-09-27T11:45:12",
            "name": "Release ethdev shared memory on port cleanup",
            "version": 4,
            "mbox": "http://patchwork.dpdk.org/series/29654/mbox/"
        }
    ],
    "comments": "http://patchwork.dpdk.org/api/patches/132001/comments/",
    "check": "warning",
    "checks": "http://patchwork.dpdk.org/api/patches/132001/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 4DD1D42651;\n\tWed, 27 Sep 2023 13:45:35 +0200 (CEST)",
            "from mails.dpdk.org (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 4E8DD402F0;\n\tWed, 27 Sep 2023 13:45:32 +0200 (CEST)",
            "from us-smtp-delivery-124.mimecast.com\n (us-smtp-delivery-124.mimecast.com [170.10.133.124])\n by mails.dpdk.org (Postfix) with ESMTP id 6AD92402E9\n for <dev@dpdk.org>; Wed, 27 Sep 2023 13:45:30 +0200 (CEST)",
            "from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com\n [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS\n (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id\n us-mta-10-eeuOHZ7dOBq2xBamYVbJ8A-1; Wed, 27 Sep 2023 07:45:25 -0400",
            "from smtp.corp.redhat.com (int-mx08.intmail.prod.int.rdu2.redhat.com\n [10.11.54.8])\n (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))\n (No client certificate requested)\n by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 333A580D69A;\n Wed, 27 Sep 2023 11:45:25 +0000 (UTC)",
            "from dmarchan.redhat.com (unknown [10.45.224.48])\n by smtp.corp.redhat.com (Postfix) with ESMTP id 21159C15BB8;\n Wed, 27 Sep 2023 11:45:23 +0000 (UTC)"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com;\n s=mimecast20190719; t=1695815129;\n h=from:from:reply-to:subject:subject:date:date:message-id:message-id:\n to:to:cc:cc:mime-version:mime-version:content-type:content-type:\n content-transfer-encoding:content-transfer-encoding:\n in-reply-to:in-reply-to:references:references;\n bh=t3QZkLxMozZYwtm6l/e7tTv4v5o+z9+056wyl+Q7ylA=;\n b=HuaKoyGtmRtEsf/JWg9Oy1WO4rWho52q4qp2Bdvh7h3QJBDfb6QH7T1clilHkGYNrQyNmg\n BajOyDmFUeMbyt8r7eBR3ys4S7nXZP8BAG+J7M4pSwLPIoej8rdzA4c1hhKoGk5h/5IgYw\n +mHKn3pLz4+Z+WBXOWZILGmj4SW3R9o=",
        "X-MC-Unique": "eeuOHZ7dOBq2xBamYVbJ8A-1",
        "From": "David Marchand <david.marchand@redhat.com>",
        "To": "dev@dpdk.org",
        "Cc": "probb@iol.unh.edu, Thomas Monjalon <thomas@monjalon.net>,\n Ferruh Yigit <ferruh.yigit@amd.com>,\n Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>",
        "Subject": "[PATCH v4 2/3] ethdev: avoid panicking in absence of ethdev shared\n data",
        "Date": "Wed, 27 Sep 2023 13:45:14 +0200",
        "Message-ID": "<20230927114515.1245213-3-david.marchand@redhat.com>",
        "In-Reply-To": "<20230927114515.1245213-1-david.marchand@redhat.com>",
        "References": "<20230818091321.2404089-1-david.marchand@redhat.com>\n <20230927114515.1245213-1-david.marchand@redhat.com>",
        "MIME-Version": "1.0",
        "X-Scanned-By": "MIMEDefang 3.1 on 10.11.54.8",
        "X-Mimecast-Spam-Score": "0",
        "X-Mimecast-Originator": "redhat.com",
        "Content-Transfer-Encoding": "8bit",
        "Content-Type": "text/plain; charset=\"US-ASCII\"; x-default=true",
        "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": "This is a preparation step before freeing the ethdev shared data\nmemzone.\n\nPreviously, because the primary process never freed the memzone, a\nsecondary process could assume this memzone was present.\nBut in the next commit, this will change.\n\nMake eth_dev_shared_data_prepare() report whether the memzone is\navailable so that upper level API can react accordingly.\n\nSigned-off-by: David Marchand <david.marchand@redhat.com>\n---\n lib/ethdev/ethdev_driver.c  | 23 ++++++++++++++-----\n lib/ethdev/ethdev_private.c | 10 +++++---\n lib/ethdev/ethdev_private.h |  2 +-\n lib/ethdev/ethdev_trace.h   |  6 +++--\n lib/ethdev/rte_ethdev.c     | 46 +++++++++++++++++++++++++------------\n 5 files changed, 60 insertions(+), 27 deletions(-)",
    "diff": "diff --git a/lib/ethdev/ethdev_driver.c b/lib/ethdev/ethdev_driver.c\nindex c92cd4b947..b339e325a0 100644\n--- a/lib/ethdev/ethdev_driver.c\n+++ b/lib/ethdev/ethdev_driver.c\n@@ -92,7 +92,8 @@ rte_eth_dev_allocate(const char *name)\n \t/* Synchronize port creation between primary and secondary processes. */\n \trte_spinlock_lock(rte_mcfg_ethdev_get_lock());\n \n-\teth_dev_shared_data_prepare();\n+\tif (eth_dev_shared_data_prepare() == NULL)\n+\t\tgoto unlock;\n \n \tif (eth_dev_allocated(name) != NULL) {\n \t\tRTE_ETHDEV_LOG(ERR,\n@@ -128,9 +129,10 @@ rte_eth_dev_allocated(const char *name)\n \n \trte_spinlock_lock(rte_mcfg_ethdev_get_lock());\n \n-\teth_dev_shared_data_prepare();\n-\n-\tethdev = eth_dev_allocated(name);\n+\tif (eth_dev_shared_data_prepare() != NULL)\n+\t\tethdev = eth_dev_allocated(name);\n+\telse\n+\t\tethdev = NULL;\n \n \trte_spinlock_unlock(rte_mcfg_ethdev_get_lock());\n \n@@ -151,7 +153,8 @@ rte_eth_dev_attach_secondary(const char *name)\n \t/* Synchronize port attachment to primary port creation and release. */\n \trte_spinlock_lock(rte_mcfg_ethdev_get_lock());\n \n-\teth_dev_shared_data_prepare();\n+\tif (eth_dev_shared_data_prepare() == NULL)\n+\t\tgoto unlock;\n \n \tfor (i = 0; i < RTE_MAX_ETHPORTS; i++) {\n \t\tif (strcmp(eth_dev_shared_data->data[i].name, name) == 0)\n@@ -166,6 +169,7 @@ rte_eth_dev_attach_secondary(const char *name)\n \t\tRTE_ASSERT(eth_dev->data->port_id == i);\n \t}\n \n+unlock:\n \trte_spinlock_unlock(rte_mcfg_ethdev_get_lock());\n \treturn eth_dev;\n }\n@@ -219,12 +223,19 @@ rte_eth_dev_probing_finish(struct rte_eth_dev *dev)\n int\n rte_eth_dev_release_port(struct rte_eth_dev *eth_dev)\n {\n+\tint ret;\n+\n \tif (eth_dev == NULL)\n \t\treturn -EINVAL;\n \n \trte_spinlock_lock(rte_mcfg_ethdev_get_lock());\n-\teth_dev_shared_data_prepare();\n+\tif (eth_dev_shared_data_prepare() == NULL)\n+\t\tret = -EINVAL;\n+\telse\n+\t\tret = 0;\n \trte_spinlock_unlock(rte_mcfg_ethdev_get_lock());\n+\tif (ret != 0)\n+\t\treturn ret;\n \n \tif (eth_dev->state != RTE_ETH_DEV_UNUSED)\n \t\trte_eth_dev_callback_process(eth_dev,\ndiff --git a/lib/ethdev/ethdev_private.c b/lib/ethdev/ethdev_private.c\nindex 6756625729..911de1e595 100644\n--- a/lib/ethdev/ethdev_private.c\n+++ b/lib/ethdev/ethdev_private.c\n@@ -318,7 +318,7 @@ rte_eth_call_tx_callbacks(uint16_t port_id, uint16_t queue_id,\n \treturn nb_pkts;\n }\n \n-void\n+void *\n eth_dev_shared_data_prepare(void)\n {\n \tconst unsigned int flags = 0;\n@@ -332,8 +332,10 @@ eth_dev_shared_data_prepare(void)\n \t\t\t\t\trte_socket_id(), flags);\n \t\t} else\n \t\t\tmz = rte_memzone_lookup(MZ_RTE_ETH_DEV_DATA);\n-\t\tif (mz == NULL)\n-\t\t\trte_panic(\"Cannot allocate ethdev shared data\\n\");\n+\t\tif (mz == NULL) {\n+\t\t\tRTE_ETHDEV_LOG(ERR, \"Cannot allocate ethdev shared data\\n\");\n+\t\t\tgoto out;\n+\t\t}\n \n \t\teth_dev_shared_data = mz->addr;\n \t\tif (rte_eal_process_type() == RTE_PROC_PRIMARY) {\n@@ -343,6 +345,8 @@ eth_dev_shared_data_prepare(void)\n \t\t\t       sizeof(eth_dev_shared_data->data));\n \t\t}\n \t}\n+out:\n+\treturn eth_dev_shared_data;\n }\n \n void\ndiff --git a/lib/ethdev/ethdev_private.h b/lib/ethdev/ethdev_private.h\nindex f7706e6a95..1572da7b48 100644\n--- a/lib/ethdev/ethdev_private.h\n+++ b/lib/ethdev/ethdev_private.h\n@@ -67,7 +67,7 @@ void eth_dev_fp_ops_setup(struct rte_eth_fp_ops *fpo,\n \t\tconst struct rte_eth_dev *dev);\n \n \n-void eth_dev_shared_data_prepare(void)\n+void *eth_dev_shared_data_prepare(void)\n \t__rte_exclusive_locks_required(rte_mcfg_ethdev_get_lock());\n \n void eth_dev_rxq_release(struct rte_eth_dev *dev, uint16_t qid);\ndiff --git a/lib/ethdev/ethdev_trace.h b/lib/ethdev/ethdev_trace.h\nindex 423e71236e..e367d29c3a 100644\n--- a/lib/ethdev/ethdev_trace.h\n+++ b/lib/ethdev/ethdev_trace.h\n@@ -112,8 +112,9 @@ RTE_TRACE_POINT(\n \n RTE_TRACE_POINT(\n \trte_ethdev_trace_owner_new,\n-\tRTE_TRACE_POINT_ARGS(uint64_t owner_id),\n+\tRTE_TRACE_POINT_ARGS(uint64_t owner_id, int ret),\n \trte_trace_point_emit_u64(owner_id);\n+\trte_trace_point_emit_int(ret);\n )\n \n RTE_TRACE_POINT(\n@@ -377,10 +378,11 @@ RTE_TRACE_POINT(\n RTE_TRACE_POINT(\n \trte_ethdev_trace_owner_get,\n \tRTE_TRACE_POINT_ARGS(uint16_t port_id,\n-\t\tconst struct rte_eth_dev_owner *owner),\n+\t\tconst struct rte_eth_dev_owner *owner, int ret),\n \trte_trace_point_emit_u16(port_id);\n \trte_trace_point_emit_u64(owner->id);\n \trte_trace_point_emit_string(owner->name);\n+\trte_trace_point_emit_int(ret);\n )\n \n RTE_TRACE_POINT(\ndiff --git a/lib/ethdev/rte_ethdev.c b/lib/ethdev/rte_ethdev.c\nindex e0d22c27c6..5c9495ecfe 100644\n--- a/lib/ethdev/rte_ethdev.c\n+++ b/lib/ethdev/rte_ethdev.c\n@@ -388,7 +388,7 @@ rte_eth_find_next_sibling(uint16_t port_id, uint16_t ref_port_id)\n static bool\n eth_dev_is_allocated(const struct rte_eth_dev *ethdev)\n {\n-\treturn ethdev->data->name[0] != '\\0';\n+\treturn ethdev->data != NULL && ethdev->data->name[0] != '\\0';\n }\n \n int\n@@ -433,6 +433,8 @@ rte_eth_find_next_owned_by(uint16_t port_id, const uint64_t owner_id)\n int\n rte_eth_dev_owner_new(uint64_t *owner_id)\n {\n+\tint ret;\n+\n \tif (owner_id == NULL) {\n \t\tRTE_ETHDEV_LOG(ERR, \"Cannot get new owner ID to NULL\\n\");\n \t\treturn -EINVAL;\n@@ -440,14 +442,18 @@ rte_eth_dev_owner_new(uint64_t *owner_id)\n \n \trte_spinlock_lock(rte_mcfg_ethdev_get_lock());\n \n-\teth_dev_shared_data_prepare();\n-\t*owner_id = eth_dev_shared_data->next_owner_id++;\n+\tif (eth_dev_shared_data_prepare() != NULL) {\n+\t\t*owner_id = eth_dev_shared_data->next_owner_id++;\n+\t\tret = 0;\n+\t} else {\n+\t\tret = -ENOMEM;\n+\t}\n \n \trte_spinlock_unlock(rte_mcfg_ethdev_get_lock());\n \n-\trte_ethdev_trace_owner_new(*owner_id);\n+\trte_ethdev_trace_owner_new(*owner_id, ret);\n \n-\treturn 0;\n+\treturn ret;\n }\n \n static int\n@@ -506,8 +512,10 @@ rte_eth_dev_owner_set(const uint16_t port_id,\n \n \trte_spinlock_lock(rte_mcfg_ethdev_get_lock());\n \n-\teth_dev_shared_data_prepare();\n-\tret = eth_dev_owner_set(port_id, RTE_ETH_DEV_NO_OWNER, owner);\n+\tif (eth_dev_shared_data_prepare() != NULL)\n+\t\tret = eth_dev_owner_set(port_id, RTE_ETH_DEV_NO_OWNER, owner);\n+\telse\n+\t\tret = -ENOMEM;\n \n \trte_spinlock_unlock(rte_mcfg_ethdev_get_lock());\n \n@@ -525,8 +533,10 @@ rte_eth_dev_owner_unset(const uint16_t port_id, const uint64_t owner_id)\n \n \trte_spinlock_lock(rte_mcfg_ethdev_get_lock());\n \n-\teth_dev_shared_data_prepare();\n-\tret = eth_dev_owner_set(port_id, owner_id, &new_owner);\n+\tif (eth_dev_shared_data_prepare() != NULL)\n+\t\tret = eth_dev_owner_set(port_id, owner_id, &new_owner);\n+\telse\n+\t\tret = -ENOMEM;\n \n \trte_spinlock_unlock(rte_mcfg_ethdev_get_lock());\n \n@@ -543,8 +553,9 @@ rte_eth_dev_owner_delete(const uint64_t owner_id)\n \n \trte_spinlock_lock(rte_mcfg_ethdev_get_lock());\n \n-\teth_dev_shared_data_prepare();\n-\tif (eth_is_valid_owner_id(owner_id)) {\n+\tif (eth_dev_shared_data_prepare() == NULL) {\n+\t\tret = -ENOMEM;\n+\t} else if (eth_is_valid_owner_id(owner_id)) {\n \t\tfor (port_id = 0; port_id < RTE_MAX_ETHPORTS; port_id++) {\n \t\t\tstruct rte_eth_dev_data *data =\n \t\t\t\trte_eth_devices[port_id].data;\n@@ -573,6 +584,7 @@ int\n rte_eth_dev_owner_get(const uint16_t port_id, struct rte_eth_dev_owner *owner)\n {\n \tstruct rte_eth_dev *ethdev;\n+\tint ret;\n \n \tRTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);\n \tethdev = &rte_eth_devices[port_id];\n@@ -591,14 +603,18 @@ rte_eth_dev_owner_get(const uint16_t port_id, struct rte_eth_dev_owner *owner)\n \n \trte_spinlock_lock(rte_mcfg_ethdev_get_lock());\n \n-\teth_dev_shared_data_prepare();\n-\trte_memcpy(owner, &ethdev->data->owner, sizeof(*owner));\n+\tif (eth_dev_shared_data_prepare() != NULL) {\n+\t\trte_memcpy(owner, &ethdev->data->owner, sizeof(*owner));\n+\t\tret = 0;\n+\t} else {\n+\t\tret = -ENOMEM;\n+\t}\n \n \trte_spinlock_unlock(rte_mcfg_ethdev_get_lock());\n \n-\trte_ethdev_trace_owner_get(port_id, owner);\n+\trte_ethdev_trace_owner_get(port_id, owner, ret);\n \n-\treturn 0;\n+\treturn ret;\n }\n \n int\n",
    "prefixes": [
        "v4",
        "2/3"
    ]
}