Show a patch.

Update a patch.

Update a patch.

GET /api/patches/73422/?format=api
Content-Type: application/json
Vary: Accept

    "id": 73422,
    "url": "",
    "web_url": "",
    "project": {
        "id": 1,
        "url": "",
        "name": "DPDK",
        "link_name": "dpdk",
        "list_id": "",
        "list_email": "",
        "web_url": "",
        "scm_url": "git://",
        "webscm_url": "",
        "list_archive_url": "",
        "list_archive_url_format": "{}",
        "commit_url_format": ""
    "msgid": "<>",
    "list_archive_url": "",
    "date": "2020-07-07T11:13:21",
    "name": "[v3,2/4] eventdev: use C11 atomics for lcore timer armed flag",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "4ad63a31d4cd11f170ea0286dec2890cae61f78a",
    "submitter": {
        "id": 833,
        "url": "",
        "name": "Phil Yang",
        "email": ""
    "delegate": {
        "id": 310,
        "url": "",
        "username": "jerin",
        "first_name": "Jerin",
        "last_name": "Jacob",
        "email": ""
    "mbox": "",
    "series": [
            "id": 10847,
            "url": "",
            "web_url": "",
            "date": "2020-07-07T11:13:20",
            "name": "[v3,1/4] eventdev: fix race condition on timer list counter",
            "version": 3,
            "mbox": ""
    "comments": "",
    "check": "warning",
    "checks": "",
    "tags": {},
    "related": [],
    "headers": {
        "X-BeenThere": "",
        "Return-Path": "<>",
        "Sender": "\"dev\" <>",
        "From": "Phil Yang <>",
        "Cc": ",,,\n,,,\n,,,\n",
        "To": ",\n\,\n\",
        "Delivered-To": "",
        "List-Archive": "<>",
        "References": "<>\n <>",
        "In-Reply-To": "<>",
        "List-Subscribe": "<>,\n <>",
        "List-Id": "DPDK patches and discussions <>",
        "X-Mailer": "git-send-email 2.7.4",
        "List-Unsubscribe": "<>,\n <>",
        "Received": [
            "from ( [])\n\tby (Postfix) with ESMTP id 394F1A00BE;\n\tTue,  7 Jul 2020 13:14:46 +0200 (CEST)",
            "from [] (localhost [])\n\tby (Postfix) with ESMTP id A23251DE08;\n\tTue,  7 Jul 2020 13:14:42 +0200 (CEST)",
            "from ( [])\n by (Postfix) with ESMTP id C7D001DE08\n for <>; Tue,  7 Jul 2020 13:14:40 +0200 (CEST)",
            "from (unknown [])\n by (Postfix) with ESMTP id 42FEB101E;\n Tue,  7 Jul 2020 04:14:40 -0700 (PDT)",
            "from\n ( [])\n by (Postfix) with ESMTPA id 521EE3F71E;\n Tue,  7 Jul 2020 04:14:36 -0700 (PDT)"
        "X-Original-To": "",
        "X-Mailman-Version": "2.1.15",
        "List-Help": "<>",
        "Errors-To": "",
        "Subject": "[dpdk-dev] [PATCH v3 2/4] eventdev: use C11 atomics for lcore timer\n\tarmed flag",
        "Date": "Tue,  7 Jul 2020 19:13:21 +0800",
        "Message-Id": "<>",
        "Precedence": "list",
        "List-Post": "<>"
    "content": "The in_use flag is a per core variable which is not shared between\nlcores in the normal case and the access of this variable should be\nordered on the same core. However, if non-EAL thread pick the highest\nlcore to insert timers into, there is the possibility of conflicts\non this flag between threads. Then the atomic CAS operation is needed.\n\nUse the C11 atomic CAS instead of the generic rte_atomic operations\nto avoid the unnecessary barrier on aarch64.\n\nSigned-off-by: Phil Yang <>\nReviewed-by: Dharmik Thakkar <>\nReviewed-by: Ruifeng Wang <>\nAcked-by: Erik Gabriel Carrillo <>\n---\nv2:\n1. Make the code comments more accurate. (Erik)\n2. Define the in_use flag as an unsigned type. (Stephen)\n\n lib/librte_eventdev/rte_event_timer_adapter.c | 15 +++++++++++----\n 1 file changed, 11 insertions(+), 4 deletions(-)",
    "diff": "diff --git a/lib/librte_eventdev/rte_event_timer_adapter.c b/lib/librte_eventdev/rte_event_timer_adapter.c\nindex 370ea40..6d01a34 100644\n--- a/lib/librte_eventdev/rte_event_timer_adapter.c\n+++ b/lib/librte_eventdev/rte_event_timer_adapter.c\n@@ -554,7 +554,7 @@ struct swtim {\n \tuint32_t timer_data_id;\n \t/* Track which cores have actually armed a timer */\n \tstruct {\n-\t\trte_atomic16_t v;\n+\t\tuint16_t v;\n \t} __rte_cache_aligned in_use[RTE_MAX_LCORE];\n \t/* Track which cores' timer lists should be polled */\n \tunsigned int poll_lcores[RTE_MAX_LCORE];\n@@ -606,7 +606,8 @@ swtim_callback(struct rte_timer *tim)\n \t\t\t\t      \"with immediate expiry value\");\n \t\t}\n \n-\t\tif (unlikely(rte_atomic16_test_and_set(&sw->in_use[lcore].v))) {\n+\t\tif (unlikely(sw->in_use[lcore].v == 0)) {\n+\t\t\tsw->in_use[lcore].v = 1;\n \t\t\tn_lcores = __atomic_fetch_add(&sw->n_poll_lcores, 1,\n \t\t\t\t\t\t     __ATOMIC_RELAXED);\n \t\t\t__atomic_store_n(&sw->poll_lcores[n_lcores], lcore,\n@@ -834,7 +835,7 @@ swtim_init(struct rte_event_timer_adapter *adapter)\n \n \t/* Initialize the variables that track in-use timer lists */\n \tfor (i = 0; i < RTE_MAX_LCORE; i++)\n-\t\trte_atomic16_init(&sw->in_use[i].v);\n+\t\tsw->in_use[i].v = 0;\n \n \t/* Initialize the timer subsystem and allocate timer data instance */\n \tret = rte_timer_subsystem_init();\n@@ -1017,6 +1018,8 @@ __swtim_arm_burst(const struct rte_event_timer_adapter *adapter,\n \tstruct rte_timer *tim, *tims[nb_evtims];\n \tuint64_t cycles;\n \tint n_lcores;\n+\t/* Timer list for this lcore is not in use. */\n+\tuint16_t exp_state = 0;\n \n #ifdef RTE_LIBRTE_EVENTDEV_DEBUG\n \t/* Check that the service is running. */\n@@ -1035,8 +1038,12 @@ __swtim_arm_burst(const struct rte_event_timer_adapter *adapter,\n \t/* If this is the first time we're arming an event timer on this lcore,\n \t * mark this lcore as \"in use\"; this will cause the service\n \t * function to process the timer list that corresponds to this lcore.\n+\t * The atomic CAS operation can prevent the race condition on in_use\n+\t * flag between multiple non-EAL threads.\n \t */\n-\tif (unlikely(rte_atomic16_test_and_set(&sw->in_use[lcore_id].v))) {\n+\tif (unlikely(__atomic_compare_exchange_n(&sw->in_use[lcore_id].v,\n+\t\t\t&exp_state, 1, 0,\n+\t\t\t__ATOMIC_RELAXED, __ATOMIC_RELAXED))) {\n \t\tEVTIM_LOG_DBG(\"Adding lcore id = %u to list of lcores to poll\",\n \t\t\t      lcore_id);\n \t\tn_lcores = __atomic_fetch_add(&sw->n_poll_lcores, 1,\n",
    "prefixes": [