get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 132000,
    "url": "http://patches.dpdk.org/api/patches/132000/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/20230927114515.1245213-2-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": "<20230927114515.1245213-2-david.marchand@redhat.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20230927114515.1245213-2-david.marchand@redhat.com",
    "date": "2023-09-27T11:45:13",
    "name": "[v4,1/3] ethdev: protect shared memory accesses under one lock",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": true,
    "hash": "59fe28e380b336fa6439aa158a8685bd1dae48fd",
    "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/20230927114515.1245213-2-david.marchand@redhat.com/mbox/",
    "series": [
        {
            "id": 29654,
            "url": "http://patches.dpdk.org/api/series/29654/?format=api",
            "web_url": "http://patches.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://patches.dpdk.org/series/29654/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/132000/comments/",
    "check": "warning",
    "checks": "http://patches.dpdk.org/api/patches/132000/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 3006842651;\n\tWed, 27 Sep 2023 13:45:30 +0200 (CEST)",
            "from mails.dpdk.org (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 1ECAE402E4;\n\tWed, 27 Sep 2023 13:45:30 +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 4C72B402D3\n for <dev@dpdk.org>; Wed, 27 Sep 2023 13:45:28 +0200 (CEST)",
            "from mimecast-mx02.redhat.com (mx-ext.redhat.com [66.187.233.73])\n by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2,\n cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id\n us-mta-628-FJgvy9zPPf622JPXJF2yvg-1; Wed, 27 Sep 2023 07:45:22 -0400",
            "from smtp.corp.redhat.com (int-mx10.intmail.prod.int.rdu2.redhat.com\n [10.11.54.10])\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 04908280FEC5;\n Wed, 27 Sep 2023 11:45:22 +0000 (UTC)",
            "from dmarchan.redhat.com (unknown [10.45.224.48])\n by smtp.corp.redhat.com (Postfix) with ESMTP id 450F1492C37;\n Wed, 27 Sep 2023 11:45:20 +0000 (UTC)"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com;\n s=mimecast20190719; t=1695815127;\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=9y5MYAl0N+RzfQbjuRsYDe6ZD7mY6o9mRHixPU7pHt8=;\n b=UGsK7PKB+7IZdf5ROrJF8oKkteV9ejuxrmqLbf0xPs24hM5aM++C1PidhYaTKl4NiOnMoV\n rSb3w+Q5OnCCfWBwsVRLLP5oYHeTTaW1UpHG7X2K+B+LycIk1FZQKwDwofGHyHX25JlkOD\n LrNCW+u3V01SEXDVWzGuEhJMNtHuAdU=",
        "X-MC-Unique": "FJgvy9zPPf622JPXJF2yvg-1",
        "From": "David Marchand <david.marchand@redhat.com>",
        "To": "dev@dpdk.org",
        "Cc": "probb@iol.unh.edu,\n =?utf-8?q?Morten_Br=C3=B8rup?= <mb@smartsharesystems.com>,\n Thomas Monjalon <thomas@monjalon.net>, Ferruh Yigit <ferruh.yigit@amd.com>,\n Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>",
        "Subject": "[PATCH v4 1/3] ethdev: protect shared memory accesses under one lock",
        "Date": "Wed, 27 Sep 2023 13:45:13 +0200",
        "Message-ID": "<20230927114515.1245213-2-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.10",
        "X-Mimecast-Spam-Score": "0",
        "X-Mimecast-Originator": "redhat.com",
        "Content-Type": "text/plain; charset=UTF-8",
        "Content-Transfer-Encoding": "8bit",
        "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": "ethdev currently uses two locks to protect access around\neth_dev_shared_data:\n- one (process local) for avoiding multiple threads to reserve/lookup\n  the eth_dev_shared_data memzone,\n- one (shared with other processes) for protecting port\n  allocation/destruction,\n\nA next change will make it possible for eth_dev_shared_data memzone to\nbe freed during a DPDK application lifetime. Accessing its content must\nthen be protected for concurrent accesses and with this new protection,\nexisting locks become unneeded.\n\nSimplify the logic and put everything under a single lock in DPDK shared\nmemory config (which cannot be freed during a DPDK application lifetime).\n\nSigned-off-by: David Marchand <david.marchand@redhat.com>\nAcked-by: Morten Brørup <mb@smartsharesystems.com>\n---\nChanges since v3:\n- updated commitlog,\n\n---\n lib/eal/common/eal_common_mcfg.c    |  6 +++\n lib/eal/common/eal_memcfg.h         |  1 +\n lib/eal/include/rte_eal_memconfig.h |  4 ++\n lib/eal/version.map                 |  1 +\n lib/ethdev/ethdev_driver.c          | 30 ++++++++-------\n lib/ethdev/ethdev_private.c         |  9 -----\n lib/ethdev/ethdev_private.h         |  9 +++--\n lib/ethdev/rte_ethdev.c             | 60 ++++++++++++++++-------------\n 8 files changed, 68 insertions(+), 52 deletions(-)",
    "diff": "diff --git a/lib/eal/common/eal_common_mcfg.c b/lib/eal/common/eal_common_mcfg.c\nindex b60d41f7b6..2a785e74c4 100644\n--- a/lib/eal/common/eal_common_mcfg.c\n+++ b/lib/eal/common/eal_common_mcfg.c\n@@ -177,6 +177,12 @@ rte_mcfg_timer_unlock(void)\n \trte_spinlock_unlock(rte_mcfg_timer_get_lock());\n }\n \n+rte_spinlock_t *\n+rte_mcfg_ethdev_get_lock(void)\n+{\n+\treturn &rte_eal_get_configuration()->mem_config->ethdev_lock;\n+}\n+\n bool\n rte_mcfg_get_single_file_segments(void)\n {\ndiff --git a/lib/eal/common/eal_memcfg.h b/lib/eal/common/eal_memcfg.h\nindex 8889ba063f..d5c63e2f4d 100644\n--- a/lib/eal/common/eal_memcfg.h\n+++ b/lib/eal/common/eal_memcfg.h\n@@ -37,6 +37,7 @@ struct rte_mem_config {\n \trte_rwlock_t qlock;   /**< used by tailqs for thread safety. */\n \trte_rwlock_t mplock;  /**< used by mempool library for thread safety. */\n \trte_spinlock_t tlock; /**< used by timer library for thread safety. */\n+\trte_spinlock_t ethdev_lock; /**< used by ethdev library. */\n \n \trte_rwlock_t memory_hotplug_lock;\n \t/**< Indicates whether memory hotplug request is in progress. */\ndiff --git a/lib/eal/include/rte_eal_memconfig.h b/lib/eal/include/rte_eal_memconfig.h\nindex c527f9aa29..0b1d0d4ff0 100644\n--- a/lib/eal/include/rte_eal_memconfig.h\n+++ b/lib/eal/include/rte_eal_memconfig.h\n@@ -39,6 +39,10 @@ __rte_internal\n rte_spinlock_t *\n rte_mcfg_timer_get_lock(void);\n \n+__rte_internal\n+rte_spinlock_t *\n+rte_mcfg_ethdev_get_lock(void);\n+\n /**\n  * Lock the internal EAL shared memory configuration for shared access.\n  */\ndiff --git a/lib/eal/version.map b/lib/eal/version.map\nindex 915057b325..e00a844805 100644\n--- a/lib/eal/version.map\n+++ b/lib/eal/version.map\n@@ -452,6 +452,7 @@ INTERNAL {\n \trte_intr_vec_list_free;\n \trte_intr_vec_list_index_get;\n \trte_intr_vec_list_index_set;\n+\trte_mcfg_ethdev_get_lock;\n \trte_mcfg_mem_get_lock;\n \trte_mcfg_mempool_get_lock;\n \trte_mcfg_tailq_get_lock;\ndiff --git a/lib/ethdev/ethdev_driver.c b/lib/ethdev/ethdev_driver.c\nindex 30db839a77..c92cd4b947 100644\n--- a/lib/ethdev/ethdev_driver.c\n+++ b/lib/ethdev/ethdev_driver.c\n@@ -45,6 +45,7 @@ eth_dev_allocated(const char *name)\n \n static uint16_t\n eth_dev_find_free_port(void)\n+\t__rte_exclusive_locks_required(rte_mcfg_ethdev_get_lock())\n {\n \tuint16_t i;\n \n@@ -61,6 +62,7 @@ eth_dev_find_free_port(void)\n \n static struct rte_eth_dev *\n eth_dev_get(uint16_t port_id)\n+\t__rte_exclusive_locks_required(rte_mcfg_ethdev_get_lock())\n {\n \tstruct rte_eth_dev *eth_dev = &rte_eth_devices[port_id];\n \n@@ -87,10 +89,10 @@ rte_eth_dev_allocate(const char *name)\n \t\treturn NULL;\n \t}\n \n-\teth_dev_shared_data_prepare();\n+\t/* Synchronize port creation between primary and secondary processes. */\n+\trte_spinlock_lock(rte_mcfg_ethdev_get_lock());\n \n-\t/* Synchronize port creation between primary and secondary threads. */\n-\trte_spinlock_lock(&eth_dev_shared_data->ownership_lock);\n+\teth_dev_shared_data_prepare();\n \n \tif (eth_dev_allocated(name) != NULL) {\n \t\tRTE_ETHDEV_LOG(ERR,\n@@ -114,7 +116,7 @@ rte_eth_dev_allocate(const char *name)\n \tpthread_mutex_init(&eth_dev->data->flow_ops_mutex, NULL);\n \n unlock:\n-\trte_spinlock_unlock(&eth_dev_shared_data->ownership_lock);\n+\trte_spinlock_unlock(rte_mcfg_ethdev_get_lock());\n \n \treturn eth_dev;\n }\n@@ -124,13 +126,13 @@ rte_eth_dev_allocated(const char *name)\n {\n \tstruct rte_eth_dev *ethdev;\n \n-\teth_dev_shared_data_prepare();\n+\trte_spinlock_lock(rte_mcfg_ethdev_get_lock());\n \n-\trte_spinlock_lock(&eth_dev_shared_data->ownership_lock);\n+\teth_dev_shared_data_prepare();\n \n \tethdev = eth_dev_allocated(name);\n \n-\trte_spinlock_unlock(&eth_dev_shared_data->ownership_lock);\n+\trte_spinlock_unlock(rte_mcfg_ethdev_get_lock());\n \n \treturn ethdev;\n }\n@@ -146,10 +148,10 @@ rte_eth_dev_attach_secondary(const char *name)\n \tuint16_t i;\n \tstruct rte_eth_dev *eth_dev = NULL;\n \n-\teth_dev_shared_data_prepare();\n-\n \t/* Synchronize port attachment to primary port creation and release. */\n-\trte_spinlock_lock(&eth_dev_shared_data->ownership_lock);\n+\trte_spinlock_lock(rte_mcfg_ethdev_get_lock());\n+\n+\teth_dev_shared_data_prepare();\n \n \tfor (i = 0; i < RTE_MAX_ETHPORTS; i++) {\n \t\tif (strcmp(eth_dev_shared_data->data[i].name, name) == 0)\n@@ -164,7 +166,7 @@ rte_eth_dev_attach_secondary(const char *name)\n \t\tRTE_ASSERT(eth_dev->data->port_id == i);\n \t}\n \n-\trte_spinlock_unlock(&eth_dev_shared_data->ownership_lock);\n+\trte_spinlock_unlock(rte_mcfg_ethdev_get_lock());\n \treturn eth_dev;\n }\n \n@@ -220,7 +222,9 @@ rte_eth_dev_release_port(struct rte_eth_dev *eth_dev)\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+\trte_spinlock_unlock(rte_mcfg_ethdev_get_lock());\n \n \tif (eth_dev->state != RTE_ETH_DEV_UNUSED)\n \t\trte_eth_dev_callback_process(eth_dev,\n@@ -228,7 +232,7 @@ rte_eth_dev_release_port(struct rte_eth_dev *eth_dev)\n \n \teth_dev_fp_ops_reset(rte_eth_fp_ops + eth_dev->data->port_id);\n \n-\trte_spinlock_lock(&eth_dev_shared_data->ownership_lock);\n+\trte_spinlock_lock(rte_mcfg_ethdev_get_lock());\n \n \teth_dev->state = RTE_ETH_DEV_UNUSED;\n \teth_dev->device = NULL;\n@@ -252,7 +256,7 @@ rte_eth_dev_release_port(struct rte_eth_dev *eth_dev)\n \t\tmemset(eth_dev->data, 0, sizeof(struct rte_eth_dev_data));\n \t}\n \n-\trte_spinlock_unlock(&eth_dev_shared_data->ownership_lock);\n+\trte_spinlock_unlock(rte_mcfg_ethdev_get_lock());\n \n \treturn 0;\n }\ndiff --git a/lib/ethdev/ethdev_private.c b/lib/ethdev/ethdev_private.c\nindex 14ec8c6ccf..6756625729 100644\n--- a/lib/ethdev/ethdev_private.c\n+++ b/lib/ethdev/ethdev_private.c\n@@ -11,12 +11,8 @@\n \n static const char *MZ_RTE_ETH_DEV_DATA = \"rte_eth_dev_data\";\n \n-/* Shared memory between primary and secondary processes. */\n struct eth_dev_shared *eth_dev_shared_data;\n \n-/* spinlock for shared data allocation */\n-static rte_spinlock_t eth_dev_shared_data_lock = RTE_SPINLOCK_INITIALIZER;\n-\n /* spinlock for eth device callbacks */\n rte_spinlock_t eth_dev_cb_lock = RTE_SPINLOCK_INITIALIZER;\n \n@@ -328,8 +324,6 @@ eth_dev_shared_data_prepare(void)\n \tconst unsigned int flags = 0;\n \tconst struct rte_memzone *mz;\n \n-\trte_spinlock_lock(&eth_dev_shared_data_lock);\n-\n \tif (eth_dev_shared_data == NULL) {\n \t\tif (rte_eal_process_type() == RTE_PROC_PRIMARY) {\n \t\t\t/* Allocate port data and ownership shared memory. */\n@@ -345,13 +339,10 @@ eth_dev_shared_data_prepare(void)\n \t\tif (rte_eal_process_type() == RTE_PROC_PRIMARY) {\n \t\t\teth_dev_shared_data->next_owner_id =\n \t\t\t\t\tRTE_ETH_DEV_NO_OWNER + 1;\n-\t\t\trte_spinlock_init(&eth_dev_shared_data->ownership_lock);\n \t\t\tmemset(eth_dev_shared_data->data, 0,\n \t\t\t       sizeof(eth_dev_shared_data->data));\n \t\t}\n \t}\n-\n-\trte_spinlock_unlock(&eth_dev_shared_data_lock);\n }\n \n void\ndiff --git a/lib/ethdev/ethdev_private.h b/lib/ethdev/ethdev_private.h\nindex acb4b335c8..f7706e6a95 100644\n--- a/lib/ethdev/ethdev_private.h\n+++ b/lib/ethdev/ethdev_private.h\n@@ -7,6 +7,7 @@\n \n #include <sys/queue.h>\n \n+#include <rte_eal_memconfig.h>\n #include <rte_malloc.h>\n #include <rte_os_shim.h>\n \n@@ -14,11 +15,12 @@\n \n struct eth_dev_shared {\n \tuint64_t next_owner_id;\n-\trte_spinlock_t ownership_lock;\n \tstruct rte_eth_dev_data data[RTE_MAX_ETHPORTS];\n };\n \n-extern struct eth_dev_shared *eth_dev_shared_data;\n+/* Shared memory between primary and secondary processes. */\n+extern struct eth_dev_shared *eth_dev_shared_data\n+\t__rte_guarded_by(rte_mcfg_ethdev_get_lock());\n \n /**\n  * The user application callback description.\n@@ -65,7 +67,8 @@ 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);\n void eth_dev_txq_release(struct rte_eth_dev *dev, uint16_t qid);\ndiff --git a/lib/ethdev/rte_ethdev.c b/lib/ethdev/rte_ethdev.c\nindex 46eaed6467..e0d22c27c6 100644\n--- a/lib/ethdev/rte_ethdev.c\n+++ b/lib/ethdev/rte_ethdev.c\n@@ -409,6 +409,7 @@ rte_eth_dev_is_valid_port(uint16_t port_id)\n \n static int\n eth_is_valid_owner_id(uint64_t owner_id)\n+\t__rte_exclusive_locks_required(rte_mcfg_ethdev_get_lock())\n {\n \tif (owner_id == RTE_ETH_DEV_NO_OWNER ||\n \t    eth_dev_shared_data->next_owner_id <= owner_id)\n@@ -437,13 +438,12 @@ rte_eth_dev_owner_new(uint64_t *owner_id)\n \t\treturn -EINVAL;\n \t}\n \n-\teth_dev_shared_data_prepare();\n-\n-\trte_spinlock_lock(&eth_dev_shared_data->ownership_lock);\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 \n-\trte_spinlock_unlock(&eth_dev_shared_data->ownership_lock);\n+\trte_spinlock_unlock(rte_mcfg_ethdev_get_lock());\n \n \trte_ethdev_trace_owner_new(*owner_id);\n \n@@ -453,6 +453,7 @@ rte_eth_dev_owner_new(uint64_t *owner_id)\n static int\n eth_dev_owner_set(const uint16_t port_id, const uint64_t old_owner_id,\n \t\t       const struct rte_eth_dev_owner *new_owner)\n+\t__rte_exclusive_locks_required(rte_mcfg_ethdev_get_lock())\n {\n \tstruct rte_eth_dev *ethdev = &rte_eth_devices[port_id];\n \tstruct rte_eth_dev_owner *port_owner;\n@@ -503,13 +504,12 @@ rte_eth_dev_owner_set(const uint16_t port_id,\n {\n \tint ret;\n \n-\teth_dev_shared_data_prepare();\n-\n-\trte_spinlock_lock(&eth_dev_shared_data->ownership_lock);\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 \n-\trte_spinlock_unlock(&eth_dev_shared_data->ownership_lock);\n+\trte_spinlock_unlock(rte_mcfg_ethdev_get_lock());\n \n \trte_ethdev_trace_owner_set(port_id, owner, ret);\n \n@@ -523,13 +523,12 @@ rte_eth_dev_owner_unset(const uint16_t port_id, const uint64_t owner_id)\n \t\t\t{.id = RTE_ETH_DEV_NO_OWNER, .name = \"\"};\n \tint ret;\n \n-\teth_dev_shared_data_prepare();\n-\n-\trte_spinlock_lock(&eth_dev_shared_data->ownership_lock);\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 \n-\trte_spinlock_unlock(&eth_dev_shared_data->ownership_lock);\n+\trte_spinlock_unlock(rte_mcfg_ethdev_get_lock());\n \n \trte_ethdev_trace_owner_unset(port_id, owner_id, ret);\n \n@@ -542,10 +541,9 @@ rte_eth_dev_owner_delete(const uint64_t owner_id)\n \tuint16_t port_id;\n \tint ret = 0;\n \n-\teth_dev_shared_data_prepare();\n-\n-\trte_spinlock_lock(&eth_dev_shared_data->ownership_lock);\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 \t\tfor (port_id = 0; port_id < RTE_MAX_ETHPORTS; port_id++) {\n \t\t\tstruct rte_eth_dev_data *data =\n@@ -564,7 +562,7 @@ rte_eth_dev_owner_delete(const uint64_t owner_id)\n \t\tret = -EINVAL;\n \t}\n \n-\trte_spinlock_unlock(&eth_dev_shared_data->ownership_lock);\n+\trte_spinlock_unlock(rte_mcfg_ethdev_get_lock());\n \n \trte_ethdev_trace_owner_delete(owner_id, ret);\n \n@@ -591,11 +589,12 @@ rte_eth_dev_owner_get(const uint16_t port_id, struct rte_eth_dev_owner *owner)\n \t\treturn -EINVAL;\n \t}\n \n-\teth_dev_shared_data_prepare();\n+\trte_spinlock_lock(rte_mcfg_ethdev_get_lock());\n \n-\trte_spinlock_lock(&eth_dev_shared_data->ownership_lock);\n+\teth_dev_shared_data_prepare();\n \trte_memcpy(owner, &ethdev->data->owner, sizeof(*owner));\n-\trte_spinlock_unlock(&eth_dev_shared_data->ownership_lock);\n+\n+\trte_spinlock_unlock(rte_mcfg_ethdev_get_lock());\n \n \trte_ethdev_trace_owner_get(port_id, owner);\n \n@@ -675,9 +674,12 @@ rte_eth_dev_get_name_by_port(uint16_t port_id, char *name)\n \t\treturn -EINVAL;\n \t}\n \n+\trte_spinlock_lock(rte_mcfg_ethdev_get_lock());\n \t/* shouldn't check 'rte_eth_devices[i].data',\n \t * because it might be overwritten by VDEV PMD */\n \ttmp = eth_dev_shared_data->data[port_id].name;\n+\trte_spinlock_unlock(rte_mcfg_ethdev_get_lock());\n+\n \tstrcpy(name, tmp);\n \n \trte_ethdev_trace_get_name_by_port(port_id, name);\n@@ -688,6 +690,7 @@ rte_eth_dev_get_name_by_port(uint16_t port_id, char *name)\n int\n rte_eth_dev_get_port_by_name(const char *name, uint16_t *port_id)\n {\n+\tint ret = -ENODEV;\n \tuint16_t pid;\n \n \tif (name == NULL) {\n@@ -701,16 +704,19 @@ rte_eth_dev_get_port_by_name(const char *name, uint16_t *port_id)\n \t\treturn -EINVAL;\n \t}\n \n-\tRTE_ETH_FOREACH_VALID_DEV(pid)\n-\t\tif (!strcmp(name, eth_dev_shared_data->data[pid].name)) {\n-\t\t\t*port_id = pid;\n-\n-\t\t\trte_ethdev_trace_get_port_by_name(name, *port_id);\n+\trte_spinlock_lock(rte_mcfg_ethdev_get_lock());\n+\tRTE_ETH_FOREACH_VALID_DEV(pid) {\n+\t\tif (strcmp(name, eth_dev_shared_data->data[pid].name) != 0)\n+\t\t\tcontinue;\n \n-\t\t\treturn 0;\n-\t\t}\n+\t\t*port_id = pid;\n+\t\trte_ethdev_trace_get_port_by_name(name, *port_id);\n+\t\tret = 0;\n+\t\tbreak;\n+\t}\n+\trte_spinlock_unlock(rte_mcfg_ethdev_get_lock());\n \n-\treturn -ENODEV;\n+\treturn ret;\n }\n \n int\n",
    "prefixes": [
        "v4",
        "1/3"
    ]
}