]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
arm_mpam: Add kunit test for bitmap reset
authorJames Morse <james.morse@arm.com>
Wed, 19 Nov 2025 12:23:02 +0000 (12:23 +0000)
committerCatalin Marinas <catalin.marinas@arm.com>
Wed, 19 Nov 2025 18:34:24 +0000 (18:34 +0000)
The bitmap reset code has been a source of bugs. Add a unit test.

This currently has to be built in, as the rest of the driver is
builtin.

Suggested-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Signed-off-by: James Morse <james.morse@arm.com>
Reviewed-by: Jonathan Cameron <jonathan.cameron@huawei.com>
Reviewed-by: Ben Horgan <ben.horgan@arm.com>
Reviewed-by: Fenghua Yu <fenghuay@nvidia.com>
Reviewed-by: Gavin Shan <gshan@redhat.com>
Reviewed-by: Shaopeng Tan <tan.shaopeng@jp.fujitsu.com>
Tested-by: Fenghua Yu <fenghuay@nvidia.com>
Tested-by: Carl Worth <carl@os.amperecomputing.com>
Tested-by: Gavin Shan <gshan@redhat.com>
Tested-by: Zeng Heng <zengheng4@huawei.com>
Tested-by: Shaopeng Tan <tan.shaopeng@jp.fujitsu.com>
Tested-by: Hanjun Guo <guohanjun@huawei.com>
Signed-off-by: Ben Horgan <ben.horgan@arm.com>
Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
drivers/resctrl/Kconfig
drivers/resctrl/mpam_devices.c
drivers/resctrl/test_mpam_devices.c [new file with mode: 0644]

index 5f7f748e611e1ddbd725d40c3b1c24b6945900cd..c808e0470394640ac441facea2e9baf02d1362ec 100644 (file)
@@ -12,4 +12,13 @@ config ARM64_MPAM_DRIVER_DEBUG
        help
          Say yes here to enable debug messages from the MPAM driver.
 
+config MPAM_KUNIT_TEST
+       bool "KUnit tests for MPAM driver " if !KUNIT_ALL_TESTS
+       depends on KUNIT=y
+       default KUNIT_ALL_TESTS
+       help
+         Enable this option to run tests in the MPAM driver.
+
+         If unsure, say N.
+
 endif
index b4aa817994295855bf5b9ed83cf2ce3974670f5a..0b5b158e1aafbc1656f3c3492defbf33cb68a53c 100644 (file)
@@ -2717,3 +2717,7 @@ static int __init mpam_msc_driver_init(void)
 
 /* Must occur after arm64_mpam_register_cpus() from arch_initcall() */
 subsys_initcall(mpam_msc_driver_init);
+
+#ifdef CONFIG_MPAM_KUNIT_TEST
+#include "test_mpam_devices.c"
+#endif
diff --git a/drivers/resctrl/test_mpam_devices.c b/drivers/resctrl/test_mpam_devices.c
new file mode 100644 (file)
index 0000000..0cfb41b
--- /dev/null
@@ -0,0 +1,69 @@
+// SPDX-License-Identifier: GPL-2.0
+// Copyright (C) 2025 Arm Ltd.
+/* This file is intended to be included into mpam_devices.c */
+
+#include <kunit/test.h>
+
+static void test_mpam_reset_msc_bitmap(struct kunit *test)
+{
+       char __iomem *buf = kunit_kzalloc(test, SZ_16K, GFP_KERNEL);
+       struct mpam_msc fake_msc = {};
+       u32 *test_result;
+
+       if (!buf)
+               return;
+
+       fake_msc.mapped_hwpage = buf;
+       fake_msc.mapped_hwpage_sz = SZ_16K;
+       cpumask_copy(&fake_msc.accessibility, cpu_possible_mask);
+
+       /* Satisfy lockdep checks */
+       mutex_init(&fake_msc.part_sel_lock);
+       mutex_lock(&fake_msc.part_sel_lock);
+
+       test_result = (u32 *)(buf + MPAMCFG_CPBM);
+
+       mpam_reset_msc_bitmap(&fake_msc, MPAMCFG_CPBM, 0);
+       KUNIT_EXPECT_EQ(test, test_result[0], 0);
+       KUNIT_EXPECT_EQ(test, test_result[1], 0);
+       test_result[0] = 0;
+       test_result[1] = 0;
+
+       mpam_reset_msc_bitmap(&fake_msc, MPAMCFG_CPBM, 1);
+       KUNIT_EXPECT_EQ(test, test_result[0], 1);
+       KUNIT_EXPECT_EQ(test, test_result[1], 0);
+       test_result[0] = 0;
+       test_result[1] = 0;
+
+       mpam_reset_msc_bitmap(&fake_msc, MPAMCFG_CPBM, 16);
+       KUNIT_EXPECT_EQ(test, test_result[0], 0xffff);
+       KUNIT_EXPECT_EQ(test, test_result[1], 0);
+       test_result[0] = 0;
+       test_result[1] = 0;
+
+       mpam_reset_msc_bitmap(&fake_msc, MPAMCFG_CPBM, 32);
+       KUNIT_EXPECT_EQ(test, test_result[0], 0xffffffff);
+       KUNIT_EXPECT_EQ(test, test_result[1], 0);
+       test_result[0] = 0;
+       test_result[1] = 0;
+
+       mpam_reset_msc_bitmap(&fake_msc, MPAMCFG_CPBM, 33);
+       KUNIT_EXPECT_EQ(test, test_result[0], 0xffffffff);
+       KUNIT_EXPECT_EQ(test, test_result[1], 1);
+       test_result[0] = 0;
+       test_result[1] = 0;
+
+       mutex_unlock(&fake_msc.part_sel_lock);
+}
+
+static struct kunit_case mpam_devices_test_cases[] = {
+       KUNIT_CASE(test_mpam_reset_msc_bitmap),
+       {}
+};
+
+static struct kunit_suite mpam_devices_test_suite = {
+       .name = "mpam_devices_test_suite",
+       .test_cases = mpam_devices_test_cases,
+};
+
+kunit_test_suites(&mpam_devices_test_suite);