get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 2227793,
    "url": "http://patchwork.ozlabs.org/api/1.1/patches/2227793/?format=api",
    "web_url": "http://patchwork.ozlabs.org/project/qemu-devel/patch/20260424-force_rcu-v4-2-feccfaca0568@rsg.ci.i.u-tokyo.ac.jp/",
    "project": {
        "id": 14,
        "url": "http://patchwork.ozlabs.org/api/1.1/projects/14/?format=api",
        "name": "QEMU Development",
        "link_name": "qemu-devel",
        "list_id": "qemu-devel.nongnu.org",
        "list_email": "qemu-devel@nongnu.org",
        "web_url": "",
        "scm_url": "",
        "webscm_url": ""
    },
    "msgid": "<20260424-force_rcu-v4-2-feccfaca0568@rsg.ci.i.u-tokyo.ac.jp>",
    "date": "2026-04-24T09:27:07",
    "name": "[v4,2/6] qemu-thread: Add qemu_event_timedwait()",
    "commit_ref": null,
    "pull_url": null,
    "state": "new",
    "archived": false,
    "hash": "e34964a4b641076df4c4ffd4ce6fed6556b6ae13",
    "submitter": {
        "id": 90980,
        "url": "http://patchwork.ozlabs.org/api/1.1/people/90980/?format=api",
        "name": "Akihiko Odaki",
        "email": "odaki@rsg.ci.i.u-tokyo.ac.jp"
    },
    "delegate": null,
    "mbox": "http://patchwork.ozlabs.org/project/qemu-devel/patch/20260424-force_rcu-v4-2-feccfaca0568@rsg.ci.i.u-tokyo.ac.jp/mbox/",
    "series": [
        {
            "id": 501326,
            "url": "http://patchwork.ozlabs.org/api/1.1/series/501326/?format=api",
            "web_url": "http://patchwork.ozlabs.org/project/qemu-devel/list/?series=501326",
            "date": "2026-04-24T09:27:07",
            "name": "virtio-gpu: Force RCU when unmapping blob",
            "version": 4,
            "mbox": "http://patchwork.ozlabs.org/series/501326/mbox/"
        }
    ],
    "comments": "http://patchwork.ozlabs.org/api/patches/2227793/comments/",
    "check": "pending",
    "checks": "http://patchwork.ozlabs.org/api/patches/2227793/checks/",
    "tags": {},
    "headers": {
        "Return-Path": "<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>",
        "X-Original-To": "incoming@patchwork.ozlabs.org",
        "Delivered-To": "patchwork-incoming@legolas.ozlabs.org",
        "Authentication-Results": [
            "legolas.ozlabs.org;\n\tdkim=fail reason=\"key not found in DNS\" header.d=rsg.ci.i.u-tokyo.ac.jp\n header.i=@rsg.ci.i.u-tokyo.ac.jp header.a=rsa-sha256 header.s=rs20250326\n header.b=B77EdOnM;\n\tdkim-atps=neutral",
            "legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=nongnu.org\n (client-ip=209.51.188.17; helo=lists1p.gnu.org;\n envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org;\n receiver=patchwork.ozlabs.org)"
        ],
        "Received": [
            "from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17])\n\t(using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits))\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4g271c3Nmmz1xvV\n\tfor <incoming@patchwork.ozlabs.org>; Fri, 24 Apr 2026 19:28:36 +1000 (AEST)",
            "from localhost ([::1] helo=lists1p.gnu.org)\n\tby lists1p.gnu.org with esmtp (Exim 4.90_1)\n\t(envelope-from <qemu-devel-bounces@nongnu.org>)\n\tid 1wGCpV-0007ts-BK; Fri, 24 Apr 2026 05:28:10 -0400",
            "from eggs.gnu.org ([2001:470:142:3::10])\n by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)\n (Exim 4.90_1) (envelope-from <odaki@rsg.ci.i.u-tokyo.ac.jp>)\n id 1wGCp3-0007Mt-Ck\n for qemu-devel@nongnu.org; Fri, 24 Apr 2026 05:27:41 -0400",
            "from www3579.sakura.ne.jp ([49.212.243.89])\n by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)\n (Exim 4.90_1) (envelope-from <odaki@rsg.ci.i.u-tokyo.ac.jp>)\n id 1wGCoz-0007aC-Nd\n for qemu-devel@nongnu.org; Fri, 24 Apr 2026 05:27:41 -0400",
            "from h205.csg.ci.i.u-tokyo.ac.jp (h205.csg.ci.i.u-tokyo.ac.jp\n [133.11.54.205]) (authenticated bits=0)\n by www3579.sakura.ne.jp (8.16.1/8.16.1) with ESMTPSA id 63O9RHIe004358\n (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO);\n Fri, 24 Apr 2026 18:27:26 +0900 (JST)\n (envelope-from odaki@rsg.ci.i.u-tokyo.ac.jp)"
        ],
        "DKIM-Signature": "a=rsa-sha256; bh=rXcv6yelvtBYoc9z4CKug8RC1XR4ObzkiQj9RjCrBck=;\n c=relaxed/relaxed; d=rsg.ci.i.u-tokyo.ac.jp;\n h=From:Message-Id:To:Subject:Date;\n s=rs20250326; t=1777022846; v=1;\n b=B77EdOnMQ1HS2uu106kSWucys2Esk9gh7mOrX4lQd6NT0nlqzTzOppyRWqk3zHf9\n OBXNYG/KoSips4ezNX/icSgIySNMeWMbbGNS4G2FJ9J9vPYcKNOD9iPCMuNTy8l1\n r0BcTLzD2ZoRO+eLIUbKZwEb2dm0CtlRsc1e4Y9jYBD7YvnfMqdta1CugDpWDbR/\n ya1x4uuvry2pQC1kRFdo6IppDtF4Gdrj3P18pdbgs4HmOfn7IJO1v/Uoh1MwxQO2\n 3yrTwkqO4lq6YuiQel8NScjkYnJhzGK9g93Q6tpWVcbtUAfORwg7OyI8nTb6d83A\n oVXY/hraHNxueb/9w07MPg==",
        "From": "Akihiko Odaki <odaki@rsg.ci.i.u-tokyo.ac.jp>",
        "Date": "Fri, 24 Apr 2026 18:27:07 +0900",
        "Subject": "[PATCH v4 2/6] qemu-thread: Add qemu_event_timedwait()",
        "MIME-Version": "1.0",
        "Content-Type": "text/plain; charset=\"utf-8\"",
        "Content-Transfer-Encoding": "7bit",
        "Message-Id": "<20260424-force_rcu-v4-2-feccfaca0568@rsg.ci.i.u-tokyo.ac.jp>",
        "References": "<20260424-force_rcu-v4-0-feccfaca0568@rsg.ci.i.u-tokyo.ac.jp>",
        "In-Reply-To": "<20260424-force_rcu-v4-0-feccfaca0568@rsg.ci.i.u-tokyo.ac.jp>",
        "To": "qemu-devel@nongnu.org, Dmitry Osipenko <dmitry.osipenko@collabora.com>",
        "Cc": "Paolo Bonzini <pbonzini@redhat.com>,\n \"Michael S. Tsirkin\" <mst@redhat.com>,\n =?utf-8?q?Alex_Benn=C3=A9e?= <alex.bennee@linaro.org>,\n Akihiko Odaki <odaki@rsg.ci.i.u-tokyo.ac.jp>",
        "X-Mailer": "b4 0.16-dev-16047",
        "Received-SPF": "pass client-ip=49.212.243.89;\n envelope-from=odaki@rsg.ci.i.u-tokyo.ac.jp; helo=www3579.sakura.ne.jp",
        "X-Spam_score_int": "-16",
        "X-Spam_score": "-1.7",
        "X-Spam_bar": "-",
        "X-Spam_report": "(-1.7 / 5.0 requ) BAYES_00=-1.9, DKIM_INVALID=0.1,\n DKIM_SIGNED=0.1, SPF_HELO_NONE=0.001,\n SPF_PASS=-0.001 autolearn=no autolearn_force=no",
        "X-Spam_action": "no action",
        "X-BeenThere": "qemu-devel@nongnu.org",
        "X-Mailman-Version": "2.1.29",
        "Precedence": "list",
        "List-Id": "qemu development <qemu-devel.nongnu.org>",
        "List-Unsubscribe": "<https://lists.nongnu.org/mailman/options/qemu-devel>,\n <mailto:qemu-devel-request@nongnu.org?subject=unsubscribe>",
        "List-Archive": "<https://lists.nongnu.org/archive/html/qemu-devel>",
        "List-Post": "<mailto:qemu-devel@nongnu.org>",
        "List-Help": "<mailto:qemu-devel-request@nongnu.org?subject=help>",
        "List-Subscribe": "<https://lists.nongnu.org/mailman/listinfo/qemu-devel>,\n <mailto:qemu-devel-request@nongnu.org?subject=subscribe>",
        "Errors-To": "qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org",
        "Sender": "qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org"
    },
    "content": "qemu_event_timedwait() is equivalent to qemu_event_wait(), except it has\na relative timeout.\n\nSigned-off-by: Akihiko Odaki <odaki@rsg.ci.i.u-tokyo.ac.jp>\nTested-by: Dmitry Osipenko <dmitry.osipenko@collabora.com>\n---\n include/qemu/thread-posix.h | 11 +++++++++++\n include/qemu/thread.h       |  9 ++++++++-\n util/event.c                | 31 ++++++++++++++++++++++++++-----\n util/qemu-thread-posix.c    | 11 +----------\n 4 files changed, 46 insertions(+), 16 deletions(-)",
    "diff": "diff --git a/include/qemu/thread-posix.h b/include/qemu/thread-posix.h\nindex 758808b705e4..11193b1580f8 100644\n--- a/include/qemu/thread-posix.h\n+++ b/include/qemu/thread-posix.h\n@@ -36,4 +36,15 @@ struct QemuThread {\n     pthread_t thread;\n };\n \n+static inline clockid_t qemu_timedwait_clockid(void)\n+{\n+#ifdef CONFIG_PTHREAD_CONDATTR_SETCLOCK\n+    return CLOCK_MONOTONIC;\n+#else\n+    return CLOCK_REALTIME;\n+#endif\n+}\n+\n+void compute_abs_deadline(struct timespec *ts, int ms);\n+\n #endif\ndiff --git a/include/qemu/thread.h b/include/qemu/thread.h\nindex 98cc5c41ac58..8536859bcb3a 100644\n--- a/include/qemu/thread.h\n+++ b/include/qemu/thread.h\n@@ -201,7 +201,14 @@ void qemu_sem_destroy(QemuSemaphore *sem);\n void qemu_event_init(QemuEvent *ev, bool init);\n void qemu_event_set(QemuEvent *ev);\n void qemu_event_reset(QemuEvent *ev);\n-void qemu_event_wait(QemuEvent *ev);\n+bool qemu_event_timedwait(QemuEvent *ev, int ms);\n+\n+static inline void qemu_event_wait(QemuEvent *ev)\n+{\n+    while (!qemu_event_timedwait(ev, INT_MAX)) {\n+    }\n+}\n+\n void qemu_event_destroy(QemuEvent *ev);\n \n void qemu_thread_create(QemuThread *thread, const char *name,\ndiff --git a/util/event.c b/util/event.c\nindex 5a8141cd0e46..a7a5ee0aa5f5 100644\n--- a/util/event.c\n+++ b/util/event.c\n@@ -33,7 +33,15 @@ void qemu_event_init(QemuEvent *ev, bool init)\n {\n #ifndef HAVE_FUTEX\n     pthread_mutex_init(&ev->lock, NULL);\n+#ifdef CONFIG_PTHREAD_CONDATTR_SETCLOCK\n+    pthread_condattr_t attr;\n+    pthread_condattr_init(&attr);\n+    pthread_condattr_setclock(&attr, qemu_timedwait_clockid());\n+    pthread_cond_init(&ev->cond, &attr);\n+    pthread_condattr_destroy(&attr);\n+#else\n     pthread_cond_init(&ev->cond, NULL);\n+#endif\n #endif\n \n     ev->value = (init ? EV_SET : EV_FREE);\n@@ -121,15 +129,17 @@ void qemu_event_reset(QemuEvent *ev)\n #endif\n }\n \n-void qemu_event_wait(QemuEvent *ev)\n+bool qemu_event_timedwait(QemuEvent *ev, int ms)\n {\n     assert(ev->initialized);\n \n #ifdef HAVE_FUTEX\n+    int64_t deadline = get_clock() + (int64_t)ms * SCALE_MS;\n+\n     while (true) {\n         /*\n-         * qemu_event_wait must synchronize with qemu_event_set even if it does\n-         * not go down the slow path, so this load-acquire is needed that\n+         * qemu_event_timedwait must synchronize with qemu_event_set even if it\n+         * does not go down the slow path, so this load-acquire is needed that\n          * synchronizes with the first memory barrier in qemu_event_set().\n          */\n         unsigned value = qatomic_load_acquire(&ev->value);\n@@ -159,13 +169,24 @@ void qemu_event_wait(QemuEvent *ev)\n          * a smp_mb() pairing with the second barrier of qemu_event_set().\n          * The barrier is inside the FUTEX_WAIT system call.\n          */\n-        qemu_futex_wait(ev, EV_BUSY);\n+        if (!qemu_futex_timedwait(ev, EV_BUSY, deadline)) {\n+            return false;\n+        }\n     }\n #else\n+    struct timespec ts;\n+\n+    compute_abs_deadline(&ts, ms);\n+\n     pthread_mutex_lock(&ev->lock);\n     while (qatomic_read(&ev->value) != EV_SET) {\n-        pthread_cond_wait(&ev->cond, &ev->lock);\n+        if (pthread_cond_timedwait(&ev->cond, &ev->lock, &ts)) {\n+            pthread_mutex_unlock(&ev->lock);\n+            return false;\n+        }\n     }\n     pthread_mutex_unlock(&ev->lock);\n #endif\n+\n+    return true;\n }\ndiff --git a/util/qemu-thread-posix.c b/util/qemu-thread-posix.c\nindex bd1c2ad2a596..dc1125006ceb 100644\n--- a/util/qemu-thread-posix.c\n+++ b/util/qemu-thread-posix.c\n@@ -59,16 +59,7 @@ static void error_exit(int err, const char *msg)\n     abort();\n }\n \n-static inline clockid_t qemu_timedwait_clockid(void)\n-{\n-#ifdef CONFIG_PTHREAD_CONDATTR_SETCLOCK\n-    return CLOCK_MONOTONIC;\n-#else\n-    return CLOCK_REALTIME;\n-#endif\n-}\n-\n-static void compute_abs_deadline(struct timespec *ts, int ms)\n+void compute_abs_deadline(struct timespec *ts, int ms)\n {\n     clock_gettime(qemu_timedwait_clockid(), ts);\n     ts->tv_nsec += (ms % 1000) * 1000000;\n",
    "prefixes": [
        "v4",
        "2/6"
    ]
}