Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/2216749/?format=api
{ "id": 2216749, "url": "http://patchwork.ozlabs.org/api/patches/2216749/?format=api", "web_url": "http://patchwork.ozlabs.org/project/linuxppc-dev/patch/20260327061704.3707577-29-hch@lst.de/", "project": { "id": 2, "url": "http://patchwork.ozlabs.org/api/projects/2/?format=api", "name": "Linux PPC development", "link_name": "linuxppc-dev", "list_id": "linuxppc-dev.lists.ozlabs.org", "list_email": "linuxppc-dev@lists.ozlabs.org", "web_url": "https://github.com/linuxppc/wiki/wiki", "scm_url": "https://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux.git", "webscm_url": "https://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux.git/", "list_archive_url": "https://lore.kernel.org/linuxppc-dev/", "list_archive_url_format": "https://lore.kernel.org/linuxppc-dev/{}/", "commit_url_format": "https://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux.git/commit/?id={}" }, "msgid": "<20260327061704.3707577-29-hch@lst.de>", "list_archive_url": "https://lore.kernel.org/linuxppc-dev/20260327061704.3707577-29-hch@lst.de/", "date": "2026-03-27T06:17:00", "name": "[28/28] xor: add a kunit test case", "commit_ref": null, "pull_url": null, "state": "handled-elsewhere", "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/linuxppc-dev/patch/20260327061704.3707577-29-hch@lst.de/mbox/", "series": [ { "id": 497693, "url": "http://patchwork.ozlabs.org/api/series/497693/?format=api", "web_url": "http://patchwork.ozlabs.org/project/linuxppc-dev/list/?series=497693", "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/497693/mbox/" } ], "comments": "http://patchwork.ozlabs.org/api/patches/2216749/comments/", "check": "pending", "checks": "http://patchwork.ozlabs.org/api/patches/2216749/checks/", "tags": {}, "related": [], "headers": { "Return-Path": "\n <linuxppc-dev+bounces-18898-incoming=patchwork.ozlabs.org@lists.ozlabs.org>", "X-Original-To": [ "incoming@patchwork.ozlabs.org", "linuxppc-dev@lists.ozlabs.org" ], "Delivered-To": "patchwork-incoming@legolas.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=lists.ozlabs.org\n (client-ip=2404:9400:21b9:f100::1; helo=lists.ozlabs.org;\n envelope-from=linuxppc-dev+bounces-18898-incoming=patchwork.ozlabs.org@lists.ozlabs.org;\n receiver=patchwork.ozlabs.org)", "lists.ozlabs.org;\n arc=none smtp.remote-ip=\"2607:7c80:54:3::133\"", "lists.ozlabs.org;\n dmarc=fail (p=none dis=none) header.from=lst.de", "lists.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", "lists.ozlabs.org;\n spf=none (no SPF record) smtp.mailfrom=bombadil.srs.infradead.org\n (client-ip=2607:7c80:54:3::133; helo=bombadil.infradead.org;\n envelope-from=batv+7b1de7ca9b09bfe890a7+8251+infradead.org+hch@bombadil.srs.infradead.org;\n receiver=lists.ozlabs.org)" ], "Received": [ "from lists.ozlabs.org (lists.ozlabs.org\n [IPv6:2404:9400:21b9:f100::1])\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 4fhrFX5F3Pz1xy1\n\tfor <incoming@patchwork.ozlabs.org>; Fri, 27 Mar 2026 17:24:00 +1100 (AEDT)", "from boromir.ozlabs.org (localhost [127.0.0.1])\n\tby lists.ozlabs.org (Postfix) with ESMTP id 4fhrFX2QD1z3f4b;\n\tFri, 27 Mar 2026 17:24:00 +1100 (AEDT)", "from bombadil.infradead.org (bombadil.infradead.org\n [IPv6:2607:7c80:54:3::133])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519 server-signature RSA-PSS (2048 bits) server-digest\n SHA256)\n\t(No client certificate requested)\n\tby lists.ozlabs.org (Postfix) with ESMTPS id 4fhrFW5FLFz3f46\n\tfor <linuxppc-dev@lists.ozlabs.org>; Fri, 27 Mar 2026 17:23:59 +1100 (AEDT)", "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=1; a=rsa-sha256; d=lists.ozlabs.org; s=201707; t=1774592640;\n\tcv=none;\n b=j1TJHw0WzsIGepsZO5Vta4cufjPZBgn1FbXo+BfMOYOyw/OU5SWhz2L0+VcjCYViH4bVml9CPcxXd/7pqzY/7DvG8AOlqHLMksnfKefLa1HvbCyfntQPhMkAtlgRJu3YeHfZZQ3VJ1zb/en7jsks7BGCthFNQoW4KFDl68en3BeyNaTXqlLEOXQrgpCayz19rKxKmvFq/ORCZQtShJEuA0NWY75THTy6JMSSnBm4++z/Wmcv//qOIgaDCFxdsTp3aZAZ7G+5HiQAAJzabqjtdygP+SdSdYUPRB+yT1/Auh8GuT3+og+QvjQPUEZKkRgOnZ014CMAB+Q5zfQceocW1w==", "ARC-Message-Signature": "i=1; a=rsa-sha256; d=lists.ozlabs.org; s=201707;\n\tt=1774592640; 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=ToQwaDmzGWK5+guVkTUq+9bxY0UNB6yx3D9tLcK4GKdmVrhB5YB/QGcoTFkrn7E4Mz8XXCfqhwmoVWS1k1Myc+OqRjpzIVnO/LbR0ETj5+wkNlxLZqXiECnuVaHrQxhdMa2z7zTkQWOqOwPoxAG0tfrXpAY8FDWbloXAxN+W+LHrommmAHswPoqxCXX0qRe94FslEifyULNUacOd0q2PCngOfIvuJLYHeb5hIGFCq+Km6ol/o9EuP5wH5JGqKoh2IfN4l4OOqV1IHSs5z3PPMIXRSPyRi+05/b+XiS6pj68YaVrlb1hTZON9J24dKx+kC+C7ERkA9p6j4NRa0WJMsA==", "ARC-Authentication-Results": "i=1; lists.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=none (client-ip=2607:7c80:54:3::133; helo=bombadil.infradead.org;\n envelope-from=batv+7b1de7ca9b09bfe890a7+8251+infradead.org+hch@bombadil.srs.infradead.org;\n receiver=lists.ozlabs.org) smtp.mailfrom=bombadil.srs.infradead.org", "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>", "X-Mailing-List": "linuxppc-dev@lists.ozlabs.org", "List-Id": "<linuxppc-dev.lists.ozlabs.org>", "List-Help": "<mailto:linuxppc-dev+help@lists.ozlabs.org>", "List-Owner": "<mailto:linuxppc-dev+owner@lists.ozlabs.org>", "List-Post": "<mailto:linuxppc-dev@lists.ozlabs.org>", "List-Archive": "<https://lore.kernel.org/linuxppc-dev/>,\n <https://lists.ozlabs.org/pipermail/linuxppc-dev/>", "List-Subscribe": "<mailto:linuxppc-dev+subscribe@lists.ozlabs.org>,\n <mailto:linuxppc-dev+subscribe-digest@lists.ozlabs.org>,\n <mailto:linuxppc-dev+subscribe-nomail@lists.ozlabs.org>", "List-Unsubscribe": "<mailto:linuxppc-dev+unsubscribe@lists.ozlabs.org>", "Precedence": "list", "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.0 required=3.0 tests=DKIM_SIGNED,DKIM_VALID,\n\tHEADER_FROM_DIFFERENT_DOMAINS,SPF_HELO_NONE,SPF_NONE\n\tautolearn=disabled version=4.0.1 OzLabs 8", "X-Spam-Checker-Version": "SpamAssassin 4.0.1 (2024-03-25) on lists.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" ] }