get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 92505,
    "url": "http://patches.dpdk.org/api/patches/92505/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/20210430125725.28796-17-mk@semihalf.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": "<20210430125725.28796-17-mk@semihalf.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20210430125725.28796-17-mk@semihalf.com",
    "date": "2021-04-30T12:57:19",
    "name": "[16/22] net/ena: handle spurious wakeups in ENA_WAIT_EVENT",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "9a7fb95499020ec0967458db6511af659677cbf8",
    "submitter": {
        "id": 786,
        "url": "http://patches.dpdk.org/api/people/786/?format=api",
        "name": "Michal Krawczyk",
        "email": "mk@semihalf.com"
    },
    "delegate": {
        "id": 319,
        "url": "http://patches.dpdk.org/api/users/319/?format=api",
        "username": "fyigit",
        "first_name": "Ferruh",
        "last_name": "Yigit",
        "email": "ferruh.yigit@amd.com"
    },
    "mbox": "http://patches.dpdk.org/project/dpdk/patch/20210430125725.28796-17-mk@semihalf.com/mbox/",
    "series": [
        {
            "id": 16774,
            "url": "http://patches.dpdk.org/api/series/16774/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=16774",
            "date": "2021-04-30T12:57:03",
            "name": "net/ena: update ENA PMD to v2.3.0",
            "version": 1,
            "mbox": "http://patches.dpdk.org/series/16774/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/92505/comments/",
    "check": "warning",
    "checks": "http://patches.dpdk.org/api/patches/92505/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 9FA12A0546;\n\tFri, 30 Apr 2021 14:59:20 +0200 (CEST)",
            "from [217.70.189.124] (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 7EB5E41317;\n\tFri, 30 Apr 2021 14:58:05 +0200 (CEST)",
            "from mail-wm1-f45.google.com (mail-wm1-f45.google.com\n [209.85.128.45]) by mails.dpdk.org (Postfix) with ESMTP id DBEF24128C\n for <dev@dpdk.org>; Fri, 30 Apr 2021 14:57:58 +0200 (CEST)",
            "by mail-wm1-f45.google.com with SMTP id\n s5-20020a7bc0c50000b0290147d0c21c51so734501wmh.4\n for <dev@dpdk.org>; Fri, 30 Apr 2021 05:57:58 -0700 (PDT)",
            "from DESKTOP-U5LNN3J.localdomain (89-79-189-199.dynamic.chello.pl.\n [89.79.189.199])\n by smtp.gmail.com with ESMTPSA id l13sm13476245wmj.3.2021.04.30.05.57.56\n (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n Fri, 30 Apr 2021 05:57:57 -0700 (PDT)"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=semihalf-com.20150623.gappssmtp.com; s=20150623;\n h=from:to:cc:subject:date:message-id:in-reply-to:references\n :mime-version:content-transfer-encoding;\n bh=TIr0IcWMw7c7CshCM89tQOMknmrDZM145Vjg0lSsXKE=;\n b=l0iPaMuOiWOlE1hR9me2Ut2zb3nPHwXrHaFwY/IUABgLQOf1MHVxivBcoDGJqichqq\n XYrv0xORu4ayHhlmudBdt6yuRN3QH5dgUv4tpfo2Nf+NrRAPwbHpaoN/om5E7S6bLrnn\n GpIs+u4E4u7hX0hrigI6Em42hD+iiueC5OtkuziAK1LnguiicqEcIotzckcIVGodyGDC\n O98KQQ9H/Sm9RqS+tRxidBLqyIWKSsTGKV5kPRXmQFeaXRogfhziLVjndS1zs0yYNB9X\n 2Hc00UzqHqje0LT1ze/BirKyPRLRmxjsZMxWfca7iQIOq9M4UNlwG7+zU0MX7O1RD6TS\n cf3Q==",
        "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20161025;\n h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to\n :references:mime-version:content-transfer-encoding;\n bh=TIr0IcWMw7c7CshCM89tQOMknmrDZM145Vjg0lSsXKE=;\n b=eJ2nyd0FEnFw2AryE2bLJeA6pF9QhPKb7uMyz9BgqGU54rXAGBe1o9F5K1kl/KsC8F\n W7TZby8tbw0mwqFLojp3cOvsTE95cKaz3shuMiOHMO4mX0B3GyZbnttIVDMyHQYTv5NA\n EIM7d0EOlY4n/OFjcE4YtnvxZsy7x4jFQSFRn2vNC2QQJz7FwZmvdtTfzoeDLaqdZY5H\n 2d71cre/6znhOkchNJpJ/V0o9LigPNchYZtDnchtWgXdrBQDV3o+XJBYQNroNsmJ+tHG\n KyV7XGhzt1gs10uqkdRhU+LkVvtTgfdIC6t25/jY8rFs3nxkVtCfJt3tPemolOvb/GgI\n AROA==",
        "X-Gm-Message-State": "AOAM533GAjFG1gDVIJhnUE+g2sLwsAdT4asw8L6wHFdZXDRHKKRTNMyG\n CIdSTz2+SaxdBK70piM/MO/LnOxQR14oyKdm",
        "X-Google-Smtp-Source": "\n ABdhPJwvCErmHB9FXZ6vkdZ2QUJbUsldQ2SdJPrl4Aqc8RMKyKhCm4aF/DdqC+Vp97g4bbrmPiPblg==",
        "X-Received": "by 2002:a1c:2bc4:: with SMTP id r187mr154101wmr.153.1619787477970;\n Fri, 30 Apr 2021 05:57:57 -0700 (PDT)",
        "From": "Michal Krawczyk <mk@semihalf.com>",
        "To": "dev@dpdk.org",
        "Cc": "ndagan@amazom.com, gtzalik@amazon.com, igorch@amazon.com, mw@semihalf.com,\n Stanislaw Kardach <kda@semihalf.com>, Michal Krawczyk <mk@semihalf.com>,\n Shay Agroskin <shayagr@amazon.com>",
        "Date": "Fri, 30 Apr 2021 14:57:19 +0200",
        "Message-Id": "<20210430125725.28796-17-mk@semihalf.com>",
        "X-Mailer": "git-send-email 2.25.1",
        "In-Reply-To": "<20210430125725.28796-1-mk@semihalf.com>",
        "References": "<20210430125725.28796-1-mk@semihalf.com>",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "Subject": "[dpdk-dev] [PATCH 16/22] net/ena: handle spurious wakeups in\n ENA_WAIT_EVENT",
        "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",
        "Sender": "\"dev\" <dev-bounces@dpdk.org>"
    },
    "content": "From: Stanislaw Kardach <kda@semihalf.com>\n\npthread_cond_timedwait() may spuriously wakeup according to POSIX.\nTherefore it is required to check whether predicate is actually true\nbefore finishing the waiting loop.\n\nSigned-off-by: Stanislaw Kardach <kda@semihalf.com>\nReviewed-by: Michal Krawczyk <mk@semihalf.com>\nReviewed-by: Igor Chauskin <igorch@amazon.com>\nReviewed-by: Shay Agroskin <shayagr@amazon.com>\n---\n drivers/net/ena/base/ena_plat_dpdk.h | 75 +++++++++++++++++-----------\n 1 file changed, 47 insertions(+), 28 deletions(-)",
    "diff": "diff --git a/drivers/net/ena/base/ena_plat_dpdk.h b/drivers/net/ena/base/ena_plat_dpdk.h\nindex 2e40ea1bb4..2e2cd0736c 100644\n--- a/drivers/net/ena/base/ena_plat_dpdk.h\n+++ b/drivers/net/ena/base/ena_plat_dpdk.h\n@@ -74,6 +74,14 @@ typedef uint64_t dma_addr_t;\n #define mmiowb rte_io_wmb\n #define __iomem\n \n+#ifndef READ_ONCE\n+#define READ_ONCE(var) (*((volatile typeof(var) *)(&(var))))\n+#endif\n+\n+#define READ_ONCE8(var) READ_ONCE(var)\n+#define READ_ONCE16(var) READ_ONCE(var)\n+#define READ_ONCE32(var) READ_ONCE(var)\n+\n #define US_PER_S 1000000\n #define ENA_GET_SYSTEM_USECS()\t\t\t\t\t\t       \\\n \t(rte_get_timer_cycles() * US_PER_S / rte_get_timer_hz())\n@@ -134,40 +142,59 @@ extern int ena_logtype_com;\n \t({(void)flags; rte_spinlock_unlock(&(spinlock)); })\n #define ENA_SPINLOCK_DESTROY(spinlock) ((void)spinlock)\n \n-#define q_waitqueue_t\t\t\t\t\t\t\t       \\\n-\tstruct {\t\t\t\t\t\t\t       \\\n-\t\tpthread_cond_t cond;\t\t\t\t\t       \\\n-\t\tpthread_mutex_t mutex;\t\t\t\t\t       \\\n-\t}\n+typedef struct {\n+\tpthread_cond_t cond;\n+\tpthread_mutex_t mutex;\n+\tuint8_t flag;\n+} ena_wait_event_t;\n \n-#define ena_wait_queue_t q_waitqueue_t\n-\n-#define ENA_WAIT_EVENT_INIT(waitqueue)\t\t\t\t\t       \\\n+#define ENA_WAIT_EVENT_INIT(waitevent)\t\t\t\t\t       \\\n \tdo {\t\t\t\t\t\t\t\t       \\\n-\t\tpthread_mutex_init(&(waitqueue).mutex, NULL);\t\t       \\\n-\t\tpthread_cond_init(&(waitqueue).cond, NULL);\t\t       \\\n+\t\tena_wait_event_t *_we = &(waitevent);\t\t\t       \\\n+\t\tpthread_mutex_init(&_we->mutex, NULL);\t\t\t       \\\n+\t\tpthread_cond_init(&_we->cond, NULL);\t\t\t       \\\n+\t\t_we->flag = 0;\t\t\t\t\t\t       \\\n \t} while (0)\n \n #define ENA_WAIT_EVENT_WAIT(waitevent, timeout)\t\t\t\t       \\\n \tdo {\t\t\t\t\t\t\t\t       \\\n+\t\tena_wait_event_t *_we = &(waitevent);\t\t\t       \\\n+\t\ttypeof(timeout) _tmo = (timeout);\t\t\t       \\\n+\t\tint ret = 0;\t\t\t\t\t\t       \\\n \t\tstruct timespec wait;\t\t\t\t\t       \\\n \t\tstruct timeval now;\t\t\t\t\t       \\\n \t\tunsigned long timeout_us;\t\t\t\t       \\\n \t\tgettimeofday(&now, NULL);\t\t\t\t       \\\n-\t\twait.tv_sec = now.tv_sec + timeout / 1000000UL;\t\t       \\\n-\t\ttimeout_us = timeout % 1000000UL;\t\t\t       \\\n+\t\twait.tv_sec = now.tv_sec + _tmo / 1000000UL;\t\t       \\\n+\t\ttimeout_us = _tmo % 1000000UL;\t\t\t\t       \\\n \t\twait.tv_nsec = (now.tv_usec + timeout_us) * 1000UL;\t       \\\n-\t\tpthread_mutex_lock(&waitevent.mutex);\t\t\t       \\\n-\t\tpthread_cond_timedwait(&waitevent.cond,\t\t\t       \\\n-\t\t\t\t&waitevent.mutex, &wait);\t\t       \\\n-\t\tpthread_mutex_unlock(&waitevent.mutex);\t\t\t       \\\n+\t\tpthread_mutex_lock(&_we->mutex);\t\t\t       \\\n+\t\twhile (ret == 0 && !_we->flag) {\t\t\t       \\\n+\t\t\tret = pthread_cond_timedwait(&_we->cond,\t       \\\n+\t\t\t\t&_we->mutex, &wait);\t\t\t       \\\n+\t\t}\t\t\t\t\t\t\t       \\\n+\t\t/* Asserts only if not working on ena_wait_event_t */\t       \\\n+\t\tif (unlikely(ret != 0 && ret != ETIMEDOUT))\t\t       \\\n+\t\t\trte_panic(\"Invalid wait event. pthread ret: %d\\n\",     \\\n+\t\t\t\t  ret);\t\t\t\t\t       \\\n+\t\telse if (unlikely(ret == ETIMEDOUT))\t\t\t       \\\n+\t\t\tena_trc_err(NULL,\t\t\t\t       \\\n+\t\t\t\t\"Timeout waiting for \" #waitevent \"\\n\");       \\\n+\t\t_we->flag = 0;\t\t\t\t\t\t       \\\n+\t\tpthread_mutex_unlock(&_we->mutex);\t\t\t       \\\n+\t} while (0)\n+#define ENA_WAIT_EVENT_SIGNAL(waitevent)\t\t\t\t       \\\n+\tdo {\t\t\t\t\t\t\t\t       \\\n+\t\tena_wait_event_t *_we = &(waitevent);\t\t\t       \\\n+\t\tpthread_mutex_lock(&_we->mutex);\t\t\t       \\\n+\t\t_we->flag = 1;\t\t\t\t\t\t       \\\n+\t\tpthread_cond_signal(&_we->cond);\t\t\t       \\\n+\t\tpthread_mutex_unlock(&_we->mutex);\t\t\t       \\\n \t} while (0)\n-#define ENA_WAIT_EVENT_SIGNAL(waitevent) pthread_cond_signal(&waitevent.cond)\n /* pthread condition doesn't need to be rearmed after usage */\n #define ENA_WAIT_EVENT_CLEAR(...)\n-#define ENA_WAIT_EVENT_DESTROY(admin_queue) ((void)(admin_queue))\n+#define ENA_WAIT_EVENT_DESTROY(waitevent) ((void)(waitevent))\n \n-#define ena_wait_event_t ena_wait_queue_t\n #define ENA_MIGHT_SLEEP()\n \n #define ena_time_t uint64_t\n@@ -281,15 +308,7 @@ extern rte_atomic64_t ena_alloc_cnt;\n #define ENA_TIME_EXPIRE(timeout)  (timeout < rte_get_timer_cycles())\n #define ENA_GET_SYSTEM_TIMEOUT(timeout_us)\t\t\t\t       \\\n     (timeout_us * rte_get_timer_hz() / 1000000 + rte_get_timer_cycles())\n-#define ENA_WAIT_EVENTS_DESTROY(waitqueue) ((void)(waitqueue))\n-\n-#ifndef READ_ONCE\n-#define READ_ONCE(var) (*((volatile typeof(var) *)(&(var))))\n-#endif\n-\n-#define READ_ONCE8(var) READ_ONCE(var)\n-#define READ_ONCE16(var) READ_ONCE(var)\n-#define READ_ONCE32(var) READ_ONCE(var)\n+#define ENA_WAIT_EVENTS_DESTROY(admin_queue) ((void)(admin_queue))\n \n /* The size must be 8 byte align */\n #define ENA_MEMCPY_TO_DEVICE_64(dst, src, size)\t\t\t\t       \\\n",
    "prefixes": [
        "16/22"
    ]
}