get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 139068,
    "url": "https://patches.dpdk.org/api/patches/139068/?format=api",
    "web_url": "https://patches.dpdk.org/project/dpdk/patch/TYAP286MB0649D9A112E62A15C4792253D83D2@TYAP286MB0649.JPNP286.PROD.OUTLOOK.COM/",
    "project": {
        "id": 1,
        "url": "https://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": "<TYAP286MB0649D9A112E62A15C4792253D83D2@TYAP286MB0649.JPNP286.PROD.OUTLOOK.COM>",
    "list_archive_url": "https://inbox.dpdk.org/dev/TYAP286MB0649D9A112E62A15C4792253D83D2@TYAP286MB0649.JPNP286.PROD.OUTLOOK.COM",
    "date": "2024-04-03T06:31:00",
    "name": "vhost: fix crash caused by accessing a freed vsocket",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": false,
    "hash": "3f94a456844255438df3993465c2f3250648f87b",
    "submitter": {
        "id": 3305,
        "url": "https://patches.dpdk.org/api/people/3305/?format=api",
        "name": "Gongming Chen",
        "email": "chengongming1900@outlook.com"
    },
    "delegate": {
        "id": 2642,
        "url": "https://patches.dpdk.org/api/users/2642/?format=api",
        "username": "mcoquelin",
        "first_name": "Maxime",
        "last_name": "Coquelin",
        "email": "maxime.coquelin@redhat.com"
    },
    "mbox": "https://patches.dpdk.org/project/dpdk/patch/TYAP286MB0649D9A112E62A15C4792253D83D2@TYAP286MB0649.JPNP286.PROD.OUTLOOK.COM/mbox/",
    "series": [
        {
            "id": 31663,
            "url": "https://patches.dpdk.org/api/series/31663/?format=api",
            "web_url": "https://patches.dpdk.org/project/dpdk/list/?series=31663",
            "date": "2024-04-03T06:31:00",
            "name": "vhost: fix crash caused by accessing a freed vsocket",
            "version": 1,
            "mbox": "https://patches.dpdk.org/series/31663/mbox/"
        }
    ],
    "comments": "https://patches.dpdk.org/api/patches/139068/comments/",
    "check": "success",
    "checks": "https://patches.dpdk.org/api/patches/139068/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 1BC4743DE3;\n\tWed,  3 Apr 2024 08:31:19 +0200 (CEST)",
            "from mails.dpdk.org (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 9782640144;\n\tWed,  3 Apr 2024 08:31:18 +0200 (CEST)",
            "from JPN01-OS0-obe.outbound.protection.outlook.com\n (mail-os0jpn01olkn2034.outbound.protection.outlook.com [40.92.98.34])\n by mails.dpdk.org (Postfix) with ESMTP id 01F90400D7;\n Wed,  3 Apr 2024 08:31:16 +0200 (CEST)",
            "from TYAP286MB0649.JPNP286.PROD.OUTLOOK.COM (2603:1096:402:38::13)\n by TYWP286MB3397.JPNP286.PROD.OUTLOOK.COM (2603:1096:400:2da::9) with\n Microsoft SMTP Server (version=TLS1_2,\n cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7409.46; Wed, 3 Apr\n 2024 06:31:14 +0000",
            "from TYAP286MB0649.JPNP286.PROD.OUTLOOK.COM\n ([fe80::3b2d:34ba:11e6:b203]) by TYAP286MB0649.JPNP286.PROD.OUTLOOK.COM\n ([fe80::3b2d:34ba:11e6:b203%4]) with mapi id 15.20.7409.042; Wed, 3 Apr 2024\n 06:31:14 +0000"
        ],
        "ARC-Seal": "i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none;\n b=SjGHvxHtlUVC++xN2YmQp8LoEZNyb5rMQm3OEdepyuSOjj88nzC0mXjVO4mXbnRg7f0g2Yr9cpyvjq2ZG5OmEh0Jc7w+DS9wWF+/6oTR6pdcxNCbS3BGK81jTAid0AEyd5bQoIrQj1o6ABfuk+sDSfHSI5ca67ehDXlpFs/aJz43fZJAf5hGos8nqY3yEp2EvwVGJNYVNxb+y+yGPzg7G0CFTaTA7tBMBe37iER01sLeglHcEMkuMvcma2z25o9NoxMXZBhHCAN/T6SEJcUHAovYMzY4mqyqM+A+osICwn5y+qoT1gsdG8v1UuKG8aEPlBWFCJoX61Mb8OuKsCR37g==",
        "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=ioeDTw8ZIc62wflspDj+qI8upT/+twLQHmAn9gJHOZk=;\n b=XeKZ2lSO4nIhwhAqe4tu11Qwtgdu/4agxTqgtIpptO9VXdkesLniGQIUrYNVDJ1RZVLdeiVt3eUmiX/kRT7CbpPs+rKEyWnK66Y7sHRvK2CV55SaSpvDjrWihs23c7pbkexYeqH8R+YR4M6vz8jOvTi3FGPoDZCFWIci1h5JCfBSK42Aeq3g64WaMLFhPxWpGFihYo8+xkbApm135dgOyJZThRx0/ndxvVpzZSXKay0HUseZIqRS/1f46E+WUebmH97+l9e1vK/3JD+YIjUAAoZ5UepPeeOG/VEBpmt1kgJ97fO/j3l/M1QYkNq6yHO/i2SDHwiB5HJB/8/PUyiFqw==",
        "ARC-Authentication-Results": "i=1; mx.microsoft.com 1; spf=none; dmarc=none;\n dkim=none; arc=none",
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=outlook.com;\n s=selector1;\n h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck;\n bh=ioeDTw8ZIc62wflspDj+qI8upT/+twLQHmAn9gJHOZk=;\n b=Eanq/oeVptqwU7vCOqqfsomri7KaUjF9oIB81uMMjzSJpNcxLi7Wxus6Cn1wN7eKwIJaOCnRU8Eoy52EQKmsXfrob8ajq4m9xzYB5dfhO27zkiHO6c6luv3xvvT9TDbeS/TX4OcbAFSmBgjIznqsEQ70wgH9G0wFxCEkWEtVtV0FWXBg0QpeHsq6C9Qjf/OlttHbd8QqIxIpOiFXnqLDwvKe+k1MsL0rsXWGTj+QKYknewOCb/S/PfN7+Za7+CftXSlI6o5OthSn17/6C9efMwCMbDltLbRIQDuVJIqjRq0wLu/oq4SAQCBkwKBoY3VI7F+Ttw7iP3A55KP8JTemow==",
        "From": "Gongming Chen <chengongming1900@outlook.com>",
        "To": "maxime.coquelin@redhat.com, chenbox@nvidia.com,\n chengongming1900@outlook.com",
        "Cc": "dev@dpdk.org,\n\tGongming Chen <chengm11@chinatelecom.cn>,\n\tstable@dpdk.org",
        "Subject": "[PATCH] vhost: fix crash caused by accessing a freed vsocket",
        "Date": "Wed,  3 Apr 2024 14:31:00 +0800",
        "Message-ID": "\n <TYAP286MB0649D9A112E62A15C4792253D83D2@TYAP286MB0649.JPNP286.PROD.OUTLOOK.COM>",
        "X-Mailer": "git-send-email 2.32.1 (Apple Git-133)",
        "Content-Transfer-Encoding": "8bit",
        "Content-Type": "text/plain",
        "X-TMN": "[qrF+94I4UYodSaV9kHCpYGFUVRtTD+s2]",
        "X-ClientProxiedBy": "TYCP286CA0185.JPNP286.PROD.OUTLOOK.COM\n (2603:1096:400:382::20) To TYAP286MB0649.JPNP286.PROD.OUTLOOK.COM\n (2603:1096:402:38::13)",
        "X-Microsoft-Original-Message-ID": "\n <20240403063100.57238-1-chengongming1900@outlook.com>",
        "MIME-Version": "1.0",
        "X-MS-Exchange-MessageSentRepresentingType": "1",
        "X-MS-PublicTrafficType": "Email",
        "X-MS-TrafficTypeDiagnostic": "TYAP286MB0649:EE_|TYWP286MB3397:EE_",
        "X-MS-Office365-Filtering-Correlation-Id": "6f29e496-9b41-40eb-664a-08dc53a7a8b2",
        "X-MS-Exchange-SLBlob-MailProps": "\n JXe7TI5Vt+zIwqWvB81tDzoZLuZbdoIKJnLyG5/ZkVyxBj6pLHsqb3thoq8G6vThRwBD2Vx2ZU6csZUSITPle8DSjYdwDhQBy4CeB9pXoIsHy4S7cmox375ZRJMRBPMGtBLI8Jf4+v8V8Y+p0azIPAPs1LgY2RpteiVWhZdyDN275gD6IrbZlvMGYiDcBrnwJl7vUme2jgiXtykae2HcDeEMIy2PH6d5KBoZ2j1O+06kXIRqp8jqCED2X7D1TOZ0NuitQeWzPG8ej/MVhI7ERT5Gjuhft8hJk6mzLKvBNUA4PfBfz215vEE/KOtzWv+iLlz0AhEYkdVkZD1RwFBGNpTENnOPm0FJfxxQWjjl2bgXQ+9QzaWQSxQzuQr2MX8NuVnYhvjh2UNcLU+9Cft7pywBWKo8e2oZUvZcI5x5VhL/dOBHygbwzWkHj08Tr7hFnnF2pUQoBOtvzI1vzKetRi0+9pE6lA/azSNKQY7hpM6hKvA4UZDOu2K9zZGAKmv0Q+NYkASsOYtGE+tOzKsMVwpVPl4UVOPgLnmXiEbsqObTIzDoGxOGjMYacpcogjJRrsPnHIOWVtl0ewJ4edDC0RzA2cYOJGvfMq9515LU8znIgBXop2fAOtaw+JEP/2GjoEaSRBTSfaTgEtfB5mJ5Z+v1DkgFBKySvGotVGp/mfKgPoct9xFVjW2ewAl7DD+dwYv27b6/woS4js6RrPIgUPtdXUK8b7R1if6e+nt+MyU=",
        "X-Microsoft-Antispam": "BCL:0;",
        "X-Microsoft-Antispam-Message-Info": "\n CI26GhdkG3GSKjRH/CrVfgxU/Z+uQVdxq4vhLcjF23lEsNMSHeUR+f1UQAaR8Wh4emeOT3m24X+9GbG/mchHjNo5w2nWPiIVXh47VCgQmP4vke0kOB7rPUUmTfYMLn7nw7Jd233UyeVpfYm3T1wf45qUb88uB1RAA8RWxfL6H0Zf+OWftd4F9nNkfxgPTrZkZdOUfJ2Z+UCghR6dpvuL1CYtK8hgPgtUfuKBJF1Y6/jRnk213sRLyYs9a5p7xVZ7ulICspJDpuqLDZJlLo1jimpKraUNy6S73e1d6mTrwhhM3Wq3P438WtGPepDwg0jMKpotxXlWzoUrKEWR2GLkdJzSdHUnu/5ZGz4ug26YayBUKmMeq64hKizV6HrcytqZyB/FhMm2ATsT28tBMawKF24mRfOgVdQ9vyILcT8D9uIMdKKoPw1m8gqJG1Dj76nhAYe5m5zA+aWpkq5pDI0UJQQysDo42MP4xd7qBKOyXDrS1t2wdPSixmz+qZhM9Hl5M2OYggBkhNG8eg04nIarMZghDtKbze6VE0bEcwsKTXDuZ8+z6+UO0O8UgUJjBqys5lID4g3InGpCKdNN42DyMUuo5SLjwOTXR/evruHYIrc=",
        "X-MS-Exchange-AntiSpam-MessageData-ChunkCount": "1",
        "X-MS-Exchange-AntiSpam-MessageData-0": "\n qoQ/UWIXfWIH4GiKz+BgmEQbmqu0mJfyXuLu4Tin/yLJ13zVD5rTt0ChAchUHYw9eXYEf3aPINalyLoMZaTwnO3skfBoT2O5LVvRu4Zm1GNFv0sueHjPt09riFrKgKs23+n+nqdZK6FtJYFbjo89qtu+/4CdmQpUX8E6TnoLpi2KNaZcWFWh689ECmxnu9y86BcF7y9Ijq19RKIk6pEvkJRH6cJ+HDhyUC5xuOxz2m2m8Gl9gHgSBqLXqpXV3GX8nyYysqrDF8bFtYHkN6e7Gc/+2guUa7kWqxoYGzd3H9jVbl+UsdejKcj7wMi+3kYko/Ad88mKggJzhNGtla9jWUeS5fB+itoCvHz0kObHlYptqdeO/+LuBFzoz//U1yJvNlM2ojFi9PzCvm/BytRu0AKzkdoI+8Bnx40tFiqo6e7QRz4PZxg3LUWkBVi+l/SmhJj1l/14X7WT3CMk9/KpyfBH0yuPX0WcoH4OBloVovk2p6LBzizpURuMbP8u7Mwe9ioNpJqar4iMfskOMOzNVJdHzK7DlwVIw7gkAcNVfjEEasldigth47yQDnZJj4ei8DvUzeSuEwuPPB0Yw9KinnW+To2Anmwwlay1nMLx7Qyx02feWXxnuL4ytWX1B17+8+qFKxK6ISZbXg6e8vtIRAYSS1OeiUn0hGekIH6g9kRuqZQrEBAJa/Uhvpi0Lfa9MwQbUjIsv/DXv6FqAW9LPDRPEFXquBbKSqjQqkM1t8YqRH+TygRboM8LB9bJYUwDgJUGU0TWF3PmBaBBxHEQwJlAkBpXMA0CN+9+WBUX2u2JOyZX1DnziP/k+4rzbjQJDmNMbE4Ei6UaMaX/R+EaKhT7g7C9qU71kPW7/esH+wxzmXnlyovOWm3nYJbnf5VONEJpYasXvABL8nSvP3ZiUTBgb9kn9pTPEx930ds9Jk/p835bsPPVbKNw7S8M0uq2JuKKyBj8AHzHxOZs0v+a1kAjGPkAk7HVXX8Ato/1lMKHmDBmiA6sLgnNMqAReWR9Hin/YjvrbfAHal9ZcV/ECGIiRl05I4xdpuCkKxGCQLJ8T/sclKyOyEfg4T5o53jYnTmqvsCPOB/h05ETcw+P0rDhyT/5Zw78k+fmk0rIxn/ZqSSFOKaXV5jiYsO6v3dKb6spr9mMplEX77G10LsGJs5UjtvidG6dLhu3KJpEyOljBzFFzdHecHHYocr6FqPxNtwOf+V0KKIPhjHSz4D4LmeQGsWTJ+D5VcPL0fesku+KVV9OwuWaV9yY11VluWoY",
        "X-OriginatorOrg": "outlook.com",
        "X-MS-Exchange-CrossTenant-Network-Message-Id": "\n 6f29e496-9b41-40eb-664a-08dc53a7a8b2",
        "X-MS-Exchange-CrossTenant-AuthSource": "TYAP286MB0649.JPNP286.PROD.OUTLOOK.COM",
        "X-MS-Exchange-CrossTenant-AuthAs": "Internal",
        "X-MS-Exchange-CrossTenant-OriginalArrivalTime": "03 Apr 2024 06:31:13.9858 (UTC)",
        "X-MS-Exchange-CrossTenant-FromEntityHeader": "Hosted",
        "X-MS-Exchange-CrossTenant-Id": "84df9e7f-e9f6-40af-b435-aaaaaaaaaaaa",
        "X-MS-Exchange-CrossTenant-RMS-PersistedConsumerOrg": "\n 00000000-0000-0000-0000-000000000000",
        "X-MS-Exchange-Transport-CrossTenantHeadersStamped": "TYWP286MB3397",
        "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": "From: Gongming Chen <chengm11@chinatelecom.cn>\n\nWhen a vhost user message handling error in the event dispatch thread,\nvsocket reconn is added to the reconnection list of the reconnection\nthread.\nSince the reconnection, event dispatching and app configuration thread\ndo not have common thread protection restrictions, the app config\nthread freed vsocket in the rte_vhost_driver_unregister process,\nbut vsocket reconn can still exist in the reconn_list through this\nmechanism.\nThen in the reconnection thread, the vsocket is connected again and\nconn is added to the dispatch thread.\nFinally, the vsocket is accessed again in the event dispatch thread,\nresulting in a use-after-free error.\n\nThis patch adds a vhost threads read-write lock to restrict\nreconnection, event dispatching and app configuration threads.\nWhen the vhost driver unregisters, it exclusively holds the lock to\nsafely free the vsocket.\n\n#0  0x0000000000000025 in ?? ()\n#1  0x0000000003ed7ca0 in vhost_user_read_cb at lib/vhost/socket.c:330\n#2  0x0000000003ed625f in fdset_event_dispatch at lib/vhost/fd_man.c:283\n\nFixes: e623e0c6d8a5 (\"vhost: add vhost-user client mode\")\nCc: stable@dpdk.org\n\nSigned-off-by: Gongming Chen <chengm11@chinatelecom.cn>\n---\n lib/vhost/fd_man.c       |  3 +++\n lib/vhost/meson.build    |  1 +\n lib/vhost/socket.c       | 30 ++++++++++++------------------\n lib/vhost/vhost_thread.c | 37 +++++++++++++++++++++++++++++++++++++\n lib/vhost/vhost_thread.h | 16 ++++++++++++++++\n 5 files changed, 69 insertions(+), 18 deletions(-)\n create mode 100644 lib/vhost/vhost_thread.c\n create mode 100644 lib/vhost/vhost_thread.h",
    "diff": "diff --git a/lib/vhost/fd_man.c b/lib/vhost/fd_man.c\nindex 481e6b900a..b0e0aa2640 100644\n--- a/lib/vhost/fd_man.c\n+++ b/lib/vhost/fd_man.c\n@@ -9,6 +9,7 @@\n #include <rte_log.h>\n \n #include \"fd_man.h\"\n+#include \"vhost_thread.h\"\n \n RTE_LOG_REGISTER_SUFFIX(vhost_fdset_logtype, fdset, INFO);\n #define RTE_LOGTYPE_VHOST_FDMAN vhost_fdset_logtype\n@@ -250,6 +251,7 @@ fdset_event_dispatch(void *arg)\n \t\tif (val < 0)\n \t\t\tcontinue;\n \n+\t\tvhost_thread_read_lock();\n \t\tneed_shrink = 0;\n \t\tfor (i = 0; i < numfds; i++) {\n \t\t\tpthread_mutex_lock(&pfdset->fd_mutex);\n@@ -303,6 +305,7 @@ fdset_event_dispatch(void *arg)\n \n \t\tif (need_shrink)\n \t\t\tfdset_shrink(pfdset);\n+\t\tvhost_thread_read_unlock();\n \t}\n \n \treturn 0;\ndiff --git a/lib/vhost/meson.build b/lib/vhost/meson.build\nindex 41b622a9be..7bc1840ed0 100644\n--- a/lib/vhost/meson.build\n+++ b/lib/vhost/meson.build\n@@ -25,6 +25,7 @@ sources = files(\n         'vdpa.c',\n         'vhost.c',\n         'vhost_crypto.c',\n+        'vhost_thread.c',\n         'vhost_user.c',\n         'virtio_net.c',\n         'virtio_net_ctrl.c',\ndiff --git a/lib/vhost/socket.c b/lib/vhost/socket.c\nindex 96b3ab5595..e05d36f549 100644\n--- a/lib/vhost/socket.c\n+++ b/lib/vhost/socket.c\n@@ -20,6 +20,7 @@\n #include \"fd_man.h\"\n #include \"vduse.h\"\n #include \"vhost.h\"\n+#include \"vhost_thread.h\"\n #include \"vhost_user.h\"\n \n \n@@ -463,6 +464,7 @@ vhost_user_client_reconnect(void *arg __rte_unused)\n \tstruct vhost_user_reconnect *reconn, *next;\n \n \twhile (1) {\n+\t\tvhost_thread_read_lock();\n \t\tpthread_mutex_lock(&reconn_list.mutex);\n \n \t\t/*\n@@ -494,6 +496,7 @@ vhost_user_client_reconnect(void *arg __rte_unused)\n \t\t}\n \n \t\tpthread_mutex_unlock(&reconn_list.mutex);\n+\t\tvhost_thread_read_unlock();\n \t\tsleep(1);\n \t}\n \n@@ -1071,7 +1074,7 @@ rte_vhost_driver_unregister(const char *path)\n \tif (path == NULL)\n \t\treturn -1;\n \n-again:\n+\tvhost_thread_write_lock();\n \tpthread_mutex_lock(&vhost_user.mutex);\n \n \tfor (i = 0; i < vhost_user.vsocket_cnt; i++) {\n@@ -1083,14 +1086,10 @@ rte_vhost_driver_unregister(const char *path)\n \t\t\tvduse_device_destroy(path);\n \t\t} else if (vsocket->is_server) {\n \t\t\t/*\n-\t\t\t * If r/wcb is executing, release vhost_user's\n-\t\t\t * mutex lock, and try again since the r/wcb\n-\t\t\t * may use the mutex lock.\n+\t\t\t * The vhost thread write lock has been acquired,\n+\t\t\t * and fd must be deleted from fdset.\n \t\t\t */\n-\t\t\tif (fdset_try_del(&vhost_user.fdset, vsocket->socket_fd) == -1) {\n-\t\t\t\tpthread_mutex_unlock(&vhost_user.mutex);\n-\t\t\t\tgoto again;\n-\t\t\t}\n+\t\t\tfdset_del(&vhost_user.fdset, vsocket->socket_fd);\n \t\t} else if (vsocket->reconnect) {\n \t\t\tvhost_user_remove_reconnect(vsocket);\n \t\t}\n@@ -1102,17 +1101,10 @@ rte_vhost_driver_unregister(const char *path)\n \t\t\tnext = TAILQ_NEXT(conn, next);\n \n \t\t\t/*\n-\t\t\t * If r/wcb is executing, release vsocket's\n-\t\t\t * conn_mutex and vhost_user's mutex locks, and\n-\t\t\t * try again since the r/wcb may use the\n-\t\t\t * conn_mutex and mutex locks.\n+\t\t\t * The vhost thread write lock has been acquired,\n+\t\t\t * and fd must be deleted from fdset.\n \t\t\t */\n-\t\t\tif (fdset_try_del(&vhost_user.fdset,\n-\t\t\t\t\t  conn->connfd) == -1) {\n-\t\t\t\tpthread_mutex_unlock(&vsocket->conn_mutex);\n-\t\t\t\tpthread_mutex_unlock(&vhost_user.mutex);\n-\t\t\t\tgoto again;\n-\t\t\t}\n+\t\t\tfdset_del(&vhost_user.fdset, conn->connfd);\n \n \t\t\tVHOST_CONFIG_LOG(path, INFO, \"free connfd %d\", conn->connfd);\n \t\t\tclose(conn->connfd);\n@@ -1134,9 +1126,11 @@ rte_vhost_driver_unregister(const char *path)\n \t\tvhost_user.vsockets[i] = vhost_user.vsockets[count];\n \t\tvhost_user.vsockets[count] = NULL;\n \t\tpthread_mutex_unlock(&vhost_user.mutex);\n+\t\tvhost_thread_write_unlock();\n \t\treturn 0;\n \t}\n \tpthread_mutex_unlock(&vhost_user.mutex);\n+\tvhost_thread_write_unlock();\n \n \treturn -1;\n }\ndiff --git a/lib/vhost/vhost_thread.c b/lib/vhost/vhost_thread.c\nnew file mode 100644\nindex 0000000000..6b5dc22042\n--- /dev/null\n+++ b/lib/vhost/vhost_thread.c\n@@ -0,0 +1,37 @@\n+/* SPDX-License-Identifier: BSD-3-Clause\n+ * Copyright (c) 2024 China Telecom Cloud Technology Co., Ltd\n+ */\n+\n+#include <rte_rwlock.h>\n+\n+#include \"vhost_thread.h\"\n+\n+static rte_rwlock_t vhost_thread_lock = RTE_RWLOCK_INITIALIZER;\n+\n+void\n+vhost_thread_read_lock(void)\n+\t__rte_no_thread_safety_analysis\n+{\n+\trte_rwlock_read_lock(&vhost_thread_lock);\n+}\n+\n+void\n+vhost_thread_read_unlock(void)\n+\t__rte_no_thread_safety_analysis\n+{\n+\trte_rwlock_read_unlock(&vhost_thread_lock);\n+}\n+\n+void\n+vhost_thread_write_lock(void)\n+\t__rte_no_thread_safety_analysis\n+{\n+\trte_rwlock_write_lock(&vhost_thread_lock);\n+}\n+\n+void\n+vhost_thread_write_unlock(void)\n+\t__rte_no_thread_safety_analysis\n+{\n+\trte_rwlock_write_unlock(&vhost_thread_lock);\n+}\ndiff --git a/lib/vhost/vhost_thread.h b/lib/vhost/vhost_thread.h\nnew file mode 100644\nindex 0000000000..61679172af\n--- /dev/null\n+++ b/lib/vhost/vhost_thread.h\n@@ -0,0 +1,16 @@\n+/* SPDX-License-Identifier: BSD-3-Clause\n+ * Copyright (c) 2024 China Telecom Cloud Technology Co., Ltd\n+ */\n+\n+#ifndef _VHOST_THREAD_H_\n+#define _VHOST_THREAD_H_\n+\n+void vhost_thread_read_lock(void);\n+\n+void vhost_thread_read_unlock(void);\n+\n+void vhost_thread_write_lock(void);\n+\n+void vhost_thread_write_unlock(void);\n+\n+#endif\n",
    "prefixes": []
}