get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 2224893,
    "url": "http://patchwork.ozlabs.org/api/patches/2224893/?format=api",
    "web_url": "http://patchwork.ozlabs.org/project/ltp/patch/20260419130053.13996-1-mmenashe@redhat.com/",
    "project": {
        "id": 59,
        "url": "http://patchwork.ozlabs.org/api/projects/59/?format=api",
        "name": "Linux Test Project development",
        "link_name": "ltp",
        "list_id": "ltp.lists.linux.it",
        "list_email": "ltp@lists.linux.it",
        "web_url": "",
        "scm_url": "",
        "webscm_url": "",
        "list_archive_url": "",
        "list_archive_url_format": "",
        "commit_url_format": ""
    },
    "msgid": "<20260419130053.13996-1-mmenashe@redhat.com>",
    "list_archive_url": null,
    "date": "2026-04-19T13:00:53",
    "name": "[v3] futex: Add error coverage tests for wait, wake and cmp_requeue",
    "commit_ref": null,
    "pull_url": null,
    "state": "needs-review-ack",
    "archived": false,
    "hash": "aba7321c60861fb71836d69e8589a1e7bc444443",
    "submitter": {
        "id": 93123,
        "url": "http://patchwork.ozlabs.org/api/people/93123/?format=api",
        "name": "Michael Menasherov",
        "email": "mmenashe@redhat.com"
    },
    "delegate": null,
    "mbox": "http://patchwork.ozlabs.org/project/ltp/patch/20260419130053.13996-1-mmenashe@redhat.com/mbox/",
    "series": [
        {
            "id": 500499,
            "url": "http://patchwork.ozlabs.org/api/series/500499/?format=api",
            "web_url": "http://patchwork.ozlabs.org/project/ltp/list/?series=500499",
            "date": "2026-04-19T13:00:53",
            "name": "[v3] futex: Add error coverage tests for wait, wake and cmp_requeue",
            "version": 3,
            "mbox": "http://patchwork.ozlabs.org/series/500499/mbox/"
        }
    ],
    "comments": "http://patchwork.ozlabs.org/api/patches/2224893/comments/",
    "check": "warning",
    "checks": "http://patchwork.ozlabs.org/api/patches/2224893/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<ltp-bounces+incoming=patchwork.ozlabs.org@lists.linux.it>",
        "X-Original-To": [
            "incoming@patchwork.ozlabs.org",
            "ltp@lists.linux.it"
        ],
        "Delivered-To": [
            "patchwork-incoming@legolas.ozlabs.org",
            "ltp@picard.linux.it"
        ],
        "Authentication-Results": [
            "legolas.ozlabs.org;\n\tdkim=pass (1024-bit key;\n unprotected) header.d=lists.linux.it header.i=@lists.linux.it\n header.a=rsa-sha256 header.s=picard header.b=PgycD+wB;\n\tdkim=fail reason=\"signature verification failed\" (1024-bit key;\n unprotected) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256\n header.s=mimecast20190719 header.b=T/A80tyU;\n\tdkim-atps=neutral",
            "legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=lists.linux.it\n (client-ip=213.254.12.146; helo=picard.linux.it;\n envelope-from=ltp-bounces+incoming=patchwork.ozlabs.org@lists.linux.it;\n receiver=patchwork.ozlabs.org)"
        ],
        "Received": [
            "from picard.linux.it (picard.linux.it [213.254.12.146])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519 server-signature ECDSA (secp384r1) server-digest SHA384)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4fz7zS6vZgz1yD4\n\tfor <incoming@patchwork.ozlabs.org>; Sun, 19 Apr 2026 23:01:23 +1000 (AEST)",
            "from picard.linux.it (localhost [IPv6:::1])\n\tby picard.linux.it (Postfix) with ESMTP id 085A93E2DB1\n\tfor <incoming@patchwork.ozlabs.org>; Sun, 19 Apr 2026 15:01:18 +0200 (CEST)",
            "from in-4.smtp.seeweb.it (in-4.smtp.seeweb.it\n [IPv6:2001:4b78:1:20::4])\n (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n key-exchange X25519 server-signature ECDSA (secp384r1))\n (No client certificate requested)\n by picard.linux.it (Postfix) with ESMTPS id A8DF13C041A\n for <ltp@lists.linux.it>; Sun, 19 Apr 2026 15:01:12 +0200 (CEST)",
            "from us-smtp-delivery-124.mimecast.com\n (us-smtp-delivery-124.mimecast.com [170.10.133.124])\n (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest\n SHA256)\n (No client certificate requested)\n by in-4.smtp.seeweb.it (Postfix) with ESMTPS id 7EC8D10001A6\n for <ltp@lists.linux.it>; Sun, 19 Apr 2026 15:01:10 +0200 (CEST)",
            "from mail-pf1-f199.google.com (mail-pf1-f199.google.com\n [209.85.210.199]) by relay.mimecast.com with ESMTP with STARTTLS\n (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id\n us-mta-98-Sd74zOTTOvKbqnb_0gj5Ng-1; Sun, 19 Apr 2026 09:01:08 -0400",
            "by mail-pf1-f199.google.com with SMTP id\n d2e1a72fcca58-82f896eb6faso2313144b3a.3\n for <ltp@lists.linux.it>; Sun, 19 Apr 2026 06:01:07 -0700 (PDT)",
            "from fedora.redhat.com (46-116-192-140.bb.netvision.net.il.\n [46.116.192.140]) by smtp.gmail.com with ESMTPSA id\n d2e1a72fcca58-82f8e9fbb85sm8958336b3a.22.2026.04.19.06.01.00\n (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n Sun, 19 Apr 2026 06:01:03 -0700 (PDT)"
        ],
        "DKIM-Signature": [
            "v=1; a=rsa-sha256; c=relaxed/simple; d=lists.linux.it;\n i=@lists.linux.it; q=dns/txt; s=picard; t=1776603678; h=to : date :\n message-id : mime-version : subject : list-id : list-unsubscribe :\n list-archive : list-post : list-help : list-subscribe : from :\n reply-to : content-type : content-transfer-encoding : sender : from;\n bh=qgds83nVlFrwkdBUue0Myj7TVzEnz70wR712yRaqwE0=;\n b=PgycD+wBJ0QQHecHuua7NsSB+PPXpcP/m8yrFyldp/vypQ7CyNckWmQDpwwR1klGI5lM4\n gsb7P7SLXjBsioP8mpBKn1MsT8kOk+nMiVLDt3pHisbTG+3YBZTOyWk0aVqaBV4+JUEgG4g\n +CPZkO5WpGB7R73lqoZcXevNmI9wgqQ=",
            "v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com;\n s=mimecast20190719; t=1776603669;\n h=from:from:reply-to:subject:subject:date:date:message-id:message-id:\n to:to:cc:cc:mime-version:mime-version:content-type:content-type:\n content-transfer-encoding:content-transfer-encoding;\n bh=y2vuzX9gKGB/X3ta3qI4VnLTEdIAOGUqsXCkf4lvhjU=;\n b=T/A80tyUJ9qCG8myPihRkv/WYWiYSQ55Qn4j4nm4NNw96k0isVdXf2bxaV5plnWsOzjBJ9\n ef26EEArfOlq1JHFfb6kZ5UTq5VYr+4Q+4bVp90hAJhQUc9Sbo3OCygSPXBveOeuFieY7w\n tCJcIWkjGV/EKbhAkBejECvTVgMroR8="
        ],
        "X-MC-Unique": "Sd74zOTTOvKbqnb_0gj5Ng-1",
        "X-Mimecast-MFC-AGG-ID": "Sd74zOTTOvKbqnb_0gj5Ng_1776603667",
        "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20251104; t=1776603666; x=1777208466;\n h=content-transfer-encoding:mime-version:message-id:date:subject:cc\n :to:from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date\n :message-id:reply-to;\n bh=y2vuzX9gKGB/X3ta3qI4VnLTEdIAOGUqsXCkf4lvhjU=;\n b=cvr/ufXpr5nslvNkgEsh8FtEnLfWbs/attlJGtcHcCZJwXzoYgwTYVr017ThCTxSS8\n bgcfRYSVrWvsUJfK59+vH3a7tdZeh/wiqSN/H/nf7Cdk5r3D+lpPp9Du1SdzsCGnZkVJ\n OuAo4ybSWj1w/2EgkG/mASCKx5kmflxJ6gzkKf/boQGA5r1cU1i800y6S7XLBthdJdvJ\n hIOaVXFb4YlGLxFURK/hpCQFEx+n5u2/6CV6lSYjvHdfWqIFwc/NkLKyxyEHP5QELP7a\n d6pscc8/u9C9peUuvIFBVJ+d0j8AAR22l/+B1JrkzHAGqDxfz7PnLHV18zTOINongElf\n QqYw==",
        "X-Gm-Message-State": "AOJu0YyEmsHUC6UZLTadXLoKw32eMwKFvKsvod2tCLm33FVKyg4bcQLe\n d+hiODSwEMEWpOcIWMT8dMkyADmbxW3MFlwb47dAMb+ySmUvTxap2n9xAY1f9sHlDvakT31EuzO\n rRHv3BTsNnmUmQrk1dcJAFymBVzjPqOK7OS/SWT6KZOg+Cdj5QwrL2SQVGc18XrBewOcsJV5xhz\n XnV8JuGc5+O+nTU53FnvgFSnL4dCAjhL3KVfU1",
        "X-Gm-Gg": "AeBDiev82aFM3vCO4u+VEzEwv7nanONkR9XXJFqn7i7qWWJjD2TkcB97OuoURZVUuHu\n e86/zC2FgGeBjgyfPwumRmKEVNHQ4h4ujmevx95AqzxxcjgZp6sZxIzSQhsmZWa0xT2lfbf9RX1\n FtuKbUx98n6jxDIgG0Umnr3Vr1TZtY0drVFzUloNYsWJZlEXFy/qJnejjzuTIDuZkSW0aiWYyB4\n /KdTt99+2MSyHB68hK/+MxaWFNbHVLwX+J2DsKhrIr1lANCG+J70m4LMs+Dj/J2yMdXWRP0wpHI\n gahPly9I56fdg2fS8ifIhqPnDc8RtFpXL1pWsfkLzu9l2eN27OpyUE2QBECygU6SvPC1BG6ZpHP\n xpDUeELVlx1gdOaQOgqlZabmN2zZrPbb3BTk4au8XlWy4pnPc2Fc83qXlniTK6vruOe/hXE6Z2p\n Rwww==",
        "X-Received": [
            "by 2002:a05:6a00:3498:b0:82c:20be:57e6 with SMTP id\n d2e1a72fcca58-82f8c81273emr10048599b3a.11.1776603665938;\n Sun, 19 Apr 2026 06:01:05 -0700 (PDT)",
            "by 2002:a05:6a00:3498:b0:82c:20be:57e6 with SMTP id\n d2e1a72fcca58-82f8c81273emr10048525b3a.11.1776603665055;\n Sun, 19 Apr 2026 06:01:05 -0700 (PDT)"
        ],
        "To": "ltp@lists.linux.it",
        "Date": "Sun, 19 Apr 2026 16:00:53 +0300",
        "Message-ID": "<20260419130053.13996-1-mmenashe@redhat.com>",
        "X-Mailer": "git-send-email 2.53.0",
        "MIME-Version": "1.0",
        "X-Mimecast-Spam-Score": "0",
        "X-Mimecast-MFC-PROC-ID": "4KM7p9vTm0QdHP1aXW2gE7Z4LLS8Fj2_LVz7BiRbvSw_1776603667",
        "X-Mimecast-Originator": "redhat.com",
        "X-Spam-Status": "No, score=0.1 required=7.0 tests=DKIM_SIGNED,DKIM_VALID,\n DKIM_VALID_AU,DKIM_VALID_EF,SPF_HELO_PASS,SPF_PASS shortcircuit=no\n autolearn=disabled version=4.0.1",
        "X-Spam-Checker-Version": "SpamAssassin 4.0.1 (2024-03-25) on in-4.smtp.seeweb.it",
        "X-Virus-Scanned": "clamav-milter 1.0.9 at in-4.smtp.seeweb.it",
        "X-Virus-Status": "Clean",
        "Subject": "[LTP] [PATCH v3] futex: Add error coverage tests for wait,\n wake and cmp_requeue",
        "X-BeenThere": "ltp@lists.linux.it",
        "X-Mailman-Version": "2.1.29",
        "Precedence": "list",
        "List-Id": "Linux Test Project <ltp.lists.linux.it>",
        "List-Unsubscribe": "<https://lists.linux.it/options/ltp>,\n <mailto:ltp-request@lists.linux.it?subject=unsubscribe>",
        "List-Archive": "<http://lists.linux.it/pipermail/ltp/>",
        "List-Post": "<mailto:ltp@lists.linux.it>",
        "List-Help": "<mailto:ltp-request@lists.linux.it?subject=help>",
        "List-Subscribe": "<https://lists.linux.it/listinfo/ltp>,\n <mailto:ltp-request@lists.linux.it?subject=subscribe>",
        "From": "Michael Menasherov via ltp <ltp@lists.linux.it>",
        "Reply-To": "Michael Menasherov <mmenashe@redhat.com>",
        "Content-Type": "text/plain; charset=\"us-ascii\"",
        "Content-Transfer-Encoding": "7bit",
        "Errors-To": "ltp-bounces+incoming=patchwork.ozlabs.org@lists.linux.it",
        "Sender": "\"ltp\" <ltp-bounces+incoming=patchwork.ozlabs.org@lists.linux.it>"
    },
    "content": "Improve error handling coverage for futex syscalls by adding tests\nfor missing error conditions that were previously untested.\n\nfutex_wait06 verifies EFAULT is returned when uaddr or timeout\npoints to unmapped memory.\n\nfutex_wait07 verifies EINTR is returned when futex_wait() is\ninterrupted by a signal.\n\nfutex_wake05 verifies EFAULT is returned when uaddr points to\nunmapped or PROT_NONE memory.\n\nfutex_cmp_requeue03 verifies EFAULT is returned when uaddr or\nuaddr2 points to unmapped memory, and EACCES or EFAULT when uaddr\npoints to memory without read permission (PROT_NONE). The EACCES\nbehavior was introduced in kernel 5.9.\n\nSigned-off-by: Michael Menasherov <mmenashe@redhat.com>\n---\nv3:\n- Fix copyright year 2024 -> 2026\n- Use /*\\ comment format for test catalog\n- Use TST_EXP_FAIL instead of manual error checks\n- Add kernel version check for EACCES in futex_cmp_requeue03\n- Restructure testcases to use direct pointers instead of flag fields\n- Remove obvious comments in futex_wait07\n- Remove manual SAFE_WAITPID, let library collect child\n- Remove curly braces around single-line if bodies\n- Replace raw mmap() with SAFE_MMAP() in futex_wait06\n\n runtest/syscalls                              |  4 +\n testcases/kernel/syscalls/futex/.gitignore    |  4 +\n .../syscalls/futex/futex_cmp_requeue03.c      | 96 +++++++++++++++++++\n .../kernel/syscalls/futex/futex_wait06.c      | 73 ++++++++++++++\n .../kernel/syscalls/futex/futex_wait07.c      | 91 ++++++++++++++++++\n .../kernel/syscalls/futex/futex_wake05.c      | 86 +++++++++++++++++\n 6 files changed, 354 insertions(+)\n create mode 100644 testcases/kernel/syscalls/futex/futex_cmp_requeue03.c\n create mode 100644 testcases/kernel/syscalls/futex/futex_wait06.c\n create mode 100644 testcases/kernel/syscalls/futex/futex_wait07.c\n create mode 100644 testcases/kernel/syscalls/futex/futex_wake05.c",
    "diff": "diff --git a/runtest/syscalls b/runtest/syscalls\nindex 6ba0227a8..6c12dc225 100644\n--- a/runtest/syscalls\n+++ b/runtest/syscalls\n@@ -1859,11 +1859,14 @@ perf_event_open02 perf_event_open02\n \n futex_cmp_requeue01 futex_cmp_requeue01\n futex_cmp_requeue02 futex_cmp_requeue02\n+futex_cmp_requeue03 futex_cmp_requeue03\n futex_wait01 futex_wait01\n futex_wait02 futex_wait02\n futex_wait03 futex_wait03\n futex_wait04 futex_wait04\n futex_wait05 futex_wait05\n+futex_wait06 futex_wait06\n+futex_wait07 futex_wait07\n futex_waitv01 futex_waitv01\n futex_waitv02 futex_waitv02\n futex_waitv03 futex_waitv03\n@@ -1871,6 +1874,7 @@ futex_wake01 futex_wake01\n futex_wake02 futex_wake02\n futex_wake03 futex_wake03\n futex_wake04 futex_wake04\n+futex_wake05 futex_wake05\n futex_wait_bitset01 futex_wait_bitset01\n \n memfd_create01 memfd_create01\ndiff --git a/testcases/kernel/syscalls/futex/.gitignore b/testcases/kernel/syscalls/futex/.gitignore\nindex 9d08ba7d3..c47d39b5b 100644\n--- a/testcases/kernel/syscalls/futex/.gitignore\n+++ b/testcases/kernel/syscalls/futex/.gitignore\n@@ -1,15 +1,19 @@\n /futex_cmp_requeue01\n /futex_cmp_requeue02\n+/futex_cmp_requeue03\n /futex_wait01\n /futex_wait02\n /futex_wait03\n /futex_wait04\n /futex_wait05\n+/futex_wait06\n+/futex_wait07\n /futex_wait_bitset01\n /futex_wake01\n /futex_wake02\n /futex_wake03\n /futex_wake04\n+/futex_wake05\n /futex_waitv01\n /futex_waitv02\n /futex_waitv03\ndiff --git a/testcases/kernel/syscalls/futex/futex_cmp_requeue03.c b/testcases/kernel/syscalls/futex/futex_cmp_requeue03.c\nnew file mode 100644\nindex 000000000..099d5e35c\n--- /dev/null\n+++ b/testcases/kernel/syscalls/futex/futex_cmp_requeue03.c\n@@ -0,0 +1,96 @@\n+// SPDX-License-Identifier: GPL-2.0-or-later\n+/*\n+ * Copyright (C) 2026 Red Hat, Inc.\n+ */\n+\n+/*\\\n+ * Check that futex(FUTEX_CMP_REQUEUE) returns EFAULT when uaddr or\n+ * uaddr2 points to unmapped memory, and EACCES (or EFAULT on older kernels)\n+ * when uaddr points to memory without read permission (PROT_NONE).\n+ *\n+ * The EACCES behavior for PROT_NONE was introduced in kernel 5.9.\n+ */\n+\n+#include <errno.h>\n+#include <sys/mman.h>\n+\n+#include \"futextest.h\"\n+\n+static futex_t futex_var = FUTEX_INITIALIZER;\n+static futex_t *prot_none_addr;\n+\n+static struct futex_test_variants variants[] = {\n+#if (__NR_futex != __LTP__NR_INVALID_SYSCALL)\n+\t{ .fntype = FUTEX_FN_FUTEX, .desc = \"syscall with old kernel spec\"},\n+#endif\n+\n+#if (__NR_futex_time64 != __LTP__NR_INVALID_SYSCALL)\n+\t{ .fntype = FUTEX_FN_FUTEX64, .desc = \"syscall time64 with kernel spec\"},\n+#endif\n+};\n+\n+static struct testcase {\n+\tconst char *desc;\n+\tfutex_t *uaddr;\n+\tfutex_t *uaddr2;\n+\tint exp_errno;\n+} testcases[3];\n+\n+static void run(unsigned int n)\n+{\n+\tstruct futex_test_variants *tv = &variants[tst_variant];\n+\tstruct testcase *tc = &testcases[n];\n+\n+\tTST_EXP_FAIL(futex_cmp_requeue(tv->fntype, tc->uaddr, futex_var,\n+\t\ttc->uaddr2, 1, 1, 0), tc->exp_errno, \"%s\", tc->desc);\n+}\n+\n+static void setup(void)\n+{\n+\tstruct futex_test_variants *tv = &variants[tst_variant];\n+\tsize_t pagesize = getpagesize();\n+\tfutex_t *unmapped;\n+\n+\ttst_res(TINFO, \"Testing variant: %s\", tv->desc);\n+\tfutex_supported_by_kernel(tv->fntype);\n+\n+\tunmapped = SAFE_MMAP(NULL, pagesize, PROT_READ | PROT_WRITE,\n+\t\tMAP_PRIVATE | MAP_ANONYMOUS, -1, 0);\n+\tSAFE_MUNMAP(unmapped, pagesize);\n+\n+\tprot_none_addr = SAFE_MMAP(NULL, pagesize, PROT_NONE,\n+\t\tMAP_PRIVATE | MAP_ANONYMOUS, -1, 0);\n+\n+\ttestcases[0] = (struct testcase){\n+\t\t.desc = \"uaddr unmapped\",\n+\t\t.uaddr = unmapped,\n+\t\t.uaddr2 = &futex_var,\n+\t\t.exp_errno = EFAULT,\n+\t};\n+\ttestcases[1] = (struct testcase){\n+\t\t.desc = \"uaddr2 unmapped\",\n+\t\t.uaddr = &futex_var,\n+\t\t.uaddr2 = unmapped,\n+\t\t.exp_errno = EFAULT,\n+\t};\n+\ttestcases[2] = (struct testcase){\n+\t\t.desc = \"uaddr PROT_NONE\",\n+\t\t.uaddr = prot_none_addr,\n+\t\t.uaddr2 = &futex_var,\n+\t\t.exp_errno = tst_kvercmp(5, 9, 0) >= 0 ? EACCES : EFAULT,\n+\t};\n+}\n+\n+static void cleanup(void)\n+{\n+\tif (prot_none_addr)\n+\t\tSAFE_MUNMAP(prot_none_addr, getpagesize());\n+}\n+\n+static struct tst_test test = {\n+\t.setup = setup,\n+\t.cleanup = cleanup,\n+\t.test = run,\n+\t.tcnt = ARRAY_SIZE(testcases),\n+\t.test_variants = ARRAY_SIZE(variants),\n+};\ndiff --git a/testcases/kernel/syscalls/futex/futex_wait06.c b/testcases/kernel/syscalls/futex/futex_wait06.c\nnew file mode 100644\nindex 000000000..8bb563fb2\n--- /dev/null\n+++ b/testcases/kernel/syscalls/futex/futex_wait06.c\n@@ -0,0 +1,73 @@\n+// SPDX-License-Identifier: GPL-2.0-or-later\n+/*\n+ * Copyright (C) 2026 Red Hat, Inc.\n+ */\n+\n+/*\\\n+ * Check that futex(FUTEX_WAIT) returns EFAULT when:\n+ *\n+ * 1) uaddr points to unmapped memory\n+ * 2) timeout points to unmapped memory\n+ */\n+#include <errno.h>\n+#include <sys/mman.h>\n+\n+#include \"futextest.h\"\n+\n+static futex_t futex = FUTEX_INITIALIZER;\n+\n+static struct futex_test_variants variants[] = {\n+#if (__NR_futex != __LTP__NR_INVALID_SYSCALL)\n+\t{ .fntype = FUTEX_FN_FUTEX, .tstype = TST_KERN_OLD_TIMESPEC, .desc = \"syscall with old kernel spec\"},\n+#endif\n+\n+#if (__NR_futex_time64 != __LTP__NR_INVALID_SYSCALL)\n+\t{ .fntype = FUTEX_FN_FUTEX64, .tstype = TST_KERN_TIMESPEC, .desc = \"syscall time64 with kernel spec\"},\n+#endif\n+};\n+\n+static struct testcase {\n+\tconst char *desc;\n+\tfutex_t *uaddr;\n+\tvoid *timeout;\n+} testcases[2];\n+\n+static void run(unsigned int n)\n+{\n+\tstruct futex_test_variants *tv = &variants[tst_variant];\n+\tstruct testcase *tc = &testcases[n];\n+\n+\tTST_EXP_FAIL(futex_syscall(tv->fntype, tc->uaddr, FUTEX_WAIT, futex,\n+\t\ttc->timeout, NULL, 0, 0), EFAULT, \"%s\", tc->desc);\n+}\n+\n+static void setup(void)\n+{\n+\tstruct futex_test_variants *tv = &variants[tst_variant];\n+\tvoid *bad;\n+\n+\ttst_res(TINFO, \"Testing variant: %s\", tv->desc);\n+\tfutex_supported_by_kernel(tv->fntype);\n+\n+\tbad = SAFE_MMAP(NULL, getpagesize(), PROT_READ | PROT_WRITE,\n+\t\tMAP_PRIVATE | MAP_ANONYMOUS, -1, 0);\n+\tSAFE_MUNMAP(bad, getpagesize());\n+\n+\ttestcases[0] = (struct testcase){\n+\t\t.desc = \"uaddr points to unmapped memory\",\n+\t\t.uaddr = bad,\n+\t\t.timeout = NULL,\n+\t};\n+\ttestcases[1] = (struct testcase){\n+\t\t.desc = \"timeout points to unmapped memory\",\n+\t\t.uaddr = &futex,\n+\t\t.timeout = bad,\n+\t};\n+}\n+\n+static struct tst_test test = {\n+\t.setup = setup,\n+\t.test = run,\n+\t.tcnt = ARRAY_SIZE(testcases),\n+\t.test_variants = ARRAY_SIZE(variants),\n+};\ndiff --git a/testcases/kernel/syscalls/futex/futex_wait07.c b/testcases/kernel/syscalls/futex/futex_wait07.c\nnew file mode 100644\nindex 000000000..c3063389a\n--- /dev/null\n+++ b/testcases/kernel/syscalls/futex/futex_wait07.c\n@@ -0,0 +1,91 @@\n+// SPDX-License-Identifier: GPL-2.0-or-later\n+/*\n+ * Copyright (C) 2026 Red Hat, Inc.\n+ */\n+\n+/*\\\n+ * Check that futex(FUTEX_WAIT) returns EINTR when interrupted by a signal.\n+ * A child process blocks on futex_wait() with a long timeout. The parent\n+ * waits for the child to enter sleep state, then sends SIGUSR1 to it.\n+ * The child verifies it received EINTR and exits accordingly.\n+ */\n+\n+#include <errno.h>\n+#include <signal.h>\n+\n+#include \"futextest.h\"\n+\n+static futex_t *futex;\n+\n+static struct futex_test_variants variants[] = {\n+#if (__NR_futex != __LTP__NR_INVALID_SYSCALL)\n+\t{ .fntype = FUTEX_FN_FUTEX, .tstype = TST_KERN_OLD_TIMESPEC, .desc = \"syscall with old kernel spec\"},\n+#endif\n+\n+#if (__NR_futex_time64 != __LTP__NR_INVALID_SYSCALL)\n+\t{ .fntype = FUTEX_FN_FUTEX64, .tstype = TST_KERN_TIMESPEC, .desc = \"syscall time64 with kernel spec\"},\n+#endif\n+};\n+\n+/* We need a handler so SIGUSR1 is caught instead of killing the process.\n+ * The empty body is needed, just receiving the signal is enough to\n+ * interrupt futex_wait() and make it return into EINTR -1 status.\n+ */\n+static void sigusr1_handler(int sig LTP_ATTRIBUTE_UNUSED)\n+{\n+}\n+\n+static void do_child(void)\n+{\n+\tstruct futex_test_variants *tv = &variants[tst_variant];\n+\tstruct sigaction sa;\n+\tstruct tst_ts timeout;\n+\n+\tsa.sa_handler = sigusr1_handler;\n+\tsa.sa_flags = 0;\n+\tSAFE_SIGEMPTYSET(&sa.sa_mask);\n+\tSAFE_SIGACTION(SIGUSR1, &sa, NULL);\n+\n+\ttimeout = tst_ts_from_ms(tv->tstype, 5000);\n+\tTST_EXP_FAIL(futex_wait(tv->fntype, futex, *futex, &timeout, 0), EINTR);\n+\texit(0);\n+}\n+\n+static void run(void)\n+{\n+\tpid_t child;\n+\n+\tchild = SAFE_FORK();\n+\n+\tif (child == 0)\n+\t\tdo_child();\n+\n+\tTST_PROCESS_STATE_WAIT(child, 'S', 0);\n+\tSAFE_KILL(child, SIGUSR1);\n+}\n+\n+static void setup(void)\n+{\n+\tstruct futex_test_variants *tv = &variants[tst_variant];\n+\n+\ttst_res(TINFO, \"Testing variant: %s\", tv->desc);\n+\tfutex_supported_by_kernel(tv->fntype);\n+\n+\tfutex = SAFE_MMAP(NULL, sizeof(*futex), PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_SHARED, -1, 0);\n+\t*futex = FUTEX_INITIALIZER;\n+}\n+\n+static void cleanup(void)\n+{\n+\tif (futex) {\n+\t\tSAFE_MUNMAP((void *)futex, sizeof(*futex));\n+\t}\n+}\n+\n+static struct tst_test test = {\n+\t.setup = setup,\n+\t.cleanup = cleanup,\n+\t.test_all = run,\n+\t.test_variants = ARRAY_SIZE(variants),\n+\t.forks_child = 1,\n+};\ndiff --git a/testcases/kernel/syscalls/futex/futex_wake05.c b/testcases/kernel/syscalls/futex/futex_wake05.c\nnew file mode 100644\nindex 000000000..1e9bd6435\n--- /dev/null\n+++ b/testcases/kernel/syscalls/futex/futex_wake05.c\n@@ -0,0 +1,86 @@\n+// SPDX-License-Identifier: GPL-2.0-or-later\n+/*\n+ * Copyright (C) 2026 Red Hat, Inc.\n+ */\n+\n+/*\\\n+ * Check that futex(FUTEX_WAKE) returns EFAULT when uaddr points to\n+ * unmapped or PROT_NONE memory.\n+ *\n+ * Note: FUTEX_WAKE never reads *uaddr, so PROT_NONE triggers EFAULT\n+ * (not EACCES). The EACCES behavior only applies to syscalls that read\n+ * *uaddr (e.g. FUTEX_WAIT, FUTEX_CMP_REQUEUE).\n+ */\n+\n+#include <errno.h>\n+#include <sys/mman.h>\n+#include \"futextest.h\"\n+\n+static futex_t *prot_none_addr;\n+\n+static struct futex_test_variants variants[] = {\n+#if (__NR_futex != __LTP__NR_INVALID_SYSCALL)\n+\t{ .fntype = FUTEX_FN_FUTEX, .desc = \"syscall with old kernel spec\"},\n+#endif\n+\n+#if (__NR_futex_time64 != __LTP__NR_INVALID_SYSCALL)\n+\t{ .fntype = FUTEX_FN_FUTEX64, .desc = \"syscall time64 with kernel spec\"},\n+#endif\n+};\n+\n+static struct testcase {\n+\tconst char *desc;\n+\tfutex_t *addr;\n+\tint exp_errno;\n+} testcases[2];\n+\n+static void run(unsigned int n)\n+{\n+\tstruct futex_test_variants *tv = &variants[tst_variant];\n+\tstruct testcase *tc = &testcases[n];\n+\n+\tTST_EXP_FAIL(futex_wake(tv->fntype, tc->addr, 1, 0),\n+\t\ttc->exp_errno, \"%s\", tc->desc);\n+}\n+\n+static void setup(void)\n+{\n+\tstruct futex_test_variants *tv = &variants[tst_variant];\n+\tsize_t pagesize = getpagesize();\n+\tfutex_t *unmapped;\n+\n+\ttst_res(TINFO, \"Testing variant: %s\", tv->desc);\n+\tfutex_supported_by_kernel(tv->fntype);\n+\n+\tunmapped = SAFE_MMAP(NULL, pagesize, PROT_READ | PROT_WRITE,\n+\t\tMAP_PRIVATE | MAP_ANONYMOUS, -1, 0);\n+\tSAFE_MUNMAP(unmapped, pagesize);\n+\n+\tprot_none_addr = SAFE_MMAP(NULL, pagesize, PROT_NONE,\n+\t\tMAP_PRIVATE | MAP_ANONYMOUS, -1, 0);\n+\n+\ttestcases[0] = (struct testcase){\n+\t\t.desc = \"uaddr unmapped\",\n+\t\t.addr = unmapped,\n+\t\t.exp_errno = EFAULT,\n+\t};\n+\ttestcases[1] = (struct testcase){\n+\t\t.desc = \"uaddr PROT_NONE\",\n+\t\t.addr = prot_none_addr,\n+\t\t.exp_errno = EFAULT,\n+\t};\n+}\n+\n+static void cleanup(void)\n+{\n+\tif (prot_none_addr)\n+\t\tSAFE_MUNMAP(prot_none_addr, getpagesize());\n+}\n+\n+static struct tst_test test = {\n+\t.setup = setup,\n+\t.cleanup = cleanup,\n+\t.test = run,\n+\t.tcnt = ARRAY_SIZE(testcases),\n+\t.test_variants = ARRAY_SIZE(variants),\n+};\n",
    "prefixes": [
        "v3"
    ]
}