get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 130552,
    "url": "http://patches.dpdk.org/api/patches/130552/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/20230821085806.3062613-3-david.marchand@redhat.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": "<20230821085806.3062613-3-david.marchand@redhat.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20230821085806.3062613-3-david.marchand@redhat.com",
    "date": "2023-08-21T08:58:05",
    "name": "[v3,2/3] ethdev: avoid panicking in absence of ethdev shared data",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "fa3ba8bf209cbf7763fea08f744b6378fb7dfa8e",
    "submitter": {
        "id": 1173,
        "url": "http://patches.dpdk.org/api/people/1173/?format=api",
        "name": "David Marchand",
        "email": "david.marchand@redhat.com"
    },
    "delegate": {
        "id": 1,
        "url": "http://patches.dpdk.org/api/users/1/?format=api",
        "username": "tmonjalo",
        "first_name": "Thomas",
        "last_name": "Monjalon",
        "email": "thomas@monjalon.net"
    },
    "mbox": "http://patches.dpdk.org/project/dpdk/patch/20230821085806.3062613-3-david.marchand@redhat.com/mbox/",
    "series": [
        {
            "id": 29288,
            "url": "http://patches.dpdk.org/api/series/29288/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=29288",
            "date": "2023-08-21T08:58:03",
            "name": "Release ethdev shared memory on port cleanup",
            "version": 3,
            "mbox": "http://patches.dpdk.org/series/29288/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/130552/comments/",
    "check": "warning",
    "checks": "http://patches.dpdk.org/api/patches/130552/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 88B2C430BE;\n\tMon, 21 Aug 2023 10:58:34 +0200 (CEST)",
            "from mails.dpdk.org (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 711DF43251;\n\tMon, 21 Aug 2023 10:58:25 +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 DD45443245\n for <dev@dpdk.org>; Mon, 21 Aug 2023 10:58:21 +0200 (CEST)",
            "from mimecast-mx02.redhat.com (66.187.233.73 [66.187.233.73]) by\n relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2,\n cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id\n us-mta-492-wFYvGrF0NIa7xh5HW2DUdw-1; Mon, 21 Aug 2023 04:58:18 -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 AECDH-AES256-SHA (256/256 bits))\n (No client certificate requested)\n by mimecast-mx02.redhat.com (Postfix) with ESMTPS id A5BDE1C02144;\n Mon, 21 Aug 2023 08:58:17 +0000 (UTC)",
            "from dmarchan.redhat.com (unknown [10.45.226.19])\n by smtp.corp.redhat.com (Postfix) with ESMTP id 9DF05C15BAE;\n Mon, 21 Aug 2023 08:58:16 +0000 (UTC)"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com;\n s=mimecast20190719; t=1692608301;\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=IGrB95S7UPjQ7HdqD5xLRpnELc/cdASnPrFPKodtACY=;\n b=J1OGBue5cwBqVuRFZTHbtB2+UOMo1B02f2qRS+7/Lhllms54iydBg2RkR/MtLh0aEe4ftf\n qNRiUxHPmjvaacfAampwjLMwkY1OG7Ykb8+k4jUi384aDo7rAyE87eVFnWAv9yoyupOA/f\n TvLCWT8xQQ5wbH1vweyojr4fdiGU+Gk=",
        "X-MC-Unique": "wFYvGrF0NIa7xh5HW2DUdw-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 v3 2/3] ethdev: avoid panicking in absence of ethdev shared\n data",
        "Date": "Mon, 21 Aug 2023 10:58:05 +0200",
        "Message-ID": "<20230821085806.3062613-3-david.marchand@redhat.com>",
        "In-Reply-To": "<20230821085806.3062613-1-david.marchand@redhat.com>",
        "References": "<20230818091321.2404089-1-david.marchand@redhat.com>\n <20230821085806.3062613-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.\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 5bb9c3f97c..f04666f3a2 100644\n--- a/lib/ethdev/ethdev_driver.c\n+++ b/lib/ethdev/ethdev_driver.c\n@@ -91,7 +91,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@@ -127,9 +128,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@@ -150,7 +152,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@@ -165,6 +168,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@@ -218,12 +222,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 b91191b554..ea430d8bab 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": [
        "v3",
        "2/3"
    ]
}