Add basic KUnit tests for the generic aspects of the lazy MMU mode:
ensure that it appears active when it should, depending on how
enable/disable and pause/resume pairs are nested.
Signed-off-by: Kevin Brodsky <kevin.brodsky@arm.com>
---
mm/Kconfig | 12 ++++++
mm/Makefile | 1 +
mm/tests/lazy_mmu_mode_kunit.c | 71 ++++++++++++++++++++++++++++++++++
3 files changed, 84 insertions(+)
create mode 100644 mm/tests/lazy_mmu_mode_kunit.c
diff --git a/mm/Kconfig b/mm/Kconfig
index 62073bd61544..ac48deb44884 100644
--- a/mm/Kconfig
+++ b/mm/Kconfig
@@ -1471,6 +1471,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..2720eb995714
--- /dev/null
+++ b/mm/tests/lazy_mmu_mode_kunit.c
@@ -0,0 +1,71 @@
+// SPDX-License-Identifier: GPL-2.0-only
+#include <kunit/test.h>
+#include <linux/pgtable.h>
+
+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");
--
2.51.2
On 12/15/25 16:03, Kevin Brodsky wrote:
> Add basic KUnit tests for the generic aspects of the lazy MMU mode:
> ensure that it appears active when it should, depending on how
> enable/disable and pause/resume pairs are nested.
>
> Signed-off-by: Kevin Brodsky <kevin.brodsky@arm.com>
> ---
> mm/Kconfig | 12 ++++++
> mm/Makefile | 1 +
> mm/tests/lazy_mmu_mode_kunit.c | 71 ++++++++++++++++++++++++++++++++++
> 3 files changed, 84 insertions(+)
> create mode 100644 mm/tests/lazy_mmu_mode_kunit.c
>
> diff --git a/mm/Kconfig b/mm/Kconfig
> index 62073bd61544..ac48deb44884 100644
> --- a/mm/Kconfig
> +++ b/mm/Kconfig
> @@ -1471,6 +1471,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..2720eb995714
> --- /dev/null
> +++ b/mm/tests/lazy_mmu_mode_kunit.c
> @@ -0,0 +1,71 @@
> +// SPDX-License-Identifier: GPL-2.0-only
> +#include <kunit/test.h>
> +#include <linux/pgtable.h>
> +
> +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");
Very nice test :)
I think I prefer the EXPORT_SYMBOL_IF_KUNIT over disabling the test for
PPC and over making lazy_mmu_mode_enable() non-inlined functions with an
exported symbol.
With the EXPORT_SYMBOL_IF_KUNIT stuff added
Acked-by: David Hildenbrand (Red Hat) <david@kernel.org>
--
Cheers
David
On 09/01/2026 16:07, David Hildenbrand (Red Hat) wrote: > > Very nice test 🙂 Thanks! > > I think I prefer the EXPORT_SYMBOL_IF_KUNIT over disabling the test > for PPC and over making lazy_mmu_mode_enable() non-inlined functions > with an exported symbol The EXPORT_SYMBOL_IF_KUNIT approach is what's currently in mm-unstable (with the fixes from Ritesh and me). - Kevin
On Mon, 15 Dec 2025 15:03:23 +0000 Kevin Brodsky <kevin.brodsky@arm.com> wrote:
> Add basic KUnit tests for the generic aspects of the lazy MMU mode:
> ensure that it appears active when it should, depending on how
> enable/disable and pause/resume pairs are nested.
I needed this for powerpc allmodconfig;
--- a/arch/powerpc/mm/book3s64/hash_tlb.c~mm-add-basic-tests-for-lazy_mmu-fix
+++ a/arch/powerpc/mm/book3s64/hash_tlb.c
@@ -30,6 +30,7 @@
#include <trace/events/thp.h>
DEFINE_PER_CPU(struct ppc64_tlb_batch, ppc64_tlb_batch);
+EXPORT_SYMBOL_GPL(ppc64_tlb_batch);
/*
* A linux PTE was changed and the corresponding hash table entry
@@ -154,6 +155,7 @@ void __flush_tlb_pending(struct ppc64_tl
flush_hash_range(i, local);
batch->index = 0;
}
+EXPORT_SYMBOL_GPL(__flush_tlb_pending);
void hash__tlb_flush(struct mmu_gather *tlb)
{
_
On 17/12/2025 05:14, Andrew Morton wrote:
> On Mon, 15 Dec 2025 15:03:23 +0000 Kevin Brodsky <kevin.brodsky@arm.com> wrote:
>
>> Add basic KUnit tests for the generic aspects of the lazy MMU mode:
>> ensure that it appears active when it should, depending on how
>> enable/disable and pause/resume pairs are nested.
> I needed this for powerpc allmodconfig;
>
> --- a/arch/powerpc/mm/book3s64/hash_tlb.c~mm-add-basic-tests-for-lazy_mmu-fix
> +++ a/arch/powerpc/mm/book3s64/hash_tlb.c
> @@ -30,6 +30,7 @@
> #include <trace/events/thp.h>
>
> DEFINE_PER_CPU(struct ppc64_tlb_batch, ppc64_tlb_batch);
> +EXPORT_SYMBOL_GPL(ppc64_tlb_batch);
>
> /*
> * A linux PTE was changed and the corresponding hash table entry
> @@ -154,6 +155,7 @@ void __flush_tlb_pending(struct ppc64_tl
> flush_hash_range(i, local);
> batch->index = 0;
> }
> +EXPORT_SYMBOL_GPL(__flush_tlb_pending);
>
> void hash__tlb_flush(struct mmu_gather *tlb)
> {
> _
Oh indeed I hadn't considered that arch_{enter,leave}_lazy_mmu_mode()
refer to those symbols on powerpc... Maybe a bit overkill to export
those just for a test module, but I'm not sure there's a good
alternative. Forcing LAZY_MMU_MODE_KUNIT_TEST=y is ugly as it would also
force KUNIT=y. Alternatively we could depend on !PPC, not pretty either.
- Kevin
On 17/12/2025 09:26, Kevin Brodsky wrote:
> On 17/12/2025 05:14, Andrew Morton wrote:
>> On Mon, 15 Dec 2025 15:03:23 +0000 Kevin Brodsky <kevin.brodsky@arm.com> wrote:
>>
>>> Add basic KUnit tests for the generic aspects of the lazy MMU mode:
>>> ensure that it appears active when it should, depending on how
>>> enable/disable and pause/resume pairs are nested.
>> I needed this for powerpc allmodconfig;
>>
>> --- a/arch/powerpc/mm/book3s64/hash_tlb.c~mm-add-basic-tests-for-lazy_mmu-fix
>> +++ a/arch/powerpc/mm/book3s64/hash_tlb.c
>> @@ -30,6 +30,7 @@
>> #include <trace/events/thp.h>
>>
>> DEFINE_PER_CPU(struct ppc64_tlb_batch, ppc64_tlb_batch);
>> +EXPORT_SYMBOL_GPL(ppc64_tlb_batch);
>>
>> /*
>> * A linux PTE was changed and the corresponding hash table entry
>> @@ -154,6 +155,7 @@ void __flush_tlb_pending(struct ppc64_tl
>> flush_hash_range(i, local);
>> batch->index = 0;
>> }
>> +EXPORT_SYMBOL_GPL(__flush_tlb_pending);
>>
>> void hash__tlb_flush(struct mmu_gather *tlb)
>> {
>> _
>
> Oh indeed I hadn't considered that arch_{enter,leave}_lazy_mmu_mode()
> refer to those symbols on powerpc... Maybe a bit overkill to export
> those just for a test module, but I'm not sure there's a good
> alternative. Forcing LAZY_MMU_MODE_KUNIT_TEST=y is ugly as it would also
> force KUNIT=y. Alternatively we could depend on !PPC, not pretty either.
Does EXPORT_SYMBOL_IF_KUNIT() help?
>
> - Kevin
Ryan Roberts <ryan.roberts@arm.com> writes:
> On 17/12/2025 09:26, Kevin Brodsky wrote:
>> On 17/12/2025 05:14, Andrew Morton wrote:
>>> On Mon, 15 Dec 2025 15:03:23 +0000 Kevin Brodsky <kevin.brodsky@arm.com> wrote:
>>>
>>>> Add basic KUnit tests for the generic aspects of the lazy MMU mode:
>>>> ensure that it appears active when it should, depending on how
>>>> enable/disable and pause/resume pairs are nested.
>>> I needed this for powerpc allmodconfig;
>>>
>>> --- a/arch/powerpc/mm/book3s64/hash_tlb.c~mm-add-basic-tests-for-lazy_mmu-fix
>>> +++ a/arch/powerpc/mm/book3s64/hash_tlb.c
>>> @@ -30,6 +30,7 @@
>>> #include <trace/events/thp.h>
>>>
>>> DEFINE_PER_CPU(struct ppc64_tlb_batch, ppc64_tlb_batch);
>>> +EXPORT_SYMBOL_GPL(ppc64_tlb_batch);
>>>
>>> /*
>>> * A linux PTE was changed and the corresponding hash table entry
>>> @@ -154,6 +155,7 @@ void __flush_tlb_pending(struct ppc64_tl
>>> flush_hash_range(i, local);
>>> batch->index = 0;
>>> }
>>> +EXPORT_SYMBOL_GPL(__flush_tlb_pending);
>>>
>>> void hash__tlb_flush(struct mmu_gather *tlb)
>>> {
>>> _
>>
>> Oh indeed I hadn't considered that arch_{enter,leave}_lazy_mmu_mode()
>> refer to those symbols on powerpc... Maybe a bit overkill to export
>> those just for a test module, but I'm not sure there's a good
>> alternative. Forcing LAZY_MMU_MODE_KUNIT_TEST=y is ugly as it would also
>> force KUNIT=y. Alternatively we could depend on !PPC, not pretty either.
>
> Does EXPORT_SYMBOL_IF_KUNIT() help?
>
yes, that make sense. Thanks for the suggestion!
I guess we will need a diff like this in that case -
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/tests/lazy_mmu_mode_kunit.c b/mm/tests/lazy_mmu_mode_kunit.c
index 2720eb995714..340d7cda9096 100644
--- a/mm/tests/lazy_mmu_mode_kunit.c
+++ b/mm/tests/lazy_mmu_mode_kunit.c
@@ -69,3 +69,4 @@ kunit_test_suite(lazy_mmu_mode_test_suite);
MODULE_DESCRIPTION("Tests for the lazy MMU mode");
MODULE_LICENSE("GPL");
+MODULE_IMPORT_NS("EXPORTED_FOR_KUNIT_TESTING");
-ritesh
On 17/12/2025 16:46, Ritesh Harjani (IBM) wrote:
> Ryan Roberts <ryan.roberts@arm.com> writes:
>
>> On 17/12/2025 09:26, Kevin Brodsky wrote:
>>> On 17/12/2025 05:14, Andrew Morton wrote:
>>>> On Mon, 15 Dec 2025 15:03:23 +0000 Kevin Brodsky <kevin.brodsky@arm.com> wrote:
>>>>
>>>>> Add basic KUnit tests for the generic aspects of the lazy MMU mode:
>>>>> ensure that it appears active when it should, depending on how
>>>>> enable/disable and pause/resume pairs are nested.
>>>> I needed this for powerpc allmodconfig;
>>>>
>>>> --- a/arch/powerpc/mm/book3s64/hash_tlb.c~mm-add-basic-tests-for-lazy_mmu-fix
>>>> +++ a/arch/powerpc/mm/book3s64/hash_tlb.c
>>>> @@ -30,6 +30,7 @@
>>>> #include <trace/events/thp.h>
>>>>
>>>> DEFINE_PER_CPU(struct ppc64_tlb_batch, ppc64_tlb_batch);
>>>> +EXPORT_SYMBOL_GPL(ppc64_tlb_batch);
>>>>
>>>> /*
>>>> * A linux PTE was changed and the corresponding hash table entry
>>>> @@ -154,6 +155,7 @@ void __flush_tlb_pending(struct ppc64_tl
>>>> flush_hash_range(i, local);
>>>> batch->index = 0;
>>>> }
>>>> +EXPORT_SYMBOL_GPL(__flush_tlb_pending);
>>>>
>>>> void hash__tlb_flush(struct mmu_gather *tlb)
>>>> {
>>>> _
>>> Oh indeed I hadn't considered that arch_{enter,leave}_lazy_mmu_mode()
>>> refer to those symbols on powerpc... Maybe a bit overkill to export
>>> those just for a test module, but I'm not sure there's a good
>>> alternative. Forcing LAZY_MMU_MODE_KUNIT_TEST=y is ugly as it would also
>>> force KUNIT=y. Alternatively we could depend on !PPC, not pretty either.
>> Does EXPORT_SYMBOL_IF_KUNIT() help?
>>
> yes, that make sense. Thanks for the suggestion!
> I guess we will need a diff like this in that case -
>
>
> 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/tests/lazy_mmu_mode_kunit.c b/mm/tests/lazy_mmu_mode_kunit.c
> index 2720eb995714..340d7cda9096 100644
> --- a/mm/tests/lazy_mmu_mode_kunit.c
> +++ b/mm/tests/lazy_mmu_mode_kunit.c
> @@ -69,3 +69,4 @@ kunit_test_suite(lazy_mmu_mode_test_suite);
>
> MODULE_DESCRIPTION("Tests for the lazy MMU mode");
> MODULE_LICENSE("GPL");
> +MODULE_IMPORT_NS("EXPORTED_FOR_KUNIT_TESTING");
Indeed, that's pretty much what I was about to send :)
- Kevin
On 17/12/2025 11:01, Ryan Roberts wrote:
> On 17/12/2025 09:26, Kevin Brodsky wrote:
>> On 17/12/2025 05:14, Andrew Morton wrote:
>>> On Mon, 15 Dec 2025 15:03:23 +0000 Kevin Brodsky <kevin.brodsky@arm.com> wrote:
>>>
>>>> Add basic KUnit tests for the generic aspects of the lazy MMU mode:
>>>> ensure that it appears active when it should, depending on how
>>>> enable/disable and pause/resume pairs are nested.
>>> I needed this for powerpc allmodconfig;
>>>
>>> --- a/arch/powerpc/mm/book3s64/hash_tlb.c~mm-add-basic-tests-for-lazy_mmu-fix
>>> +++ a/arch/powerpc/mm/book3s64/hash_tlb.c
>>> @@ -30,6 +30,7 @@
>>> #include <trace/events/thp.h>
>>>
>>> DEFINE_PER_CPU(struct ppc64_tlb_batch, ppc64_tlb_batch);
>>> +EXPORT_SYMBOL_GPL(ppc64_tlb_batch);
>>>
>>> /*
>>> * A linux PTE was changed and the corresponding hash table entry
>>> @@ -154,6 +155,7 @@ void __flush_tlb_pending(struct ppc64_tl
>>> flush_hash_range(i, local);
>>> batch->index = 0;
>>> }
>>> +EXPORT_SYMBOL_GPL(__flush_tlb_pending);
>>>
>>> void hash__tlb_flush(struct mmu_gather *tlb)
>>> {
>>> _
>> Oh indeed I hadn't considered that arch_{enter,leave}_lazy_mmu_mode()
>> refer to those symbols on powerpc... Maybe a bit overkill to export
>> those just for a test module, but I'm not sure there's a good
>> alternative. Forcing LAZY_MMU_MODE_KUNIT_TEST=y is ugly as it would also
>> force KUNIT=y. Alternatively we could depend on !PPC, not pretty either.
> Does EXPORT_SYMBOL_IF_KUNIT() help?
It most certainly would, I didn't know about that one, thanks!
- Kevin
Upcoming KUnit tests will call lazy_mmu_mode_{enable,disable}.
These tests may be built as a module, and because of inlining this
means that arch_{enter,flush,leave}_lazy_mmu_mode need to be
exported.
Signed-off-by: Kevin Brodsky <kevin.brodsky@arm.com>
---
The CI reports that sparc needs pretty much the same time treatment as
powerpc... Here's another patch to take care of that.
Andrew, could you please add it after the powerpc one? At this point it's
probably best to remove the comment above MODULE_IMPORT_NS() in
mm/tests/lazy_mmu_mode_kunit.c. Thank you and sorry for the noise!
---
arch/sparc/mm/tlb.c | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/arch/sparc/mm/tlb.c b/arch/sparc/mm/tlb.c
index 3a852071d260..6d9dd5eb1328 100644
--- a/arch/sparc/mm/tlb.c
+++ b/arch/sparc/mm/tlb.c
@@ -11,6 +11,8 @@
#include <linux/preempt.h>
#include <linux/pagemap.h>
+#include <kunit/visibility.h>
+
#include <asm/tlbflush.h>
#include <asm/cacheflush.h>
#include <asm/mmu_context.h>
@@ -54,6 +56,8 @@ void arch_enter_lazy_mmu_mode(void)
{
preempt_disable();
}
+/* For lazy_mmu_mode KUnit tests */
+EXPORT_SYMBOL_IF_KUNIT(arch_enter_lazy_mmu_mode);
void arch_flush_lazy_mmu_mode(void)
{
@@ -62,12 +66,14 @@ void arch_flush_lazy_mmu_mode(void)
if (tb->tlb_nr)
flush_tlb_pending();
}
+EXPORT_SYMBOL_IF_KUNIT(arch_flush_lazy_mmu_mode);
void arch_leave_lazy_mmu_mode(void)
{
arch_flush_lazy_mmu_mode();
preempt_enable();
}
+EXPORT_SYMBOL_IF_KUNIT(arch_leave_lazy_mmu_mode);
static void tlb_batch_add_one(struct mm_struct *mm, unsigned long vaddr,
bool exec, unsigned int hugepage_shift)
base-commit: 8f0b4cce4481fb22653697cced8d0d04027cb1e8
--
2.51.2
On 18/12/2025 11:05, Kevin Brodsky wrote:
> Upcoming KUnit tests will call lazy_mmu_mode_{enable,disable}.
> These tests may be built as a module, and because of inlining this
> means that arch_{enter,flush,leave}_lazy_mmu_mode need to be
> exported.
>
> Signed-off-by: Kevin Brodsky <kevin.brodsky@arm.com>
> ---
>
> The CI reports that sparc needs pretty much the same time treatment as
> powerpc... Here's another patch to take care of that.
>
> Andrew, could you please add it after the powerpc one? At this point it's
> probably best to remove the comment above MODULE_IMPORT_NS() in
> mm/tests/lazy_mmu_mode_kunit.c. Thank you and sorry for the noise!
Gentle ping - I think we need this patch in mm-unstable, the CI has been
complaining as well. Thanks!
- Kevin
> ---
> arch/sparc/mm/tlb.c | 6 ++++++
> 1 file changed, 6 insertions(+)
>
> diff --git a/arch/sparc/mm/tlb.c b/arch/sparc/mm/tlb.c
> index 3a852071d260..6d9dd5eb1328 100644
> --- a/arch/sparc/mm/tlb.c
> +++ b/arch/sparc/mm/tlb.c
> @@ -11,6 +11,8 @@
> #include <linux/preempt.h>
> #include <linux/pagemap.h>
>
> +#include <kunit/visibility.h>
> +
> #include <asm/tlbflush.h>
> #include <asm/cacheflush.h>
> #include <asm/mmu_context.h>
> @@ -54,6 +56,8 @@ void arch_enter_lazy_mmu_mode(void)
> {
> preempt_disable();
> }
> +/* For lazy_mmu_mode KUnit tests */
> +EXPORT_SYMBOL_IF_KUNIT(arch_enter_lazy_mmu_mode);
>
> void arch_flush_lazy_mmu_mode(void)
> {
> @@ -62,12 +66,14 @@ void arch_flush_lazy_mmu_mode(void)
> if (tb->tlb_nr)
> flush_tlb_pending();
> }
> +EXPORT_SYMBOL_IF_KUNIT(arch_flush_lazy_mmu_mode);
>
> void arch_leave_lazy_mmu_mode(void)
> {
> arch_flush_lazy_mmu_mode();
> preempt_enable();
> }
> +EXPORT_SYMBOL_IF_KUNIT(arch_leave_lazy_mmu_mode);
>
> static void tlb_batch_add_one(struct mm_struct *mm, unsigned long vaddr,
> bool exec, unsigned int hugepage_shift)
>
> base-commit: 8f0b4cce4481fb22653697cced8d0d04027cb1e8
On 2026-01-12 11:09, Kevin Brodsky wrote:
> On 18/12/2025 11:05, Kevin Brodsky wrote:
>> Upcoming KUnit tests will call lazy_mmu_mode_{enable,disable}.
>> These tests may be built as a module, and because of inlining this
>> means that arch_{enter,flush,leave}_lazy_mmu_mode need to be
>> exported.
>>
>> Signed-off-by: Kevin Brodsky <kevin.brodsky@arm.com>
>> ---
>>
>> The CI reports that sparc needs pretty much the same time treatment as
>> powerpc... Here's another patch to take care of that.
>>
>> Andrew, could you please add it after the powerpc one? At this point it's
>> probably best to remove the comment above MODULE_IMPORT_NS() in
>> mm/tests/lazy_mmu_mode_kunit.c. Thank you and sorry for the noise!
>
> Gentle ping - I think we need this patch in mm-unstable, the CI has been
> complaining as well. Thanks!
I get this problem as well, which is solved by this patch.
>> ---
>> arch/sparc/mm/tlb.c | 6 ++++++
>> 1 file changed, 6 insertions(+)
>>
>> diff --git a/arch/sparc/mm/tlb.c b/arch/sparc/mm/tlb.c
>> index 3a852071d260..6d9dd5eb1328 100644
>> --- a/arch/sparc/mm/tlb.c
>> +++ b/arch/sparc/mm/tlb.c
>> @@ -11,6 +11,8 @@
>> #include <linux/preempt.h>
>> #include <linux/pagemap.h>
>>
>> +#include <kunit/visibility.h>
>> +
>> #include <asm/tlbflush.h>
>> #include <asm/cacheflush.h>
>> #include <asm/mmu_context.h>
>> @@ -54,6 +56,8 @@ void arch_enter_lazy_mmu_mode(void)
>> {
>> preempt_disable();
>> }
>> +/* For lazy_mmu_mode KUnit tests */
>> +EXPORT_SYMBOL_IF_KUNIT(arch_enter_lazy_mmu_mode);
>>
>> void arch_flush_lazy_mmu_mode(void)
>> {
>> @@ -62,12 +66,14 @@ void arch_flush_lazy_mmu_mode(void)
>> if (tb->tlb_nr)
>> flush_tlb_pending();
>> }
>> +EXPORT_SYMBOL_IF_KUNIT(arch_flush_lazy_mmu_mode);
>>
>> void arch_leave_lazy_mmu_mode(void)
>> {
>> arch_flush_lazy_mmu_mode();
>> preempt_enable();
>> }
>> +EXPORT_SYMBOL_IF_KUNIT(arch_leave_lazy_mmu_mode);
>>
>> static void tlb_batch_add_one(struct mm_struct *mm, unsigned long vaddr,
>> bool exec, unsigned int hugepage_shift)
>>
>> base-commit: 8f0b4cce4481fb22653697cced8d0d04027cb1e8
Regardless of if it becomes a patch of its own in the end, or is
folded into another:
Acked-by: Andreas Larsson <andreas@gaisler.com>
Cheers,
Andreas
Upcoming KUnit tests will call lazy_mmu_mode_{enable,disable}.
These tests may be built as a module, and because of inlining this
means that symbols referenced by arch_{enter,leave}_lazy_mmu_mode
need to be exported.
Suggested-by: Ryan Roberts <ryan.roberts@arm.com>
Suggested-by: Ritesh Harjani (IBM) <ritesh.list@gmail.com>
Signed-off-by: Kevin Brodsky <kevin.brodsky@arm.com>
---
Andrew, please add this patch just before the last patch in the series
("mm: Add basic tests for lazy_mmu"). Thanks!
---
arch/powerpc/mm/book3s64/hash_tlb.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/arch/powerpc/mm/book3s64/hash_tlb.c b/arch/powerpc/mm/book3s64/hash_tlb.c
index fbdeb8981ae7..9e622519a423 100644
--- a/arch/powerpc/mm/book3s64/hash_tlb.c
+++ b/arch/powerpc/mm/book3s64/hash_tlb.c
@@ -30,6 +30,7 @@
#include <trace/events/thp.h>
DEFINE_PER_CPU(struct ppc64_tlb_batch, ppc64_tlb_batch);
+EXPORT_SYMBOL_IF_KUNIT(ppc64_tlb_batch); /* For lazy_mmu_mode KUnit tests */
/*
* 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); /* For lazy_mmu_mode KUnit tests */
void hash__tlb_flush(struct mmu_gather *tlb)
{
base-commit: 8f0b4cce4481fb22653697cced8d0d04027cb1e8
--
2.51.2
Hi Kevin,
kernel test robot noticed the following build warnings:
url: https://github.com/intel-lab-lkp/linux/commits/UPDATE-20251218-003955/Kevin-Brodsky/powerpc-64s-Do-not-re-activate-batched-TLB-flush/20251215-230757
base: the 14th patch of https://lore.kernel.org/r/20251215150323.2218608-15-kevin.brodsky%40arm.com
patch link: https://lore.kernel.org/r/20251217163812.2633648-1-kevin.brodsky%40arm.com
patch subject: [PATCH] powerpc/mm: export symbols for lazy_mmu_mode KUnit tests
config: powerpc-allmodconfig (https://download.01.org/0day-ci/archive/20251222/202512220735.UL4ukFLo-lkp@intel.com/config)
compiler: powerpc64-linux-gcc (GCC) 15.1.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20251222/202512220735.UL4ukFLo-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202512220735.UL4ukFLo-lkp@intel.com/
All warnings (new ones prefixed by >>):
>> arch/powerpc/mm/book3s64/hash_tlb.c:33:1: warning: data definition has no type or storage class
33 | EXPORT_SYMBOL_IF_KUNIT(ppc64_tlb_batch); /* For lazy_mmu_mode KUnit tests */
| ^~~~~~~~~~~~~~~~~~~~~~
arch/powerpc/mm/book3s64/hash_tlb.c:33:1: error: type defaults to 'int' in declaration of 'EXPORT_SYMBOL_IF_KUNIT' [-Wimplicit-int]
arch/powerpc/mm/book3s64/hash_tlb.c:33:1: error: parameter names (without types) in function declaration [-Wdeclaration-missing-parameter-type]
arch/powerpc/mm/book3s64/hash_tlb.c:158:1: warning: data definition has no type or storage class
158 | EXPORT_SYMBOL_IF_KUNIT(__flush_tlb_pending); /* For lazy_mmu_mode KUnit tests */
| ^~~~~~~~~~~~~~~~~~~~~~
arch/powerpc/mm/book3s64/hash_tlb.c:158:1: error: type defaults to 'int' in declaration of 'EXPORT_SYMBOL_IF_KUNIT' [-Wimplicit-int]
arch/powerpc/mm/book3s64/hash_tlb.c:158:1: error: parameter names (without types) in function declaration [-Wdeclaration-missing-parameter-type]
vim +33 arch/powerpc/mm/book3s64/hash_tlb.c
31
32 DEFINE_PER_CPU(struct ppc64_tlb_batch, ppc64_tlb_batch);
> 33 EXPORT_SYMBOL_IF_KUNIT(ppc64_tlb_batch); /* For lazy_mmu_mode KUnit tests */
34
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
Kevin Brodsky <kevin.brodsky@arm.com> writes:
> Upcoming KUnit tests will call lazy_mmu_mode_{enable,disable}.
> These tests may be built as a module, and because of inlining this
> means that symbols referenced by arch_{enter,leave}_lazy_mmu_mode
> need to be exported.
>
> Suggested-by: Ryan Roberts <ryan.roberts@arm.com>
> Suggested-by: Ritesh Harjani (IBM) <ritesh.list@gmail.com>
> Signed-off-by: Kevin Brodsky <kevin.brodsky@arm.com>
> ---
Hi Kevin,
I guess, this can give following errors:
../arch/powerpc/mm/book3s64/hash_tlb.c:33:1: error: data definition has no type or storage class [-Werror]
33 | EXPORT_SYMBOL_IF_KUNIT(ppc64_tlb_batch); /* For lazy_mmu_mode KUnit tests */
| ^~~~~~~~~~~~~~~~~~~~~~
../arch/powerpc/mm/book3s64/hash_tlb.c:33:1: error: type defaults to ‘int’ in declaration of ‘EXPORT_SYMBOL_IF_KUNIT’ [-Werror=implicit-int]
../arch/powerpc/mm/book3s64/hash_tlb.c:33:1: error: parameter names (without types) in function declaration [-Werror]
../arch/powerpc/mm/book3s64/hash_tlb.c:158:1: error: data definition has no type or storage class [-Werror]
158 | EXPORT_SYMBOL_IF_KUNIT(__flush_tlb_pending); /* For lazy_mmu_mode KUnit tests */
| ^~~~~~~~~~~~~~~~~~~~~~
../arch/powerpc/mm/book3s64/hash_tlb.c:158:1: error: type defaults to ‘int’ in declaration of ‘EXPORT_SYMBOL_IF_KUNIT’ [-Werror=implicit-int]
../arch/powerpc/mm/book3s64/hash_tlb.c:158:1: error: parameter names (without types) in function declaration [-Werror]
AR init/built-in.a
cc1: all warnings being treated as errors
make[6]: *** [../scripts/Makefile.build:287: arch/powerpc/mm/book3s64/hash_tlb.o] Error 1
make[5]: *** [../scripts/Makefile.build:556: arch/powerpc/mm/book3s64] Error 2
IMO, we will need the following header in hash_tlb.c
+#include <kunit/visibility.h>
-ritesh
>
> Andrew, please add this patch just before the last patch in the series
> ("mm: Add basic tests for lazy_mmu"). Thanks!
> ---
> arch/powerpc/mm/book3s64/hash_tlb.c | 2 ++
> 1 file changed, 2 insertions(+)
>
> diff --git a/arch/powerpc/mm/book3s64/hash_tlb.c b/arch/powerpc/mm/book3s64/hash_tlb.c
> index fbdeb8981ae7..9e622519a423 100644
> --- a/arch/powerpc/mm/book3s64/hash_tlb.c
> +++ b/arch/powerpc/mm/book3s64/hash_tlb.c
> @@ -30,6 +30,7 @@
> #include <trace/events/thp.h>
>
> DEFINE_PER_CPU(struct ppc64_tlb_batch, ppc64_tlb_batch);
> +EXPORT_SYMBOL_IF_KUNIT(ppc64_tlb_batch); /* For lazy_mmu_mode KUnit tests */
>
> /*
> * 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); /* For lazy_mmu_mode KUnit tests */
>
> void hash__tlb_flush(struct mmu_gather *tlb)
> {
>
> base-commit: 8f0b4cce4481fb22653697cced8d0d04027cb1e8
> --
> 2.51.2
On Wed, 17 Dec 2025 22:15:16 +0530 Ritesh Harjani (IBM) <ritesh.list@gmail.com> wrote: > ../arch/powerpc/mm/book3s64/hash_tlb.c:158:1: error: type defaults to ‘int’ in declaration of ‘EXPORT_SYMBOL_IF_KUNIT’ [-Werror=implicit-int] > ../arch/powerpc/mm/book3s64/hash_tlb.c:158:1: error: parameter names (without types) in function declaration [-Werror] > AR init/built-in.a > cc1: all warnings being treated as errors > make[6]: *** [../scripts/Makefile.build:287: arch/powerpc/mm/book3s64/hash_tlb.o] Error 1 > make[5]: *** [../scripts/Makefile.build:556: arch/powerpc/mm/book3s64] Error 2 > > > IMO, we will need the following header in hash_tlb.c > > +#include <kunit/visibility.h> Yeah, I already added Ritesh's patch which had this include, so I think we're all good now.
On 17/12/2025 18:30, Andrew Morton wrote: > On Wed, 17 Dec 2025 22:15:16 +0530 Ritesh Harjani (IBM) <ritesh.list@gmail.com> wrote: > >> ../arch/powerpc/mm/book3s64/hash_tlb.c:158:1: error: type defaults to ‘int’ in declaration of ‘EXPORT_SYMBOL_IF_KUNIT’ [-Werror=implicit-int] >> ../arch/powerpc/mm/book3s64/hash_tlb.c:158:1: error: parameter names (without types) in function declaration [-Werror] >> AR init/built-in.a >> cc1: all warnings being treated as errors >> make[6]: *** [../scripts/Makefile.build:287: arch/powerpc/mm/book3s64/hash_tlb.o] Error 1 >> make[5]: *** [../scripts/Makefile.build:556: arch/powerpc/mm/book3s64] Error 2 >> >> >> IMO, we will need the following header in hash_tlb.c >> >> +#include <kunit/visibility.h> Ha strange it built fine for me without it... Maybe different config options. > Yeah, I already added Ritesh's patch which had this include, so I > think we're all good now. Great thanks both! - Kevin
Add MODULE_IMPORT_NS() for symbols referenced on powerpc.
Signed-off-by: Kevin Brodsky <kevin.brodsky@arm.com>
---
Andrew, please squash this into the last patch in the series
("mm: Add basic tests for lazy_mmu"). Thanks!
---
mm/tests/lazy_mmu_mode_kunit.c | 3 +++
1 file changed, 3 insertions(+)
diff --git a/mm/tests/lazy_mmu_mode_kunit.c b/mm/tests/lazy_mmu_mode_kunit.c
index 2720eb995714..1c23456b467e 100644
--- a/mm/tests/lazy_mmu_mode_kunit.c
+++ b/mm/tests/lazy_mmu_mode_kunit.c
@@ -2,6 +2,9 @@
#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());
base-commit: 8f0b4cce4481fb22653697cced8d0d04027cb1e8
--
2.51.2
© 2016 - 2026 Red Hat, Inc.