summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--arch/powerpc/mm/book3s64/hash_tlb.c4
-rw-r--r--mm/Kconfig12
-rw-r--r--mm/Makefile1
-rw-r--r--mm/tests/lazy_mmu_mode_kunit.c74
4 files changed, 90 insertions, 1 deletions
diff --git a/arch/powerpc/mm/book3s64/hash_tlb.c b/arch/powerpc/mm/book3s64/hash_tlb.c
index fbdeb8981ae7..ec2941cec815 100644
--- a/arch/powerpc/mm/book3s64/hash_tlb.c
+++ b/arch/powerpc/mm/book3s64/hash_tlb.c
@@ -25,11 +25,12 @@
#include <asm/tlb.h>
#include <asm/bug.h>
#include <asm/pte-walk.h>
-
+#include <kunit/visibility.h>
#include <trace/events/thp.h>
DEFINE_PER_CPU(struct ppc64_tlb_batch, ppc64_tlb_batch);
+EXPORT_SYMBOL_IF_KUNIT(ppc64_tlb_batch);
/*
* A linux PTE was changed and the corresponding hash table entry
@@ -154,6 +155,7 @@ void __flush_tlb_pending(struct ppc64_tlb_batch *batch)
flush_hash_range(i, local);
batch->index = 0;
}
+EXPORT_SYMBOL_IF_KUNIT(__flush_tlb_pending);
void hash__tlb_flush(struct mmu_gather *tlb)
{
diff --git a/mm/Kconfig b/mm/Kconfig
index 7c2520e6a6b3..5f4d6e5b5715 100644
--- a/mm/Kconfig
+++ b/mm/Kconfig
@@ -1475,6 +1475,18 @@ config ARCH_HAS_LAZY_MMU_MODE
MMU-related architectural state to be deferred until the mode is
exited. See <linux/pgtable.h> for details.
+config LAZY_MMU_MODE_KUNIT_TEST
+ tristate "KUnit tests for the lazy MMU mode" if !KUNIT_ALL_TESTS
+ depends on ARCH_HAS_LAZY_MMU_MODE
+ depends on KUNIT
+ default KUNIT_ALL_TESTS
+ help
+ Enable this option to check that the lazy MMU mode interface behaves
+ as expected. Only tests for the generic interface are included (not
+ architecture-specific behaviours).
+
+ If unsure, say N.
+
source "mm/damon/Kconfig"
endmenu
diff --git a/mm/Makefile b/mm/Makefile
index 2d0570a16e5b..9175f8cc6565 100644
--- a/mm/Makefile
+++ b/mm/Makefile
@@ -147,3 +147,4 @@ obj-$(CONFIG_SHRINKER_DEBUG) += shrinker_debug.o
obj-$(CONFIG_EXECMEM) += execmem.o
obj-$(CONFIG_TMPFS_QUOTA) += shmem_quota.o
obj-$(CONFIG_PT_RECLAIM) += pt_reclaim.o
+obj-$(CONFIG_LAZY_MMU_MODE_KUNIT_TEST) += tests/lazy_mmu_mode_kunit.o
diff --git a/mm/tests/lazy_mmu_mode_kunit.c b/mm/tests/lazy_mmu_mode_kunit.c
new file mode 100644
index 000000000000..1c23456b467e
--- /dev/null
+++ b/mm/tests/lazy_mmu_mode_kunit.c
@@ -0,0 +1,74 @@
+// SPDX-License-Identifier: GPL-2.0-only
+#include <kunit/test.h>
+#include <linux/pgtable.h>
+
+/* For some symbols referenced by arch_{enter,leave}_lazy_mmu_mode on powerpc */
+MODULE_IMPORT_NS("EXPORTED_FOR_KUNIT_TESTING");
+
+static void expect_not_active(struct kunit *test)
+{
+ KUNIT_EXPECT_FALSE(test, is_lazy_mmu_mode_active());
+}
+
+static void expect_active(struct kunit *test)
+{
+ KUNIT_EXPECT_TRUE(test, is_lazy_mmu_mode_active());
+}
+
+static void lazy_mmu_mode_active(struct kunit *test)
+{
+ expect_not_active(test);
+
+ lazy_mmu_mode_enable();
+ expect_active(test);
+
+ {
+ /* Nested section */
+ lazy_mmu_mode_enable();
+ expect_active(test);
+
+ lazy_mmu_mode_disable();
+ expect_active(test);
+ }
+
+ {
+ /* Paused section */
+ lazy_mmu_mode_pause();
+ expect_not_active(test);
+
+ {
+ /* No effect (paused) */
+ lazy_mmu_mode_enable();
+ expect_not_active(test);
+
+ lazy_mmu_mode_disable();
+ expect_not_active(test);
+
+ lazy_mmu_mode_pause();
+ expect_not_active(test);
+
+ lazy_mmu_mode_resume();
+ expect_not_active(test);
+ }
+
+ lazy_mmu_mode_resume();
+ expect_active(test);
+ }
+
+ lazy_mmu_mode_disable();
+ expect_not_active(test);
+}
+
+static struct kunit_case lazy_mmu_mode_test_cases[] = {
+ KUNIT_CASE(lazy_mmu_mode_active),
+ {}
+};
+
+static struct kunit_suite lazy_mmu_mode_test_suite = {
+ .name = "lazy_mmu_mode",
+ .test_cases = lazy_mmu_mode_test_cases,
+};
+kunit_test_suite(lazy_mmu_mode_test_suite);
+
+MODULE_DESCRIPTION("Tests for the lazy MMU mode");
+MODULE_LICENSE("GPL");