get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 105237,
    "url": "http://patches.dpdk.org/api/patches/105237/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/20211217181649.154972-1-stephen@networkplumber.org/",
    "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": "<20211217181649.154972-1-stephen@networkplumber.org>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20211217181649.154972-1-stephen@networkplumber.org",
    "date": "2021-12-17T18:16:49",
    "name": "eal: fix data race in multi-process support",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "86cd3242c6cd53456adeb255264d9dbde44cd074",
    "submitter": {
        "id": 27,
        "url": "http://patches.dpdk.org/api/people/27/?format=api",
        "name": "Stephen Hemminger",
        "email": "stephen@networkplumber.org"
    },
    "delegate": null,
    "mbox": "http://patches.dpdk.org/project/dpdk/patch/20211217181649.154972-1-stephen@networkplumber.org/mbox/",
    "series": [
        {
            "id": 20971,
            "url": "http://patches.dpdk.org/api/series/20971/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=20971",
            "date": "2021-12-17T18:16:49",
            "name": "eal: fix data race in multi-process support",
            "version": 1,
            "mbox": "http://patches.dpdk.org/series/20971/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/105237/comments/",
    "check": "fail",
    "checks": "http://patches.dpdk.org/api/patches/105237/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 DC9C5A04A5;\n\tFri, 17 Dec 2021 19:16:55 +0100 (CET)",
            "from [217.70.189.124] (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 382104067C;\n\tFri, 17 Dec 2021 19:16:55 +0100 (CET)",
            "from mail-pl1-f169.google.com (mail-pl1-f169.google.com\n [209.85.214.169])\n by mails.dpdk.org (Postfix) with ESMTP id A44004013F\n for <dev@dpdk.org>; Fri, 17 Dec 2021 19:16:53 +0100 (CET)",
            "by mail-pl1-f169.google.com with SMTP id v19so2537245plo.7\n for <dev@dpdk.org>; Fri, 17 Dec 2021 10:16:53 -0800 (PST)",
            "from hermes.local (204-195-112-199.wavecable.com. [204.195.112.199])\n by smtp.gmail.com with ESMTPSA id\n w19sm9008881pga.80.2021.12.17.10.16.51\n (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n Fri, 17 Dec 2021 10:16:52 -0800 (PST)"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=networkplumber-org.20210112.gappssmtp.com; s=20210112;\n h=from:to:cc:subject:date:message-id:mime-version\n :content-transfer-encoding;\n bh=mXoOeyN/QzBsynRhJVawGN1VupdmbOaH59OuNe84+2k=;\n b=fsTzIOGuulWFE7785KiEUibodr8IEfuo5kK9OjMWd5wUj99F322UobEXdJfCRrzmQN\n ZlKvUea7yFQqBymlySHWqfrICEPJh6HZmXYb5dBB8e3UyZvrdJYoQVOcunDa1tMnF89A\n NucN6Wl2A3BrBheZurrRgfNO1PTLoTcJjCePD+QgM6ZEtoN+jW9NPd9TipXRrv19s+lP\n 2q6DzMtxeQamATVg47OeVIu5zJT2yJnjvD5czeeUfwu7r8zpucIKIkc3qSKgZrXUXwOL\n M7xFSB/g/qPoRBktTEC+RNAzPe6+OEV9bhMP19WHkvrvuy9+DUULvARsOEEx+rleJzMz\n FDog==",
        "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20210112;\n h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version\n :content-transfer-encoding;\n bh=mXoOeyN/QzBsynRhJVawGN1VupdmbOaH59OuNe84+2k=;\n b=iJdcyoEq5TkEVLoePrt0f92Qgo/YvzeBbpGUVVCF8pyowUX/QaeZli4JmH68S1OAy5\n M17HynTv5k/zqx8byPBweBahwCtEcq+eCWD0bybFj+yNLg2aNg2E5V+mJyGC90xgjno7\n MYuJI6hyzaan2bx0xdhILk/jj2mvK40Tl54XKzgnrZCElTm8nTAhMCAM6KggO5Ai9kEv\n sYNUH0n+8rUY0TprE6woV9p2NtXXiylZ7vtoOsCMGkmvL+qA1xQwIf61YUAVT97UZ3NZ\n j4l5z5VX85N58yC0j//xlj5H6Ttbpl9KH3hf/zGb/+M2fApqbbR71xshypPZCwjEPF3r\n sEVQ==",
        "X-Gm-Message-State": "AOAM530hR6pqMoIc2VhQkkjswBDIzVOChTsj5iwoIlJTp/iGTNajAU3n\n fR+InrbI6pIL/TzJf4eOiTcv9w==",
        "X-Google-Smtp-Source": "\n ABdhPJxD04AHeZIZr3P24CWawZtjJgAFuPd9S5Rb9T5vgqvo3x3h3ynJRuDcxxZYUJKtel+hpP81Fg==",
        "X-Received": "by 2002:a17:902:f781:b0:148:eb1f:f775 with SMTP id\n q1-20020a170902f78100b00148eb1ff775mr1213125pln.164.1639765012673;\n Fri, 17 Dec 2021 10:16:52 -0800 (PST)",
        "From": "Stephen Hemminger <stephen@networkplumber.org>",
        "To": "anatoly.burakov@intel.com",
        "Cc": "stable@dpdk.org, dev@dpdk.org,\n Stephen Hemminger <stephen@networkplumber.org>",
        "Subject": "[PATCH] eal: fix data race in multi-process support",
        "Date": "Fri, 17 Dec 2021 10:16:49 -0800",
        "Message-Id": "<20211217181649.154972-1-stephen@networkplumber.org>",
        "X-Mailer": "git-send-email 2.30.2",
        "MIME-Version": "1.0",
        "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": "If DPDK is built with thread sanitizer it reports a race\nin setting of multiprocess file descriptor. The fix is to\nuse atomic operations when updating mp_fd.\n\nSimple example:\n$ dpdk-testpmd -l 1-3 --no-huge\nEAL: Detected CPU lcores: 16\nEAL: Detected NUMA nodes: 1\nEAL: Static memory layout is selected, amount of reserved memory can be adjusted with -m or --socket-mem\nEAL: Detected static linkage of DPDK\nEAL: Multi-process socket /run/user/1000/dpdk/rte/mp_socket\nEAL: Selected IOVA mode 'VA'\ntestpmd: No probed ethernet devices\ntestpmd: create a new mbuf pool <mb_pool_0>: n=163456, size=2176, socket=0\ntestpmd: preferred mempool ops selected: ring_mp_mc\nEAL: Error - exiting with code: 1\n  Cause: Creation of mbuf pool for socket 0 failed: Cannot allocate memory\n==================\nWARNING: ThreadSanitizer: data race (pid=83054)\n  Write of size 4 at 0x55e3b7fce450 by main thread:\n    #0 rte_mp_channel_cleanup <null> (dpdk-testpmd+0x160d79c)\n    #1 rte_eal_cleanup <null> (dpdk-testpmd+0x1614fb5)\n    #2 rte_exit <null> (dpdk-testpmd+0x15ec97a)\n    #3 mbuf_pool_create.cold <null> (dpdk-testpmd+0x242e1a)\n    #4 main <null> (dpdk-testpmd+0x5ab05d)\n\n  Previous read of size 4 at 0x55e3b7fce450 by thread T2:\n    #0 mp_handle <null> (dpdk-testpmd+0x160c979)\n    #1 ctrl_thread_init <null> (dpdk-testpmd+0x15ff76e)\n\n  As if synchronized via sleep:\n    #0 nanosleep ../../../../src/libsanitizer/tsan/tsan_interceptors_posix.cpp:362 (libtsan.so.0+0x5cd8e)\n    #1 get_tsc_freq <null> (dpdk-testpmd+0x1622889)\n    #2 set_tsc_freq <null> (dpdk-testpmd+0x15ffb9c)\n    #3 rte_eal_timer_init <null> (dpdk-testpmd+0x1622a34)\n    #4 rte_eal_init.cold <null> (dpdk-testpmd+0x26b314)\n    #5 main <null> (dpdk-testpmd+0x5aab45)\n\n  Location is global 'mp_fd' of size 4 at 0x55e3b7fce450 (dpdk-testpmd+0x0000027c7450)\n\n  Thread T2 'rte_mp_handle' (tid=83057, running) created by main thread at:\n    #0 pthread_create ../../../../src/libsanitizer/tsan/tsan_interceptors_posix.cpp:962 (libtsan.so.0+0x58ba2)\n    #1 rte_ctrl_thread_create <null> (dpdk-testpmd+0x15ff870)\n    #2 rte_mp_channel_init.cold <null> (dpdk-testpmd+0x269986)\n    #3 rte_eal_init <null> (dpdk-testpmd+0x1615b28)\n    #4 main <null> (dpdk-testpmd+0x5aab45)\n\nSUMMARY: ThreadSanitizer: data race (/home/shemminger/DPDK/main/build/app/dpdk-testpmd+0x160d79c) in rte_mp_channel_cleanup\n==================\nThreadSanitizer: reported 1 warnings\n\nSigned-off-by: Stephen Hemminger <stephen@networkplumber.org>\n---\n lib/eal/common/eal_common_proc.c | 27 ++++++++++++++-------------\n 1 file changed, 14 insertions(+), 13 deletions(-)",
    "diff": "diff --git a/lib/eal/common/eal_common_proc.c b/lib/eal/common/eal_common_proc.c\nindex ebd0f6673b8b..4e6c1af59833 100644\n--- a/lib/eal/common/eal_common_proc.c\n+++ b/lib/eal/common/eal_common_proc.c\n@@ -262,7 +262,7 @@ rte_mp_action_unregister(const char *name)\n }\n \n static int\n-read_msg(struct mp_msg_internal *m, struct sockaddr_un *s)\n+read_msg(int fd, struct mp_msg_internal *m, struct sockaddr_un *s)\n {\n \tint msglen;\n \tstruct iovec iov;\n@@ -282,7 +282,7 @@ read_msg(struct mp_msg_internal *m, struct sockaddr_un *s)\n \tmsgh.msg_control = control;\n \tmsgh.msg_controllen = sizeof(control);\n \n-\tmsglen = recvmsg(mp_fd, &msgh, 0);\n+\tmsglen = recvmsg(fd, &msgh, 0);\n \tif (msglen < 0) {\n \t\tRTE_LOG(ERR, EAL, \"recvmsg failed, %s\\n\", strerror(errno));\n \t\treturn -1;\n@@ -383,9 +383,10 @@ mp_handle(void *arg __rte_unused)\n {\n \tstruct mp_msg_internal msg;\n \tstruct sockaddr_un sa;\n+\tint fd;\n \n-\twhile (mp_fd >= 0) {\n-\t\tif (read_msg(&msg, &sa) == 0)\n+\twhile ((fd = __atomic_load_n(&mp_fd, __ATOMIC_RELAXED)) >= 0) {\n+\t\tif (read_msg(fd, &msg, &sa) == 0)\n \t\t\tprocess_msg(&msg, &sa);\n \t}\n \n@@ -537,14 +538,15 @@ static int\n open_socket_fd(void)\n {\n \tstruct sockaddr_un un;\n+\tint fd;\n \n \tpeer_name[0] = '\\0';\n \tif (rte_eal_process_type() == RTE_PROC_SECONDARY)\n \t\tsnprintf(peer_name, sizeof(peer_name),\n \t\t\t\t\"%d_%\"PRIx64, getpid(), rte_rdtsc());\n \n-\tmp_fd = socket(AF_UNIX, SOCK_DGRAM, 0);\n-\tif (mp_fd < 0) {\n+\tfd = socket(AF_UNIX, SOCK_DGRAM, 0);\n+\tif (fd < 0) {\n \t\tRTE_LOG(ERR, EAL, \"failed to create unix socket\\n\");\n \t\treturn -1;\n \t}\n@@ -559,12 +561,13 @@ open_socket_fd(void)\n \tif (bind(mp_fd, (struct sockaddr *)&un, sizeof(un)) < 0) {\n \t\tRTE_LOG(ERR, EAL, \"failed to bind %s: %s\\n\",\n \t\t\tun.sun_path, strerror(errno));\n-\t\tclose(mp_fd);\n+\t\tclose(fd);\n \t\treturn -1;\n \t}\n \n \tRTE_LOG(INFO, EAL, \"Multi-process socket %s\\n\", un.sun_path);\n-\treturn mp_fd;\n+\t__atomic_store_n(&mp_fd, fd, __ATOMIC_RELAXED);\n+\treturn fd;\n }\n \n static void\n@@ -626,9 +629,8 @@ rte_mp_channel_init(void)\n \t\t\tNULL, mp_handle, NULL) < 0) {\n \t\tRTE_LOG(ERR, EAL, \"failed to create mp thread: %s\\n\",\n \t\t\tstrerror(errno));\n-\t\tclose(mp_fd);\n \t\tclose(dir_fd);\n-\t\tmp_fd = -1;\n+\t\tclose(__atomic_exchange_n(&mp_fd, -1, __ATOMIC_RELAXED));\n \t\treturn -1;\n \t}\n \n@@ -644,11 +646,10 @@ rte_mp_channel_cleanup(void)\n {\n \tint fd;\n \n-\tif (mp_fd < 0)\n+\tfd = __atomic_exchange_n(&mp_fd, -1, __ATOMIC_RELAXED);\n+\tif (fd < 0)\n \t\treturn;\n \n-\tfd = mp_fd;\n-\tmp_fd = -1;\n \tpthread_cancel(mp_handle_tid);\n \tpthread_join(mp_handle_tid, NULL);\n \tclose_socket_fd(fd);\n",
    "prefixes": []
}