get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 133481,
    "url": "http://patches.dpdk.org/api/patches/133481/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/20231027081158.1358064-1-thomas@monjalon.net/",
    "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": "<20231027081158.1358064-1-thomas@monjalon.net>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20231027081158.1358064-1-thomas@monjalon.net",
    "date": "2023-10-27T08:08:52",
    "name": "[v6,1/1] eal/unix: allow creating thread with real-time priority",
    "commit_ref": null,
    "pull_url": null,
    "state": "new",
    "archived": false,
    "hash": "cfe93231886097a8f7012f7ea2dfc77a8f0f4da4",
    "submitter": {
        "id": 685,
        "url": "http://patches.dpdk.org/api/people/685/?format=api",
        "name": "Thomas Monjalon",
        "email": "thomas@monjalon.net"
    },
    "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/20231027081158.1358064-1-thomas@monjalon.net/mbox/",
    "series": [
        {
            "id": 30021,
            "url": "http://patches.dpdk.org/api/series/30021/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=30021",
            "date": "2023-10-27T08:08:52",
            "name": "[v6,1/1] eal/unix: allow creating thread with real-time priority",
            "version": 6,
            "mbox": "http://patches.dpdk.org/series/30021/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/133481/comments/",
    "check": "success",
    "checks": "http://patches.dpdk.org/api/patches/133481/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 4980D43214;\n\tFri, 27 Oct 2023 10:12:32 +0200 (CEST)",
            "from mails.dpdk.org (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 38A1A40A76;\n\tFri, 27 Oct 2023 10:12:32 +0200 (CEST)",
            "from wout3-smtp.messagingengine.com (wout3-smtp.messagingengine.com\n [64.147.123.19])\n by mails.dpdk.org (Postfix) with ESMTP id E17DA40272;\n Fri, 27 Oct 2023 10:12:30 +0200 (CEST)",
            "from compute6.internal (compute6.nyi.internal [10.202.2.47])\n by mailout.west.internal (Postfix) with ESMTP id F42263200928;\n Fri, 27 Oct 2023 04:12:26 -0400 (EDT)",
            "from mailfrontend2 ([10.202.2.163])\n by compute6.internal (MEProxy); Fri, 27 Oct 2023 04:12:28 -0400",
            "by mail.messagingengine.com (Postfix) with ESMTPA; Fri,\n 27 Oct 2023 04:12:24 -0400 (EDT)"
        ],
        "DKIM-Signature": [
            "v=1; a=rsa-sha256; c=relaxed/relaxed; d=monjalon.net; h=\n cc:cc:content-transfer-encoding:content-type:content-type:date\n :date:from:from:in-reply-to:in-reply-to:message-id:mime-version\n :references:reply-to:sender:subject:subject:to:to; s=fm3; t=\n 1698394346; x=1698480746; bh=CTwSuxgwI2YfYxp24yuewCwJHp4E+iC6dbc\n wpQQqPig=; b=nG6qm1iPkZ5ydEU7D2cxehRm0GhOFnBM7U+5yczlLUGVqULKxsE\n pyxUyvOpZdAqWZtlggJWJmBFTpCMluiQ7q4jxJ+0d7ohhF6FGUr39zBY1apaIsA5\n KC9sPYSjGEsoSbrNEsXO791q3xrIbpIuGcoJt7xhig2IQTlfftTKndTh5GZHq53c\n iMTxmmwYWrbrV8Im9UGmRVFpDGFZnlA8V8b6gSI1mrDHOq1Tz9C2zTFoOj574R6J\n K9UQR2eukIdWTxwVKA0v+38LQzQzAqdCBLwfdqeMkAxHeNdDCEqZ8k2f8mCE8miw\n JIW6uzXe7TxVoqj+OeCq04Zq3MS+MD0oghQ==",
            "v=1; a=rsa-sha256; c=relaxed/relaxed; d=\n messagingengine.com; h=cc:cc:content-transfer-encoding\n :content-type:content-type:date:date:feedback-id:feedback-id\n :from:from:in-reply-to:in-reply-to:message-id:mime-version\n :references:reply-to:sender:subject:subject:to:to:x-me-proxy\n :x-me-proxy:x-me-sender:x-me-sender:x-sasl-enc; s=fm3; t=\n 1698394346; x=1698480746; bh=CTwSuxgwI2YfYxp24yuewCwJHp4E+iC6dbc\n wpQQqPig=; b=mZ8TlWCS5OwUH+VWYqy/jzcWsWGERtmZd+husKaedWfo/4iZnAv\n PL9yCWaIyWpoNSxiXBp/9e8mYWHm8HXKmmsnMYrTECE75M/vEwh2u53dzOpaMuet\n g6zzS8WoILhOCVXP19omKR0xaIGg6RDj64YUbcF3noJkxFi0NEJEv5o99qF6j1F8\n iHK9ADxzrWxdMZTFC79bPKNRUpUWsdGMYV5KG2qphTljlLn2QQ0yuP5bm5TZaM2o\n W73BkSqm4l2TR4M59A/iH9MHiuVCyS5Bd7GgqyV+tCXWoqN4Imnc/0tNp9NX+uo/\n vhiADw33328LkY49wrj2UWgoaQ/y3RvJXNg=="
        ],
        "X-ME-Sender": "<xms:6XA7ZT9FfBzCwwo776o9REe2sMsoVCB708dB20a7K29TFhoV5iwlxg>\n <xme:6XA7ZfsxKodZoFtVOiB2JItQs8qZ0EE9AdxjJxnvHCaebQqUxsYI2iNsY2D8YHB3q\n VDpDH5YX3vRB8MJOA>",
        "X-ME-Received": "\n <xmr:6XA7ZRAioypw61sWMN3HIcztSm764Gil_k8ouS9R1YA7S2-TWxYETbYfoUIEtPgvKcNVglceVQyMp8w1Gge02iVCumDyQds>",
        "X-ME-Proxy-Cause": "\n gggruggvucftvghtrhhoucdtuddrgedvkedrleeggddtudcutefuodetggdotefrodftvf\n curfhrohhfihhlvgemucfhrghsthforghilhdpqfgfvfdpuffrtefokffrpgfnqfghnecu\n uegrihhlohhuthemuceftddtnecusecvtfgvtghiphhivghnthhsucdlqddutddtmdenuc\n fjughrpefhvfevufffkffojghfgggtgfesthekredtredtjeenucfhrhhomhepvfhhohhm\n rghsucfoohhnjhgrlhhonhcuoehthhhomhgrshesmhhonhhjrghlohhnrdhnvghtqeenuc\n ggtffrrghtthgvrhhnpedtieffffegfeetlefhkeeuteeuudffjefgleevtdeijedukefg\n veehteehheegjeenucevlhhushhtvghrufhiiigvpedtnecurfgrrhgrmhepmhgrihhlfh\n hrohhmpehthhhomhgrshesmhhonhhjrghlohhnrdhnvght",
        "X-ME-Proxy": "<xmx:6XA7ZfdMs0MsQvuG4q1O5qZpazihfzvnMqcsQzXKJfGRXy-LdbSB6w>\n <xmx:6XA7ZYNzdUzBdWx2pYOfKE3sYWgJajeeDWAhnrYCvHWeoq1ZEH1xkw>\n <xmx:6XA7ZRl9dKsIbQcjWhsMsY_dYLsPVrMLRCAdSUs28yXJABB_e0a_QQ>\n <xmx:6nA7ZXqZITRVBmuefcpdW98cqncXSFlHd7g50zBEdJUBPXmMj8Vzkw>",
        "Feedback-ID": "i47234305:Fastmail",
        "From": "Thomas Monjalon <thomas@monjalon.net>",
        "To": "dev@dpdk.org",
        "Cc": "David Marchand <david.marchand@redhat.com>, stable@dpdk.org, =?utf-8?q?M?=\n\t=?utf-8?q?orten_Br=C3=B8rup?= <mb@smartsharesystems.com>,\n Anatoly Burakov <anatoly.burakov@intel.com>,\n Tyler Retzlaff <roretzla@linux.microsoft.com>,\n Narcisa Vasile <navasile@linux.microsoft.com>,\n Stephen Hemminger <stephen@networkplumber.org>,\n Dmitry Kozlyuk <dmitry.kozliuk@gmail.com>,\n Konstantin Ananyev <konstantin.v.ananyev@yandex.ru>,\n Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>",
        "Subject": "[PATCH v6 1/1] eal/unix: allow creating thread with real-time\n priority",
        "Date": "Fri, 27 Oct 2023 10:08:52 +0200",
        "Message-ID": "<20231027081158.1358064-1-thomas@monjalon.net>",
        "X-Mailer": "git-send-email 2.42.0",
        "In-Reply-To": "<20231024125416.798897-1-thomas@monjalon.net>",
        "References": "<20231024125416.798897-1-thomas@monjalon.net>",
        "MIME-Version": "1.0",
        "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": "When adding an API for creating threads,\nthe real-time priority has been forbidden on Unix.\n\nThere is a known issue with ring behaviour,\nbut it should not be completely forbidden.\n\nReal-time thread can block some kernel threads on the same core,\nmaking the system unstable.\nThat's why a sleep is added in the test thread,\nand a warning is logged when using real-time priority.\n\nFixes: ca04c78b6262 (\"eal: get/set thread priority per thread identifier\")\nFixes: ce6e911d20f6 (\"eal: add thread lifetime API\")\nFixes: a7ba40b2b1bf (\"drivers: convert to internal control threads\")\nCc: stable@dpdk.org\n\nSigned-off-by: Thomas Monjalon <thomas@monjalon.net>\nAcked-by: Morten Brørup <mb@smartsharesystems.com>\n---\n\nv1: no yield at all\nv2: more comments, sched_yield() and Sleep(0) on Windows\nv3: 2 yield functions with sleep in realtime version\nv4: runtime warning, longer sleep on Unix and lighter yield on Windows\nv5: fix build and increase Unix sleep to 1 ms\nv6: no yield helper, use a big sleep for testing purpose\n\nIt is not clear how to implement helpers which would work\non all systems (different configuration, arch and OS).\nSo the first patch adding yield functions is dropped for now.\n\n---\n app/test/test_threads.c                       | 12 ++--------\n .../prog_guide/env_abstraction_layer.rst      |  4 +++-\n lib/eal/include/rte_thread.h                  |  8 +++++--\n lib/eal/unix/rte_thread.c                     | 22 +++++++++++--------\n 4 files changed, 24 insertions(+), 22 deletions(-)",
    "diff": "diff --git a/app/test/test_threads.c b/app/test/test_threads.c\nindex 4ac3f2671a..a863214137 100644\n--- a/app/test/test_threads.c\n+++ b/app/test/test_threads.c\n@@ -5,6 +5,7 @@\n #include <string.h>\n \n #include <rte_thread.h>\n+#include <rte_cycles.h>\n #include <rte_debug.h>\n \n #include \"test.h\"\n@@ -22,7 +23,7 @@ thread_main(void *arg)\n \t__atomic_store_n(&thread_id_ready, 1, __ATOMIC_RELEASE);\n \n \twhile (__atomic_load_n(&thread_id_ready, __ATOMIC_ACQUIRE) == 1)\n-\t\t;\n+\t\trte_delay_us_sleep(1000); /* required for RT priority */\n \n \treturn 0;\n }\n@@ -97,21 +98,12 @@ test_thread_priority(void)\n \t\t\"Priority set mismatches priority get\");\n \n \tpriority = RTE_THREAD_PRIORITY_REALTIME_CRITICAL;\n-#ifndef RTE_EXEC_ENV_WINDOWS\n-\tRTE_TEST_ASSERT(rte_thread_set_priority(thread_id, priority) == ENOTSUP,\n-\t\t\"Priority set to critical should fail\");\n-\tRTE_TEST_ASSERT(rte_thread_get_priority(thread_id, &priority) == 0,\n-\t\t\"Failed to get thread priority\");\n-\tRTE_TEST_ASSERT(priority == RTE_THREAD_PRIORITY_NORMAL,\n-\t\t\"Failed set to critical should have retained normal\");\n-#else\n \tRTE_TEST_ASSERT(rte_thread_set_priority(thread_id, priority) == 0,\n \t\t\"Priority set to critical should succeed\");\n \tRTE_TEST_ASSERT(rte_thread_get_priority(thread_id, &priority) == 0,\n \t\t\"Failed to get thread priority\");\n \tRTE_TEST_ASSERT(priority == RTE_THREAD_PRIORITY_REALTIME_CRITICAL,\n \t\t\"Priority set mismatches priority get\");\n-#endif\n \n \tpriority = RTE_THREAD_PRIORITY_NORMAL;\n \tRTE_TEST_ASSERT(rte_thread_set_priority(thread_id, priority) == 0,\ndiff --git a/doc/guides/prog_guide/env_abstraction_layer.rst b/doc/guides/prog_guide/env_abstraction_layer.rst\nindex 6debf54efb..d1f7cae7cd 100644\n--- a/doc/guides/prog_guide/env_abstraction_layer.rst\n+++ b/doc/guides/prog_guide/env_abstraction_layer.rst\n@@ -815,7 +815,9 @@ Known Issues\n \n   4. It MAY be used by preemptible multi-producer and/or preemptible multi-consumer pthreads whose scheduling policy are all SCHED_OTHER(cfs), SCHED_IDLE or SCHED_BATCH. User SHOULD be aware of the performance penalty before using it.\n \n-  5. It MUST not be used by multi-producer/consumer pthreads, whose scheduling policies are SCHED_FIFO or SCHED_RR.\n+  5. It MUST not be used by multi-producer/consumer pthreads\n+     whose scheduling policies are ``SCHED_FIFO``\n+     or ``SCHED_RR`` (``RTE_THREAD_PRIORITY_REALTIME_CRITICAL``).\n \n   Alternatively, applications can use the lock-free stack mempool handler. When\n   considering this handler, note that:\ndiff --git a/lib/eal/include/rte_thread.h b/lib/eal/include/rte_thread.h\nindex f2581fe152..7ff031e1b2 100644\n--- a/lib/eal/include/rte_thread.h\n+++ b/lib/eal/include/rte_thread.h\n@@ -56,10 +56,14 @@ typedef uint32_t (*rte_thread_func) (void *arg);\n  * Thread priority values.\n  */\n enum rte_thread_priority {\n+\t/** Normal thread priority, the default. */\n \tRTE_THREAD_PRIORITY_NORMAL            = 0,\n-\t/**< normal thread priority, the default */\n+\t/**\n+\t * Highest thread priority, use with caution.\n+\t * WARNING: System may be unstable because of a real-time busy loop.\n+\t *          @see rte_thread_yield_realtime().\n+\t */\n \tRTE_THREAD_PRIORITY_REALTIME_CRITICAL = 1,\n-\t/**< highest thread priority allowed */\n };\n \n /**\ndiff --git a/lib/eal/unix/rte_thread.c b/lib/eal/unix/rte_thread.c\nindex 278d8d342d..17ffb86c17 100644\n--- a/lib/eal/unix/rte_thread.c\n+++ b/lib/eal/unix/rte_thread.c\n@@ -33,6 +33,8 @@ static int\n thread_map_priority_to_os_value(enum rte_thread_priority eal_pri, int *os_pri,\n \tint *pol)\n {\n+\tstatic bool warned;\n+\n \t/* Clear the output parameters. */\n \t*os_pri = sched_get_priority_min(SCHED_OTHER) - 1;\n \t*pol = -1;\n@@ -51,6 +53,17 @@ thread_map_priority_to_os_value(enum rte_thread_priority eal_pri, int *os_pri,\n \t\t\tsched_get_priority_max(SCHED_OTHER)) / 2;\n \t\tbreak;\n \tcase RTE_THREAD_PRIORITY_REALTIME_CRITICAL:\n+\t\t/*\n+\t\t * WARNING: Real-time busy loop takes priority on kernel threads,\n+\t\t *          making the system unstable.\n+\t\t *          There is also a known issue when using rte_ring.\n+\t\t */\n+\t\tif (!warned) {\n+\t\t\tRTE_LOG(NOTICE, EAL,\n+\t\t\t\t\t\"Real-time thread is unstable if polling without sleep.\\n\");\n+\t\t\twarned = true;\n+\t\t}\n+\n \t\t*pol = SCHED_RR;\n \t\t*os_pri = sched_get_priority_max(SCHED_RR);\n \t\tbreak;\n@@ -155,11 +168,6 @@ rte_thread_create(rte_thread_t *thread_id,\n \t\t\tgoto cleanup;\n \t\t}\n \n-\t\tif (thread_attr->priority ==\n-\t\t\t\tRTE_THREAD_PRIORITY_REALTIME_CRITICAL) {\n-\t\t\tret = ENOTSUP;\n-\t\t\tgoto cleanup;\n-\t\t}\n \t\tret = thread_map_priority_to_os_value(thread_attr->priority,\n \t\t\t\t&param.sched_priority, &policy);\n \t\tif (ret != 0)\n@@ -291,10 +299,6 @@ rte_thread_set_priority(rte_thread_t thread_id,\n \tint policy;\n \tint ret;\n \n-\t/* Realtime priority can cause crashes on non-Windows platforms. */\n-\tif (priority == RTE_THREAD_PRIORITY_REALTIME_CRITICAL)\n-\t\treturn ENOTSUP;\n-\n \tret = thread_map_priority_to_os_value(priority, &param.sched_priority,\n \t\t&policy);\n \tif (ret != 0)\n",
    "prefixes": [
        "v6",
        "1/1"
    ]
}