get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 2216763,
    "url": "http://patchwork.ozlabs.org/api/patches/2216763/?format=api",
    "web_url": "http://patchwork.ozlabs.org/project/sparclinux/patch/20260327061704.3707577-29-hch@lst.de/",
    "project": {
        "id": 10,
        "url": "http://patchwork.ozlabs.org/api/projects/10/?format=api",
        "name": "Linux SPARC Development ",
        "link_name": "sparclinux",
        "list_id": "sparclinux.vger.kernel.org",
        "list_email": "sparclinux@vger.kernel.org",
        "web_url": null,
        "scm_url": null,
        "webscm_url": null,
        "list_archive_url": "",
        "list_archive_url_format": "",
        "commit_url_format": ""
    },
    "msgid": "<20260327061704.3707577-29-hch@lst.de>",
    "list_archive_url": null,
    "date": "2026-03-27T06:17:00",
    "name": "[28/28] xor: add a kunit test case",
    "commit_ref": null,
    "pull_url": null,
    "state": "new",
    "archived": false,
    "hash": "881602d03d0e2149e459ba88bb046916e5155183",
    "submitter": {
        "id": 82,
        "url": "http://patchwork.ozlabs.org/api/people/82/?format=api",
        "name": "Christoph Hellwig",
        "email": "hch@lst.de"
    },
    "delegate": null,
    "mbox": "http://patchwork.ozlabs.org/project/sparclinux/patch/20260327061704.3707577-29-hch@lst.de/mbox/",
    "series": [
        {
            "id": 497694,
            "url": "http://patchwork.ozlabs.org/api/series/497694/?format=api",
            "web_url": "http://patchwork.ozlabs.org/project/sparclinux/list/?series=497694",
            "date": "2026-03-27T06:16:33",
            "name": "[01/28] xor: assert that xor_blocks is not call from interrupt context",
            "version": 1,
            "mbox": "http://patchwork.ozlabs.org/series/497694/mbox/"
        }
    ],
    "comments": "http://patchwork.ozlabs.org/api/patches/2216763/comments/",
    "check": "pending",
    "checks": "http://patchwork.ozlabs.org/api/patches/2216763/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "\n <SRS0=7VK5=B3=vger.kernel.org=sparclinux+bounces-6603-patchwork-incoming=ozlabs.org@ozlabs.org>",
        "X-Original-To": [
            "incoming@patchwork.ozlabs.org",
            "sparclinux@vger.kernel.org"
        ],
        "Delivered-To": [
            "patchwork-incoming@legolas.ozlabs.org",
            "patchwork-incoming@ozlabs.org"
        ],
        "Authentication-Results": [
            "legolas.ozlabs.org;\n\tdkim=pass (2048-bit key;\n secure) header.d=infradead.org header.i=@infradead.org header.a=rsa-sha256\n header.s=bombadil.20210309 header.b=subvU1oA;\n\tdkim-atps=neutral",
            "legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=ozlabs.org\n (client-ip=150.107.74.76; helo=mail.ozlabs.org;\n envelope-from=srs0=7vk5=b3=vger.kernel.org=sparclinux+bounces-6603-patchwork-incoming=ozlabs.org@ozlabs.org;\n receiver=patchwork.ozlabs.org)",
            "gandalf.ozlabs.org;\n arc=pass smtp.remote-ip=104.64.211.4 arc.chain=subspace.kernel.org",
            "gandalf.ozlabs.org;\n dmarc=fail (p=none dis=none) header.from=lst.de",
            "gandalf.ozlabs.org;\n\tdkim=pass (2048-bit key;\n secure) header.d=infradead.org header.i=@infradead.org header.a=rsa-sha256\n header.s=bombadil.20210309 header.b=subvU1oA;\n\tdkim-atps=neutral",
            "gandalf.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=vger.kernel.org\n (client-ip=104.64.211.4; helo=sin.lore.kernel.org;\n envelope-from=sparclinux+bounces-6603-patchwork-incoming=ozlabs.org@vger.kernel.org;\n receiver=ozlabs.org)",
            "smtp.subspace.kernel.org;\n\tdkim=pass (2048-bit key) header.d=infradead.org header.i=@infradead.org\n header.b=\"subvU1oA\"",
            "smtp.subspace.kernel.org;\n arc=none smtp.client-ip=198.137.202.133",
            "smtp.subspace.kernel.org;\n dmarc=fail (p=none dis=none) header.from=lst.de",
            "smtp.subspace.kernel.org;\n spf=none smtp.mailfrom=bombadil.srs.infradead.org"
        ],
        "Received": [
            "from mail.ozlabs.org (gandalf.ozlabs.org [150.107.74.76])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4fhrRQ3QsWz1y1j\n\tfor <incoming@patchwork.ozlabs.org>; Fri, 27 Mar 2026 17:32:34 +1100 (AEDT)",
            "from mail.ozlabs.org (mail.ozlabs.org [IPv6:2404:9400:2221:ea00::3])\n\tby gandalf.ozlabs.org (Postfix) with ESMTP id 4fhrRQ2v78z4wHX\n\tfor <incoming@patchwork.ozlabs.org>; Fri, 27 Mar 2026 17:32:34 +1100 (AEDT)",
            "by gandalf.ozlabs.org (Postfix)\n\tid 4fhrRQ2njWz4wSc; Fri, 27 Mar 2026 17:32:34 +1100 (AEDT)",
            "from sin.lore.kernel.org (sin.lore.kernel.org [104.64.211.4])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519)\n\t(No client certificate requested)\n\tby gandalf.ozlabs.org (Postfix) with ESMTPS id 4fhrRL5ydnz4wHX\n\tfor <patchwork-incoming@ozlabs.org>; Fri, 27 Mar 2026 17:32:30 +1100 (AEDT)",
            "from smtp.subspace.kernel.org (conduit.subspace.kernel.org\n [100.90.174.1])\n\tby sin.lore.kernel.org (Postfix) with ESMTP id C30593031BD6\n\tfor <patchwork-incoming@ozlabs.org>; Fri, 27 Mar 2026 06:30:13 +0000 (UTC)",
            "from localhost.localdomain (localhost.localdomain [127.0.0.1])\n\tby smtp.subspace.kernel.org (Postfix) with ESMTP id 7448D3ACF0F;\n\tFri, 27 Mar 2026 06:24:01 +0000 (UTC)",
            "from bombadil.infradead.org (bombadil.infradead.org\n [198.137.202.133])\n\t(using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))\n\t(No client certificate requested)\n\tby smtp.subspace.kernel.org (Postfix) with ESMTPS id 890DF3939DF;\n\tFri, 27 Mar 2026 06:23:57 +0000 (UTC)",
            "from\n 2a02-8389-2341-5b80-d601-7564-c2e0-491c.cable.dynamic.v6.surfer.at\n ([2a02:8389:2341:5b80:d601:7564:c2e0:491c] helo=localhost)\n\tby bombadil.infradead.org with esmtpsa (Exim 4.98.2 #2 (Red Hat Linux))\n\tid 1w60be-00000006oNA-00Me;\n\tFri, 27 Mar 2026 06:23:42 +0000"
        ],
        "ARC-Seal": [
            "i=2; a=rsa-sha256; d=ozlabs.org; s=201707; t=1774593154; cv=pass;\n\tb=drn3waYLuORShR5vcaoDUvCGl9CXLzqjZNwAOAx7NQ2WS0e6GUF4MkS0RsylOOlo54xV+7raGXAVe413USScxbH7TNyl8DhizOdmLBBHR7+ThNH4yVoGCTitdR6aczKg3hiM8iRa9aHC68WrQNyWk2grCZFkqAPOfWNHkcXyMjv2HuJOVEtjP5iNWHcj0n8eL6vWuFj72uwo4XYminTSEIYGET2qJ9vBNnIEMnCOpC+lTmqyzrNBErhEe5RRTwHUSzPsRfveHD1yMYgu9K5dgMX+uCHj2cTUBtFNRHlI+CsbUVxr59GONzZ588Jyufj/IegW4Ppy5zDpIDRJRZWBpg==",
            "i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116;\n\tt=1774592641; cv=none;\n b=QGz9P0Bu0KLQSyDqZYf4jmtXdoHdVRAK/U3x3jV/dQOHq0Wc2JTN9xkmZNxV4i9H0p0w76mRH8HLp9RYTLUiq2yGtpT5/TjJrXv0Y4OS4zfbujceYSQA7DZ1tCFqnK0D3WV2dFKj4XwC4U+qRpMq8icQ7tn0WrdQQBhoK7pETNg="
        ],
        "ARC-Message-Signature": [
            "i=2; a=rsa-sha256; d=ozlabs.org; s=201707;\n\tt=1774593154; c=relaxed/relaxed;\n\tbh=727UXKpWLOoe2MWCMlJJ1Y9K6MPqx6tdVHk3IrKvJoI=;\n\th=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References:\n\t MIME-Version;\n b=orqOjOvEg4TiqHaIK+tqe6Zz4bbf61P9GLsGCXPTLUK7R4j7aNRHVIcAc7iUeQJpG9aGZ1M9LD8wNiAVdSGp7lfffNkRqGZLpnnQokL5u0wU/v1Ar5u6j3hChNDMoip7CfsBsDBL2SBfQDBDOl9BrNa16kmKK5NWT1qbQ7i1UL2QvQJH8fMw5TTjD4Z04NFpvV9dfkH2Gi5kSHLELKaCsQoqP0ygeClhUEVWNpImvRfMItV3bAVAdq6danPImHF/fBWCtHhPf/IHYnA4JP3U54vjFo+VrTnZAmuxi+3GqpqgSNNBERTN5VSAgMfw9PneTJUL9QZX7Dt6xV59scHJBA==",
            "i=1; a=rsa-sha256; d=subspace.kernel.org;\n\ts=arc-20240116; t=1774592641; c=relaxed/simple;\n\tbh=V8RZsZAv0eVV5PmML9nsMZ6vFjo2O1yHDa1QC84Q2TM=;\n\th=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References:\n\t MIME-Version;\n b=R7ZdUxc0UjOzKb5Omz7t1JZQXPeLd1YUrurOKQl0mUXzSS96MvUldbqkWEU5ew90AswowwikWIqKp0T3yor7pd32W1WqLFiUGH09AIXi9dwOGWicBVhfk9/MnY0Pk9FFBJypSnJSBuxCZqFH0NAuKtVQHQQ1K5A6pseNr/d7J68="
        ],
        "ARC-Authentication-Results": [
            "i=2; gandalf.ozlabs.org;\n dmarc=fail (p=none dis=none) header.from=lst.de; dkim=pass (2048-bit key;\n secure) header.d=infradead.org header.i=@infradead.org header.a=rsa-sha256\n header.s=bombadil.20210309 header.b=subvU1oA; dkim-atps=neutral;\n spf=pass (client-ip=104.64.211.4; helo=sin.lore.kernel.org;\n envelope-from=sparclinux+bounces-6603-patchwork-incoming=ozlabs.org@vger.kernel.org;\n receiver=ozlabs.org) smtp.mailfrom=vger.kernel.org",
            "i=1; smtp.subspace.kernel.org;\n dmarc=fail (p=none dis=none) header.from=lst.de;\n spf=none smtp.mailfrom=bombadil.srs.infradead.org;\n dkim=pass (2048-bit key) header.d=infradead.org header.i=@infradead.org\n header.b=subvU1oA; arc=none smtp.client-ip=198.137.202.133"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed;\n\td=infradead.org; s=bombadil.20210309; h=Content-Transfer-Encoding:\n\tMIME-Version:References:In-Reply-To:Message-ID:Date:Subject:Cc:To:From:Sender\n\t:Reply-To:Content-Type:Content-ID:Content-Description;\n\tbh=727UXKpWLOoe2MWCMlJJ1Y9K6MPqx6tdVHk3IrKvJoI=; b=subvU1oAzGN3wGu3kU5LyOK/Ut\n\tGMjN+pi2hIC4W/Z/itjQvZXtu3s/Y6dvCaVhK+2oAtJwjuAM6lABQTJMGIJ5B1jFnI1i6OyuXOEfJ\n\thav3q3O9y5nOHm3BT+fTtg3FmEPfkcDjP8mrTcYR9Kviwi5M1aieJuLU+00n2eDDzyUDdkl0FAztD\n\tCHl5ZfNRoVCV7JT5AajK3/K6ebmfeKHuAKWZ3Bb90w7zew+/H51ZHe/WcaJF2++5loyW9BZqcPCIw\n\tLBOpwhe1MvMKRdG+MzUwSYk5KyV1qJtoFDY/ROuKBQBkt0LtTPIxDbPxfwqqKkIefIHyeuRDNQfup\n\tZbZkyWiQ==;",
        "From": "Christoph Hellwig <hch@lst.de>",
        "To": "Andrew Morton <akpm@linux-foundation.org>",
        "Cc": "Richard Henderson <richard.henderson@linaro.org>,\n\tMatt Turner <mattst88@gmail.com>,\n\tMagnus Lindholm <linmag7@gmail.com>,\n\tRussell King <linux@armlinux.org.uk>,\n\tCatalin Marinas <catalin.marinas@arm.com>,\n\tWill Deacon <will@kernel.org>,\n\tArd Biesheuvel <ardb@kernel.org>,\n\tHuacai Chen <chenhuacai@kernel.org>,\n\tWANG Xuerui <kernel@xen0n.name>,\n\tMadhavan Srinivasan <maddy@linux.ibm.com>,\n\tMichael Ellerman <mpe@ellerman.id.au>,\n\tNicholas Piggin <npiggin@gmail.com>,\n\t\"Christophe Leroy (CS GROUP)\" <chleroy@kernel.org>,\n\tPaul Walmsley <pjw@kernel.org>,\n\tPalmer Dabbelt <palmer@dabbelt.com>,\n\tAlbert Ou <aou@eecs.berkeley.edu>,\n\tAlexandre Ghiti <alex@ghiti.fr>,\n\tHeiko Carstens <hca@linux.ibm.com>,\n\tVasily Gorbik <gor@linux.ibm.com>,\n\tAlexander Gordeev <agordeev@linux.ibm.com>,\n\tChristian Borntraeger <borntraeger@linux.ibm.com>,\n\tSven Schnelle <svens@linux.ibm.com>,\n\t\"David S. Miller\" <davem@davemloft.net>,\n\tAndreas Larsson <andreas@gaisler.com>,\n\tRichard Weinberger <richard@nod.at>,\n\tAnton Ivanov <anton.ivanov@cambridgegreys.com>,\n\tJohannes Berg <johannes@sipsolutions.net>,\n\tThomas Gleixner <tglx@kernel.org>,\n\tIngo Molnar <mingo@redhat.com>,\n\tBorislav Petkov <bp@alien8.de>,\n\tDave Hansen <dave.hansen@linux.intel.com>,\n\tx86@kernel.org,\n\t\"H. Peter Anvin\" <hpa@zytor.com>,\n\tHerbert Xu <herbert@gondor.apana.org.au>,\n\tDan Williams <dan.j.williams@intel.com>,\n\tChris Mason <clm@fb.com>,\n\tDavid Sterba <dsterba@suse.com>,\n\tArnd Bergmann <arnd@arndb.de>,\n\tSong Liu <song@kernel.org>,\n\tYu Kuai <yukuai@fnnas.com>,\n\tLi Nan <linan122@huawei.com>,\n\t\"Theodore Ts'o\" <tytso@mit.edu>,\n\t\"Jason A. Donenfeld\" <Jason@zx2c4.com>,\n\tlinux-alpha@vger.kernel.org,\n\tlinux-kernel@vger.kernel.org,\n\tlinux-arm-kernel@lists.infradead.org,\n\tloongarch@lists.linux.dev,\n\tlinuxppc-dev@lists.ozlabs.org,\n\tlinux-riscv@lists.infradead.org,\n\tlinux-s390@vger.kernel.org,\n\tsparclinux@vger.kernel.org,\n\tlinux-um@lists.infradead.org,\n\tlinux-crypto@vger.kernel.org,\n\tlinux-btrfs@vger.kernel.org,\n\tlinux-arch@vger.kernel.org,\n\tlinux-raid@vger.kernel.org",
        "Subject": "[PATCH 28/28] xor: add a kunit test case",
        "Date": "Fri, 27 Mar 2026 07:17:00 +0100",
        "Message-ID": "<20260327061704.3707577-29-hch@lst.de>",
        "X-Mailer": "git-send-email 2.47.3",
        "In-Reply-To": "<20260327061704.3707577-1-hch@lst.de>",
        "References": "<20260327061704.3707577-1-hch@lst.de>",
        "Precedence": "bulk",
        "X-Mailing-List": "sparclinux@vger.kernel.org",
        "List-Id": "<sparclinux.vger.kernel.org>",
        "List-Subscribe": "<mailto:sparclinux+subscribe@vger.kernel.org>",
        "List-Unsubscribe": "<mailto:sparclinux+unsubscribe@vger.kernel.org>",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "X-SRS-Rewrite": "SMTP reverse-path rewritten from <hch@infradead.org> by\n bombadil.infradead.org. See http://www.infradead.org/rpr.html",
        "X-Spam-Status": "No, score=-0.2 required=5.0 tests=ARC_SIGNED,ARC_VALID,\n\tDKIM_SIGNED,DKIM_VALID,DMARC_NONE,HEADER_FROM_DIFFERENT_DOMAINS,\n\tMAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS autolearn=disabled\n\tversion=4.0.1",
        "X-Spam-Checker-Version": "SpamAssassin 4.0.1 (2024-03-25) on gandalf.ozlabs.org"
    },
    "content": "Add a test case for the XOR routines loosely based on the CRC kunit\ntest.\n\nSigned-off-by: Christoph Hellwig <hch@lst.de>\n---\n lib/raid/.kunitconfig          |   3 +\n lib/raid/Kconfig               |  11 ++\n lib/raid/xor/Makefile          |   2 +-\n lib/raid/xor/tests/Makefile    |   3 +\n lib/raid/xor/tests/xor_kunit.c | 187 +++++++++++++++++++++++++++++++++\n 5 files changed, 205 insertions(+), 1 deletion(-)\n create mode 100644 lib/raid/.kunitconfig\n create mode 100644 lib/raid/xor/tests/Makefile\n create mode 100644 lib/raid/xor/tests/xor_kunit.c",
    "diff": "diff --git a/lib/raid/.kunitconfig b/lib/raid/.kunitconfig\nnew file mode 100644\nindex 000000000000..351d22ed1954\n--- /dev/null\n+++ b/lib/raid/.kunitconfig\n@@ -0,0 +1,3 @@\n+CONFIG_KUNIT=y\n+CONFIG_BTRFS_FS=y\n+CONFIG_XOR_KUNIT_TEST=y\ndiff --git a/lib/raid/Kconfig b/lib/raid/Kconfig\nindex 81cb3f9c0a7b..5ab2b0a7be4c 100644\n--- a/lib/raid/Kconfig\n+++ b/lib/raid/Kconfig\n@@ -17,3 +17,14 @@ config XOR_BLOCKS_ARCH\n \tdefault y if X86_32\n \tdefault y if X86_64\n \tbool\n+\n+config XOR_KUNIT_TEST\n+\ttristate \"KUnit tests for xor_gen\" if !KUNIT_ALL_TESTS\n+\tdepends on KUNIT\n+\tdepends on XOR_BLOCKS\n+\tdefault KUNIT_ALL_TESTS\n+\thelp\n+\t  Unit tests for the XOR library functions.\n+\n+\t  This is intended to help people writing architecture-specific\n+\t  optimized versions.  If unsure, say N.\ndiff --git a/lib/raid/xor/Makefile b/lib/raid/xor/Makefile\nindex df55823c4d82..4d633dfd5b90 100644\n--- a/lib/raid/xor/Makefile\n+++ b/lib/raid/xor/Makefile\n@@ -29,7 +29,7 @@ xor-$(CONFIG_SPARC64)\t\t+= sparc/xor-sparc64.o sparc/xor-sparc64-glue.o\n xor-$(CONFIG_S390)\t\t+= s390/xor.o\n xor-$(CONFIG_X86_32)\t\t+= x86/xor-avx.o x86/xor-sse.o x86/xor-mmx.o\n xor-$(CONFIG_X86_64)\t\t+= x86/xor-avx.o x86/xor-sse.o\n-\n+obj-y\t\t\t\t+= tests/\n \n CFLAGS_arm/xor-neon.o\t\t+= $(CC_FLAGS_FPU)\n CFLAGS_REMOVE_arm/xor-neon.o\t+= $(CC_FLAGS_NO_FPU)\ndiff --git a/lib/raid/xor/tests/Makefile b/lib/raid/xor/tests/Makefile\nnew file mode 100644\nindex 000000000000..661e8f6ffd1f\n--- /dev/null\n+++ b/lib/raid/xor/tests/Makefile\n@@ -0,0 +1,3 @@\n+# SPDX-License-Identifier: GPL-2.0-only\n+\n+obj-$(CONFIG_XOR_KUNIT_TEST) += xor_kunit.o\ndiff --git a/lib/raid/xor/tests/xor_kunit.c b/lib/raid/xor/tests/xor_kunit.c\nnew file mode 100644\nindex 000000000000..0c2a3a420bf9\n--- /dev/null\n+++ b/lib/raid/xor/tests/xor_kunit.c\n@@ -0,0 +1,187 @@\n+// SPDX-License-Identifier: GPL-2.0-or-later\n+/*\n+ * Unit test the XOR library functions.\n+ *\n+ * Copyright 2024 Google LLC\n+ * Copyright 2026 Christoph Hellwig\n+ *\n+ * Based on the CRC tests by Eric Biggers <ebiggers@google.com>.\n+ */\n+#include <kunit/test.h>\n+#include <linux/prandom.h>\n+#include <linux/string_choices.h>\n+#include <linux/vmalloc.h>\n+#include <linux/raid/xor.h>\n+\n+#define XOR_KUNIT_SEED\t\t\t42\n+#define XOR_KUNIT_MAX_BYTES\t\t16384\n+#define XOR_KUNIT_MAX_BUFFERS\t\t64\n+#define XOR_KUNIT_NUM_TEST_ITERS\t1000\n+\n+static struct rnd_state rng;\n+static void *test_buffers[XOR_KUNIT_MAX_BUFFERS];\n+static void *test_dest;\n+static void *test_ref;\n+static size_t test_buflen;\n+\n+static u32 rand32(void)\n+{\n+\treturn prandom_u32_state(&rng);\n+}\n+\n+/* Reference implementation using dumb byte-wise XOR */\n+static void xor_ref(void *dest, void **srcs, unsigned int src_cnt,\n+\t\tunsigned int bytes)\n+{\n+\tunsigned int off, idx;\n+\tu8 *d = dest;\n+\n+\tfor (off = 0; off < bytes; off++) {\n+\t\tfor (idx = 0; idx < src_cnt; idx++) {\n+\t\t\tu8 *src = srcs[idx];\n+\n+\t\t\td[off] ^= src[off];\n+\t\t}\n+\t}\n+}\n+\n+/* Generate a random length that is a multiple of 512. */\n+static unsigned int random_length(unsigned int max_length)\n+{\n+\treturn round_up((rand32() % max_length) + 1, 512);\n+}\n+\n+/* Generate a random alignment that is a multiple of 64. */\n+static unsigned int random_alignment(unsigned int max_alignment)\n+{\n+\treturn ((rand32() % max_alignment) + 1) & ~63;\n+}\n+\n+static void xor_generate_random_data(void)\n+{\n+\tint i;\n+\n+\tprandom_bytes_state(&rng, test_dest, test_buflen);\n+\tmemcpy(test_ref, test_dest, test_buflen);\n+\tfor (i = 0; i < XOR_KUNIT_MAX_BUFFERS; i++)\n+\t\tprandom_bytes_state(&rng, test_buffers[i], test_buflen);\n+}\n+\n+/* Test that xor_gen gives the same result as a reference implementation. */\n+static void xor_test(struct kunit *test)\n+{\n+\tvoid *aligned_buffers[XOR_KUNIT_MAX_BUFFERS];\n+\tsize_t i;\n+\n+\tfor (i = 0; i < XOR_KUNIT_NUM_TEST_ITERS; i++) {\n+\t\tunsigned int nr_buffers =\n+\t\t\t(rand32() % XOR_KUNIT_MAX_BUFFERS) + 1;\n+\t\tunsigned int len = random_length(XOR_KUNIT_MAX_BYTES);\n+\t\tunsigned int max_alignment, align = 0;\n+\t\tvoid *buffers;\n+\n+\t\tif (rand32() % 8 == 0)\n+\t\t\t/* Refresh the data occasionally. */\n+\t\t\txor_generate_random_data();\n+\n+\t\t/*\n+\t\t * If we're not using the entire buffer size, inject randomize\n+\t\t * alignment into the buffer.\n+\t\t */\n+\t\tmax_alignment = XOR_KUNIT_MAX_BYTES - len;\n+\t\tif (max_alignment == 0) {\n+\t\t\tbuffers = test_buffers;\n+\t\t} else if (rand32() % 2 == 0) {\n+\t\t\t/* Use random alignments mod 64 */\n+\t\t\tint j;\n+\n+\t\t\tfor (j = 0; j < nr_buffers; j++)\n+\t\t\t\taligned_buffers[j] = test_buffers[j] +\n+\t\t\t\t\trandom_alignment(max_alignment);\n+\t\t\tbuffers = aligned_buffers;\n+\t\t\talign = random_alignment(max_alignment);\n+\t\t} else {\n+\t\t\t/* Go up to the guard page, to catch buffer overreads */\n+\t\t\tint j;\n+\n+\t\t\talign = test_buflen - len;\n+\t\t\tfor (j = 0; j < nr_buffers; j++)\n+\t\t\t\taligned_buffers[j] = test_buffers[j] + align;\n+\t\t\tbuffers = aligned_buffers;\n+\t\t}\n+\n+\t\t/*\n+\t\t * Compute the XOR, and verify that it equals the XOR computed\n+\t\t * by a simple byte-at-a-time reference implementation.\n+\t\t */\n+\t\txor_ref(test_ref + align, buffers, nr_buffers, len);\n+\t\txor_gen(test_dest + align, buffers, nr_buffers, len);\n+\t\tKUNIT_EXPECT_MEMEQ_MSG(test, test_ref + align,\n+\t\t\t\ttest_dest + align, len,\n+\t\t\t\t\"Wrong result with buffers=%u, len=%u, unaligned=%s, at_end=%s\",\n+\t\t\t\tnr_buffers, len,\n+\t\t\t\tstr_yes_no(max_alignment),\n+\t\t\t\tstr_yes_no(align + len == test_buflen));\n+\t}\n+}\n+\n+static struct kunit_case xor_test_cases[] = {\n+\tKUNIT_CASE(xor_test),\n+\t{},\n+};\n+\n+static int xor_suite_init(struct kunit_suite *suite)\n+{\n+\tint i;\n+\n+\t/*\n+\t * Allocate the test buffer using vmalloc() with a page-aligned length\n+\t * so that it is immediately followed by a guard page.  This allows\n+\t * buffer overreads to be detected, even in assembly code.\n+\t */\n+\ttest_buflen = round_up(XOR_KUNIT_MAX_BYTES, PAGE_SIZE);\n+\ttest_ref = vmalloc(test_buflen);\n+\tif (!test_ref)\n+\t\treturn -ENOMEM;\n+\ttest_dest = vmalloc(test_buflen);\n+\tif (!test_dest)\n+\t\tgoto out_free_ref;\n+\tfor (i = 0; i < XOR_KUNIT_MAX_BUFFERS; i++) {\n+\t\ttest_buffers[i] = vmalloc(test_buflen);\n+\t\tif (!test_buffers[i])\n+\t\t\tgoto out_free_buffers;\n+\t}\n+\n+\tprandom_seed_state(&rng, XOR_KUNIT_SEED);\n+\txor_generate_random_data();\n+\treturn 0;\n+\n+out_free_buffers:\n+\twhile (--i >= 0)\n+\t\tvfree(test_buffers[i]);\n+\tvfree(test_dest);\n+out_free_ref:\n+\tvfree(test_ref);\n+\treturn -ENOMEM;\n+}\n+\n+static void xor_suite_exit(struct kunit_suite *suite)\n+{\n+\tint i;\n+\n+\tvfree(test_ref);\n+\tvfree(test_dest);\n+\tfor (i = 0; i < XOR_KUNIT_MAX_BUFFERS; i++)\n+\t\tvfree(test_buffers[i]);\n+}\n+\n+static struct kunit_suite xor_test_suite = {\n+\t.name\t\t= \"xor\",\n+\t.test_cases\t= xor_test_cases,\n+\t.suite_init\t= xor_suite_init,\n+\t.suite_exit\t= xor_suite_exit,\n+};\n+kunit_test_suite(xor_test_suite);\n+\n+MODULE_DESCRIPTION(\"Unit test for the XOR library functions\");\n+MODULE_LICENSE(\"GPL\");\n",
    "prefixes": [
        "28/28"
    ]
}