* [PATCH v2 2/2] selftests/mm: verify droppable mappings cannot be locked
2026-03-10 15:58 [PATCH v2 1/2] mm: prevent droppable mappings from being locked Anthony Yznaga
@ 2026-03-10 15:58 ` Anthony Yznaga
2026-03-11 9:56 ` Pedro Falcato
2026-03-11 11:25 ` Lorenzo Stoakes (Oracle)
2026-03-11 9:27 ` [PATCH v2 1/2] mm: prevent droppable mappings from being locked David Hildenbrand (Arm)
` (2 subsequent siblings)
3 siblings, 2 replies; 12+ messages in thread
From: Anthony Yznaga @ 2026-03-10 15:58 UTC (permalink / raw)
To: linux-mm, linux-kernel, linux-kselftest
Cc: akpm, david, ljs, Liam.Howlett, vbabka, rppt, surenb, mhocko,
jannh, pfalcato, Jason, shuah
Verify that a mapping created with MAP_DROPPABLE cannot be locked
via mlock(), and that it will not be locked if it's created after
mlockall(MCL_FUTURE).
Signed-off-by: Anthony Yznaga <anthony.yznaga@oracle.com>
---
tools/testing/selftests/mm/mlock2-tests.c | 78 ++++++++++++++++++++---
1 file changed, 69 insertions(+), 9 deletions(-)
diff --git a/tools/testing/selftests/mm/mlock2-tests.c b/tools/testing/selftests/mm/mlock2-tests.c
index b474f2b20def..b5790e717dd6 100644
--- a/tools/testing/selftests/mm/mlock2-tests.c
+++ b/tools/testing/selftests/mm/mlock2-tests.c
@@ -1,6 +1,7 @@
// SPDX-License-Identifier: GPL-2.0
#define _GNU_SOURCE
#include <sys/mman.h>
+#include <linux/mman.h>
#include <stdint.h>
#include <unistd.h>
#include <string.h>
@@ -163,14 +164,17 @@ static int lock_check(unsigned long addr)
return (vma_rss == vma_size);
}
-static int unlock_lock_check(char *map)
+static int unlock_lock_check(char *map, bool mlock_supported)
{
- if (is_vmflag_set((unsigned long)map, LOCKED)) {
+ if (!is_vmflag_set((unsigned long)map, LOCKED))
+ return 0;
+
+ if (mlock_supported)
ksft_print_msg("VMA flag %s is present on page 1 after unlock\n", LOCKED);
- return 1;
- }
+ else
+ ksft_print_msg("VMA flag %s is present on an unsupported VMA\n", LOCKED);
- return 0;
+ return 1;
}
static void test_mlock_lock(void)
@@ -196,7 +200,7 @@ static void test_mlock_lock(void)
ksft_exit_fail_msg("munlock(): %s\n", strerror(errno));
}
- ksft_test_result(!unlock_lock_check(map), "%s: Unlocked\n", __func__);
+ ksft_test_result(!unlock_lock_check(map, true), "%s: Unlocked\n", __func__);
munmap(map, 2 * page_size);
}
@@ -296,7 +300,7 @@ static void test_munlockall0(void)
ksft_exit_fail_msg("munlockall(): %s\n", strerror(errno));
}
- ksft_test_result(!unlock_lock_check(map), "%s: No locked memory\n", __func__);
+ ksft_test_result(!unlock_lock_check(map, true), "%s: No locked memory\n", __func__);
munmap(map, 2 * page_size);
}
@@ -336,7 +340,61 @@ static void test_munlockall1(void)
ksft_exit_fail_msg("munlockall() %s\n", strerror(errno));
}
- ksft_test_result(!unlock_lock_check(map), "%s: No locked memory\n", __func__);
+ ksft_test_result(!unlock_lock_check(map, true), "%s: No locked memory\n", __func__);
+ munmap(map, 2 * page_size);
+}
+
+/*
+ * Droppable memory should not be lockable.
+ */
+static void test_mlock_droppable(void)
+{
+ char *map;
+ unsigned long page_size = getpagesize();
+
+ /*
+ * Ensure MCL_FUTURE is not set.
+ */
+ if (mlockall(MCL_CURRENT))
+ ksft_exit_fail_msg("mlockall(MCL_CURRENT): %s\n", strerror(errno));
+ if (munlockall())
+ ksft_exit_fail_msg("munlockall() %s\n", strerror(errno));
+
+ map = mmap(NULL, 2 * page_size, PROT_READ | PROT_WRITE,
+ MAP_ANONYMOUS | MAP_DROPPABLE, -1, 0);
+ if (map == MAP_FAILED)
+ ksft_exit_fail_msg("mmap error: %s", strerror(errno));
+
+ if (mlock2_(map, 2 * page_size, 0)) {
+ munmap(map, 2 * page_size);
+ ksft_exit_fail_msg("mlock2(0): %s\n", strerror(errno));
+ }
+
+ ksft_test_result(!unlock_lock_check(map, false), "%s: droppable memory not locked\n",
+ __func__);
+
+ munmap(map, 2 * page_size);
+}
+
+static void test_mlockall_future_droppable(void)
+{
+ char *map;
+ unsigned long page_size = getpagesize();
+
+ if (mlockall(MCL_CURRENT | MCL_FUTURE))
+ ksft_exit_fail_msg("mlockall(MCL_CURRENT | MCL_FUTURE): %s\n", strerror(errno));
+
+ map = mmap(NULL, 2 * page_size, PROT_READ | PROT_WRITE,
+ MAP_ANONYMOUS | MAP_DROPPABLE, -1, 0);
+
+ ksft_test_result(!unlock_lock_check(map, false), "%s: droppable memory not locked\n",
+ __func__);
+
+ if (munlockall()) {
+ munmap(map, 2 * page_size);
+ ksft_exit_fail_msg("munlockall() %s\n", strerror(errno));
+ }
+
munmap(map, 2 * page_size);
}
@@ -442,7 +500,7 @@ int main(int argc, char **argv)
munmap(map, size);
- ksft_set_plan(13);
+ ksft_set_plan(15);
test_mlock_lock();
test_mlock_onfault();
@@ -451,6 +509,8 @@ int main(int argc, char **argv)
test_lock_onfault_of_present();
test_vma_management(true);
test_mlockall();
+ test_mlock_droppable();
+ test_mlockall_future_droppable();
ksft_finished();
}
--
2.47.3
^ permalink raw reply related [flat|nested] 12+ messages in thread* Re: [PATCH v2 2/2] selftests/mm: verify droppable mappings cannot be locked
2026-03-10 15:58 ` [PATCH v2 2/2] selftests/mm: verify droppable mappings cannot be locked Anthony Yznaga
@ 2026-03-11 9:56 ` Pedro Falcato
2026-03-11 11:25 ` Lorenzo Stoakes (Oracle)
1 sibling, 0 replies; 12+ messages in thread
From: Pedro Falcato @ 2026-03-11 9:56 UTC (permalink / raw)
To: Anthony Yznaga
Cc: linux-mm, linux-kernel, linux-kselftest, akpm, david, ljs,
Liam.Howlett, vbabka, rppt, surenb, mhocko, jannh, Jason, shuah
On Tue, Mar 10, 2026 at 08:58:21AM -0700, Anthony Yznaga wrote:
> Verify that a mapping created with MAP_DROPPABLE cannot be locked
> via mlock(), and that it will not be locked if it's created after
> mlockall(MCL_FUTURE).
>
> Signed-off-by: Anthony Yznaga <anthony.yznaga@oracle.com>
Acked-by: Pedro Falcato <pfalcato@suse.de>
--
Pedro
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v2 2/2] selftests/mm: verify droppable mappings cannot be locked
2026-03-10 15:58 ` [PATCH v2 2/2] selftests/mm: verify droppable mappings cannot be locked Anthony Yznaga
2026-03-11 9:56 ` Pedro Falcato
@ 2026-03-11 11:25 ` Lorenzo Stoakes (Oracle)
1 sibling, 0 replies; 12+ messages in thread
From: Lorenzo Stoakes (Oracle) @ 2026-03-11 11:25 UTC (permalink / raw)
To: Anthony Yznaga
Cc: linux-mm, linux-kernel, linux-kselftest, akpm, david,
Liam.Howlett, vbabka, rppt, surenb, mhocko, jannh, pfalcato,
Jason, shuah
On Tue, Mar 10, 2026 at 08:58:21AM -0700, Anthony Yznaga wrote:
> Verify that a mapping created with MAP_DROPPABLE cannot be locked
> via mlock(), and that it will not be locked if it's created after
> mlockall(MCL_FUTURE).
>
> Signed-off-by: Anthony Yznaga <anthony.yznaga@oracle.com>
Can confirm this test fails before your patch and passes after, so LGTM :)
Reviewed-by: Lorenzo Stoakes (Oracle) <ljs@kernel.org>
Tested-by: Lorenzo Stoakes (Oracle) <ljs@kernel.org>
> ---
> tools/testing/selftests/mm/mlock2-tests.c | 78 ++++++++++++++++++++---
> 1 file changed, 69 insertions(+), 9 deletions(-)
>
> diff --git a/tools/testing/selftests/mm/mlock2-tests.c b/tools/testing/selftests/mm/mlock2-tests.c
> index b474f2b20def..b5790e717dd6 100644
> --- a/tools/testing/selftests/mm/mlock2-tests.c
> +++ b/tools/testing/selftests/mm/mlock2-tests.c
> @@ -1,6 +1,7 @@
> // SPDX-License-Identifier: GPL-2.0
> #define _GNU_SOURCE
> #include <sys/mman.h>
> +#include <linux/mman.h>
> #include <stdint.h>
> #include <unistd.h>
> #include <string.h>
> @@ -163,14 +164,17 @@ static int lock_check(unsigned long addr)
> return (vma_rss == vma_size);
> }
>
> -static int unlock_lock_check(char *map)
> +static int unlock_lock_check(char *map, bool mlock_supported)
> {
> - if (is_vmflag_set((unsigned long)map, LOCKED)) {
> + if (!is_vmflag_set((unsigned long)map, LOCKED))
> + return 0;
> +
> + if (mlock_supported)
> ksft_print_msg("VMA flag %s is present on page 1 after unlock\n", LOCKED);
> - return 1;
> - }
> + else
> + ksft_print_msg("VMA flag %s is present on an unsupported VMA\n", LOCKED);
>
> - return 0;
> + return 1;
> }
>
> static void test_mlock_lock(void)
> @@ -196,7 +200,7 @@ static void test_mlock_lock(void)
> ksft_exit_fail_msg("munlock(): %s\n", strerror(errno));
> }
>
> - ksft_test_result(!unlock_lock_check(map), "%s: Unlocked\n", __func__);
> + ksft_test_result(!unlock_lock_check(map, true), "%s: Unlocked\n", __func__);
> munmap(map, 2 * page_size);
> }
>
> @@ -296,7 +300,7 @@ static void test_munlockall0(void)
> ksft_exit_fail_msg("munlockall(): %s\n", strerror(errno));
> }
>
> - ksft_test_result(!unlock_lock_check(map), "%s: No locked memory\n", __func__);
> + ksft_test_result(!unlock_lock_check(map, true), "%s: No locked memory\n", __func__);
> munmap(map, 2 * page_size);
> }
>
> @@ -336,7 +340,61 @@ static void test_munlockall1(void)
> ksft_exit_fail_msg("munlockall() %s\n", strerror(errno));
> }
>
> - ksft_test_result(!unlock_lock_check(map), "%s: No locked memory\n", __func__);
> + ksft_test_result(!unlock_lock_check(map, true), "%s: No locked memory\n", __func__);
> + munmap(map, 2 * page_size);
> +}
> +
> +/*
> + * Droppable memory should not be lockable.
> + */
> +static void test_mlock_droppable(void)
> +{
> + char *map;
> + unsigned long page_size = getpagesize();
> +
> + /*
> + * Ensure MCL_FUTURE is not set.
> + */
> + if (mlockall(MCL_CURRENT))
> + ksft_exit_fail_msg("mlockall(MCL_CURRENT): %s\n", strerror(errno));
> + if (munlockall())
> + ksft_exit_fail_msg("munlockall() %s\n", strerror(errno));
> +
> + map = mmap(NULL, 2 * page_size, PROT_READ | PROT_WRITE,
> + MAP_ANONYMOUS | MAP_DROPPABLE, -1, 0);
> + if (map == MAP_FAILED)
> + ksft_exit_fail_msg("mmap error: %s", strerror(errno));
> +
> + if (mlock2_(map, 2 * page_size, 0)) {
> + munmap(map, 2 * page_size);
> + ksft_exit_fail_msg("mlock2(0): %s\n", strerror(errno));
> + }
> +
> + ksft_test_result(!unlock_lock_check(map, false), "%s: droppable memory not locked\n",
> + __func__);
> +
> + munmap(map, 2 * page_size);
> +}
> +
> +static void test_mlockall_future_droppable(void)
> +{
> + char *map;
> + unsigned long page_size = getpagesize();
> +
> + if (mlockall(MCL_CURRENT | MCL_FUTURE))
> + ksft_exit_fail_msg("mlockall(MCL_CURRENT | MCL_FUTURE): %s\n", strerror(errno));
> +
> + map = mmap(NULL, 2 * page_size, PROT_READ | PROT_WRITE,
> + MAP_ANONYMOUS | MAP_DROPPABLE, -1, 0);
> +
> + ksft_test_result(!unlock_lock_check(map, false), "%s: droppable memory not locked\n",
> + __func__);
> +
> + if (munlockall()) {
> + munmap(map, 2 * page_size);
> + ksft_exit_fail_msg("munlockall() %s\n", strerror(errno));
> + }
> +
> munmap(map, 2 * page_size);
> }
>
> @@ -442,7 +500,7 @@ int main(int argc, char **argv)
>
> munmap(map, size);
>
> - ksft_set_plan(13);
> + ksft_set_plan(15);
>
> test_mlock_lock();
> test_mlock_onfault();
> @@ -451,6 +509,8 @@ int main(int argc, char **argv)
> test_lock_onfault_of_present();
> test_vma_management(true);
> test_mlockall();
> + test_mlock_droppable();
> + test_mlockall_future_droppable();
>
> ksft_finished();
> }
> --
> 2.47.3
>
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v2 1/2] mm: prevent droppable mappings from being locked
2026-03-10 15:58 [PATCH v2 1/2] mm: prevent droppable mappings from being locked Anthony Yznaga
2026-03-10 15:58 ` [PATCH v2 2/2] selftests/mm: verify droppable mappings cannot be locked Anthony Yznaga
@ 2026-03-11 9:27 ` David Hildenbrand (Arm)
2026-03-12 2:01 ` anthony.yznaga
2026-03-11 9:54 ` Pedro Falcato
2026-03-11 10:36 ` Lorenzo Stoakes (Oracle)
3 siblings, 1 reply; 12+ messages in thread
From: David Hildenbrand (Arm) @ 2026-03-11 9:27 UTC (permalink / raw)
To: Anthony Yznaga, linux-mm, linux-kernel, linux-kselftest
Cc: akpm, ljs, Liam.Howlett, vbabka, rppt, surenb, mhocko, jannh,
pfalcato, Jason, shuah
On 3/10/26 16:58, Anthony Yznaga wrote:
> Droppable mappings must not be lockable. There is a check for VMAs with
> VM_DROPPABLE set in mlock_fixup() along with checks for other types of
> unlockable VMAs which ensures this when calling mlock()/mlock2().
>
> For mlockall(MCL_FUTURE), the check for unlockable VMAs is different.
> In apply_mlockall_flags(), if the flags parameter has MCL_FUTURE set, the
> current task's mm's default VMA flag field mm->def_flags has VM_LOCKED
> applied to it. VM_LOCKONFAULT is also applied if MCL_ONFAULT is also set.
> When these flags are set as default in this manner they are cleared in
> __mmap_complete() for new mappings that do not support mlock. A check for
> VM_DROPPABLE in __mmap_complete() is missing resulting in droppable
> mappings created with VM_LOCKED set. To fix this and reduce that chance of
> similar bugs in the future, introduce and use vma_supports_mlock().
>
> Fixes: 9651fcedf7b9 ("mm: add MAP_DROPPABLE for designating always lazily freeable mappings")
Should we Cc: stable? I think we should, to fix mlockall(MCL_FUTURE)
behavior.
> Suggested-by: David Hildenbrand <david@kernel.org>
> Signed-off-by: Anthony Yznaga <anthony.yznaga@oracle.com>
> ---
> v2:
> - Implement vma_supports_mlock() instead of vma flags mask (DavidH)
> - Add selftests (Lorenzo)
>
> include/linux/hugetlb_inline.h | 2 +-
> mm/internal.h | 10 ++++++++++
> mm/mlock.c | 10 ++++++----
> mm/vma.c | 4 +---
> tools/testing/vma/include/stubs.h | 5 +++++
> 5 files changed, 23 insertions(+), 8 deletions(-)
>
> diff --git a/include/linux/hugetlb_inline.h b/include/linux/hugetlb_inline.h
> index 593f5d4e108b..755281fab23d 100644
> --- a/include/linux/hugetlb_inline.h
> +++ b/include/linux/hugetlb_inline.h
> @@ -30,7 +30,7 @@ static inline bool is_vma_hugetlb_flags(const vma_flags_t *flags)
>
> #endif
>
> -static inline bool is_vm_hugetlb_page(struct vm_area_struct *vma)
> +static inline bool is_vm_hugetlb_page(const struct vm_area_struct *vma)
> {
> return is_vm_hugetlb_flags(vma->vm_flags);
> }
> diff --git a/mm/internal.h b/mm/internal.h
> index cb0af847d7d9..8c67637abcdd 100644
> --- a/mm/internal.h
> +++ b/mm/internal.h
> @@ -1218,6 +1218,16 @@ static inline struct file *maybe_unlock_mmap_for_io(struct vm_fault *vmf,
> }
> return fpin;
> }
> +
> +static inline bool vma_supports_mlock(const struct vm_area_struct *vma)
> +{
> + if (vma->vm_flags & (VM_SPECIAL | VM_DROPPABLE))
> + return false;
> + if (vma_is_dax(vma) || is_vm_hugetlb_page(vma))
> + return false;
> + return vma != get_gate_vma(current->mm);
As discussed, it would be great to find out whether checking
get_gate_vma() makes any sense here. Likely not. :)
Acked-by: David Hildenbrand (Arm) <david@kernel.org>
--
Cheers,
David
^ permalink raw reply [flat|nested] 12+ messages in thread* Re: [PATCH v2 1/2] mm: prevent droppable mappings from being locked
2026-03-11 9:27 ` [PATCH v2 1/2] mm: prevent droppable mappings from being locked David Hildenbrand (Arm)
@ 2026-03-12 2:01 ` anthony.yznaga
2026-03-12 8:55 ` David Hildenbrand (Arm)
0 siblings, 1 reply; 12+ messages in thread
From: anthony.yznaga @ 2026-03-12 2:01 UTC (permalink / raw)
To: David Hildenbrand (Arm), linux-mm, linux-kernel, linux-kselftest
Cc: akpm, ljs, Liam.Howlett, vbabka, rppt, surenb, mhocko, jannh,
pfalcato, Jason, shuah
On 3/11/26 2:27 AM, David Hildenbrand (Arm) wrote:
> On 3/10/26 16:58, Anthony Yznaga wrote:
>> Droppable mappings must not be lockable. There is a check for VMAs with
>> VM_DROPPABLE set in mlock_fixup() along with checks for other types of
>> unlockable VMAs which ensures this when calling mlock()/mlock2().
>>
>> For mlockall(MCL_FUTURE), the check for unlockable VMAs is different.
>> In apply_mlockall_flags(), if the flags parameter has MCL_FUTURE set, the
>> current task's mm's default VMA flag field mm->def_flags has VM_LOCKED
>> applied to it. VM_LOCKONFAULT is also applied if MCL_ONFAULT is also set.
>> When these flags are set as default in this manner they are cleared in
>> __mmap_complete() for new mappings that do not support mlock. A check for
>> VM_DROPPABLE in __mmap_complete() is missing resulting in droppable
>> mappings created with VM_LOCKED set. To fix this and reduce that chance of
>> similar bugs in the future, introduce and use vma_supports_mlock().
>>
>> Fixes: 9651fcedf7b9 ("mm: add MAP_DROPPABLE for designating always lazily freeable mappings")
> Should we Cc: stable? I think we should, to fix mlockall(MCL_FUTURE)
> behavior.
I found this issue through code inspection while doing mshare dev work.
I don't have a strong idea how likely it is to happen in practice. If it
did it might not be easily diagnosed so I'm fine adding the tag.
>
>> Suggested-by: David Hildenbrand <david@kernel.org>
>> Signed-off-by: Anthony Yznaga <anthony.yznaga@oracle.com>
>> ---
>> v2:
>> - Implement vma_supports_mlock() instead of vma flags mask (DavidH)
>> - Add selftests (Lorenzo)
>>
>> include/linux/hugetlb_inline.h | 2 +-
>> mm/internal.h | 10 ++++++++++
>> mm/mlock.c | 10 ++++++----
>> mm/vma.c | 4 +---
>> tools/testing/vma/include/stubs.h | 5 +++++
>> 5 files changed, 23 insertions(+), 8 deletions(-)
>>
>> diff --git a/include/linux/hugetlb_inline.h b/include/linux/hugetlb_inline.h
>> index 593f5d4e108b..755281fab23d 100644
>> --- a/include/linux/hugetlb_inline.h
>> +++ b/include/linux/hugetlb_inline.h
>> @@ -30,7 +30,7 @@ static inline bool is_vma_hugetlb_flags(const vma_flags_t *flags)
>>
>> #endif
>>
>> -static inline bool is_vm_hugetlb_page(struct vm_area_struct *vma)
>> +static inline bool is_vm_hugetlb_page(const struct vm_area_struct *vma)
>> {
>> return is_vm_hugetlb_flags(vma->vm_flags);
>> }
>> diff --git a/mm/internal.h b/mm/internal.h
>> index cb0af847d7d9..8c67637abcdd 100644
>> --- a/mm/internal.h
>> +++ b/mm/internal.h
>> @@ -1218,6 +1218,16 @@ static inline struct file *maybe_unlock_mmap_for_io(struct vm_fault *vmf,
>> }
>> return fpin;
>> }
>> +
>> +static inline bool vma_supports_mlock(const struct vm_area_struct *vma)
>> +{
>> + if (vma->vm_flags & (VM_SPECIAL | VM_DROPPABLE))
>> + return false;
>> + if (vma_is_dax(vma) || is_vm_hugetlb_page(vma))
>> + return false;
>> + return vma != get_gate_vma(current->mm);
> As discussed, it would be great to find out whether checking
> get_gate_vma() makes any sense here. Likely not. :)
I do think the get_gate_vma() check can go away, but I figured that was
better done in a separate patch. Is that better done as a separate
submission or should I tack on patches to this series?
> Acked-by: David Hildenbrand (Arm) <david@kernel.org>
>
^ permalink raw reply [flat|nested] 12+ messages in thread* Re: [PATCH v2 1/2] mm: prevent droppable mappings from being locked
2026-03-12 2:01 ` anthony.yznaga
@ 2026-03-12 8:55 ` David Hildenbrand (Arm)
0 siblings, 0 replies; 12+ messages in thread
From: David Hildenbrand (Arm) @ 2026-03-12 8:55 UTC (permalink / raw)
To: anthony.yznaga, linux-mm, linux-kernel, linux-kselftest
Cc: akpm, ljs, Liam.Howlett, vbabka, rppt, surenb, mhocko, jannh,
pfalcato, Jason, shuah
On 3/12/26 03:01, anthony.yznaga@oracle.com wrote:
>
> On 3/11/26 2:27 AM, David Hildenbrand (Arm) wrote:
>> On 3/10/26 16:58, Anthony Yznaga wrote:
>>> Droppable mappings must not be lockable. There is a check for VMAs with
>>> VM_DROPPABLE set in mlock_fixup() along with checks for other types of
>>> unlockable VMAs which ensures this when calling mlock()/mlock2().
>>>
>>> For mlockall(MCL_FUTURE), the check for unlockable VMAs is different.
>>> In apply_mlockall_flags(), if the flags parameter has MCL_FUTURE set,
>>> the
>>> current task's mm's default VMA flag field mm->def_flags has VM_LOCKED
>>> applied to it. VM_LOCKONFAULT is also applied if MCL_ONFAULT is also
>>> set.
>>> When these flags are set as default in this manner they are cleared in
>>> __mmap_complete() for new mappings that do not support mlock. A check
>>> for
>>> VM_DROPPABLE in __mmap_complete() is missing resulting in droppable
>>> mappings created with VM_LOCKED set. To fix this and reduce that
>>> chance of
>>> similar bugs in the future, introduce and use vma_supports_mlock().
>>>
>>> Fixes: 9651fcedf7b9 ("mm: add MAP_DROPPABLE for designating always
>>> lazily freeable mappings")
>> Should we Cc: stable? I think we should, to fix mlockall(MCL_FUTURE)
>> behavior.
>
> I found this issue through code inspection while doing mshare dev work.
> I don't have a strong idea how likely it is to happen in practice. If it
> did it might not be easily diagnosed so I'm fine adding the tag.
IIUC, mlockall(MCL_FUTURE) will result in future MAP_DROPPABLE mappings
to get mlocked. I assume that implies that all pages will get faulted in
and might not be reclaimable.
With a quick test program that mmaps 4M, we indeed fault in all these
pages (I assume you test does something similar).
7f5fc4600000-7f5fc4a00000 rw-p 00000000 00:00 0
Size: 4096 kB
KernelPageSize: 4 kB
MMUPageSize: 4 kB
Rss: 4096 kB
Pss: 4096 kB
Pss_Dirty: 4096 kB
Shared_Clean: 0 kB
Shared_Dirty: 0 kB
Private_Clean: 0 kB
Private_Dirty: 4096 kB
Referenced: 4096 kB
Anonymous: 4096 kB
KSM: 0 kB
LazyFree: 0 kB
AnonHugePages: 4096 kB
ShmemPmdMapped: 0 kB
FilePmdMapped: 0 kB
Shared_Hugetlb: 0 kB
Private_Hugetlb: 0 kB
Swap: 0 kB
SwapPss: 0 kB
Locked: 4096 kB
It's a good question whether memory reclaim would still be able to free
these pages. I'd assume the folios would get mlocked and essentially
turned unevictable -- breaking the whole concept of droppable mappings.
So I think we should CC stable.
--
Cheers,
David
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v2 1/2] mm: prevent droppable mappings from being locked
2026-03-10 15:58 [PATCH v2 1/2] mm: prevent droppable mappings from being locked Anthony Yznaga
2026-03-10 15:58 ` [PATCH v2 2/2] selftests/mm: verify droppable mappings cannot be locked Anthony Yznaga
2026-03-11 9:27 ` [PATCH v2 1/2] mm: prevent droppable mappings from being locked David Hildenbrand (Arm)
@ 2026-03-11 9:54 ` Pedro Falcato
2026-03-11 10:36 ` Lorenzo Stoakes (Oracle)
3 siblings, 0 replies; 12+ messages in thread
From: Pedro Falcato @ 2026-03-11 9:54 UTC (permalink / raw)
To: Anthony Yznaga
Cc: linux-mm, linux-kernel, linux-kselftest, akpm, david, ljs,
Liam.Howlett, vbabka, rppt, surenb, mhocko, jannh, Jason, shuah
On Tue, Mar 10, 2026 at 08:58:20AM -0700, Anthony Yznaga wrote:
> Droppable mappings must not be lockable. There is a check for VMAs with
> VM_DROPPABLE set in mlock_fixup() along with checks for other types of
> unlockable VMAs which ensures this when calling mlock()/mlock2().
>
> For mlockall(MCL_FUTURE), the check for unlockable VMAs is different.
> In apply_mlockall_flags(), if the flags parameter has MCL_FUTURE set, the
> current task's mm's default VMA flag field mm->def_flags has VM_LOCKED
> applied to it. VM_LOCKONFAULT is also applied if MCL_ONFAULT is also set.
> When these flags are set as default in this manner they are cleared in
> __mmap_complete() for new mappings that do not support mlock. A check for
> VM_DROPPABLE in __mmap_complete() is missing resulting in droppable
> mappings created with VM_LOCKED set. To fix this and reduce that chance of
> similar bugs in the future, introduce and use vma_supports_mlock().
>
> Fixes: 9651fcedf7b9 ("mm: add MAP_DROPPABLE for designating always lazily freeable mappings")
> Suggested-by: David Hildenbrand <david@kernel.org>
> Signed-off-by: Anthony Yznaga <anthony.yznaga@oracle.com>
Reviewed-by: Pedro Falcato <pfalcato@suse.de>
> ---
> v2:
> - Implement vma_supports_mlock() instead of vma flags mask (DavidH)
> - Add selftests (Lorenzo)
>
> include/linux/hugetlb_inline.h | 2 +-
> mm/internal.h | 10 ++++++++++
> mm/mlock.c | 10 ++++++----
> mm/vma.c | 4 +---
> tools/testing/vma/include/stubs.h | 5 +++++
> 5 files changed, 23 insertions(+), 8 deletions(-)
>
> diff --git a/include/linux/hugetlb_inline.h b/include/linux/hugetlb_inline.h
> index 593f5d4e108b..755281fab23d 100644
> --- a/include/linux/hugetlb_inline.h
> +++ b/include/linux/hugetlb_inline.h
> @@ -30,7 +30,7 @@ static inline bool is_vma_hugetlb_flags(const vma_flags_t *flags)
>
> #endif
>
> -static inline bool is_vm_hugetlb_page(struct vm_area_struct *vma)
> +static inline bool is_vm_hugetlb_page(const struct vm_area_struct *vma)
> {
> return is_vm_hugetlb_flags(vma->vm_flags);
> }
I don't like this. In case a future backport depends on the constification
of the is_vm_hugetlb_page() argument, they'll be hardpressed to bring the
whole patch in. But it looks like we're going to do it anyway...
--
Pedro
^ permalink raw reply [flat|nested] 12+ messages in thread* Re: [PATCH v2 1/2] mm: prevent droppable mappings from being locked
2026-03-10 15:58 [PATCH v2 1/2] mm: prevent droppable mappings from being locked Anthony Yznaga
` (2 preceding siblings ...)
2026-03-11 9:54 ` Pedro Falcato
@ 2026-03-11 10:36 ` Lorenzo Stoakes (Oracle)
2026-03-11 17:14 ` Andrew Morton
2026-03-12 2:16 ` anthony.yznaga
3 siblings, 2 replies; 12+ messages in thread
From: Lorenzo Stoakes (Oracle) @ 2026-03-11 10:36 UTC (permalink / raw)
To: Anthony Yznaga
Cc: linux-mm, linux-kernel, linux-kselftest, akpm, david,
Liam.Howlett, vbabka, rppt, surenb, mhocko, jannh, pfalcato,
Jason, shuah
On Tue, Mar 10, 2026 at 08:58:20AM -0700, Anthony Yznaga wrote:
> Droppable mappings must not be lockable. There is a check for VMAs with
> VM_DROPPABLE set in mlock_fixup() along with checks for other types of
> unlockable VMAs which ensures this when calling mlock()/mlock2().
>
> For mlockall(MCL_FUTURE), the check for unlockable VMAs is different.
> In apply_mlockall_flags(), if the flags parameter has MCL_FUTURE set, the
> current task's mm's default VMA flag field mm->def_flags has VM_LOCKED
> applied to it. VM_LOCKONFAULT is also applied if MCL_ONFAULT is also set.
> When these flags are set as default in this manner they are cleared in
> __mmap_complete() for new mappings that do not support mlock. A check for
> VM_DROPPABLE in __mmap_complete() is missing resulting in droppable
> mappings created with VM_LOCKED set. To fix this and reduce that chance of
> similar bugs in the future, introduce and use vma_supports_mlock().
>
> Fixes: 9651fcedf7b9 ("mm: add MAP_DROPPABLE for designating always lazily freeable mappings")
We should definitely cc: stable I think.
It might result in some backport pain since it'll probably pre-date the
__mmap_region() stuff :)) sorry.
> Suggested-by: David Hildenbrand <david@kernel.org>
> Signed-off-by: Anthony Yznaga <anthony.yznaga@oracle.com>
LGTM, so:
Reviewed-by: Lorenzo Stoakes (Oracle) <ljs@kernel.org>
> ---
> v2:
> - Implement vma_supports_mlock() instead of vma flags mask (DavidH)
> - Add selftests (Lorenzo)
I know it's a sort of subject thing, but please in future add a cover letter if
#patches > 1 :) thanks!
>
> include/linux/hugetlb_inline.h | 2 +-
> mm/internal.h | 10 ++++++++++
> mm/mlock.c | 10 ++++++----
> mm/vma.c | 4 +---
> tools/testing/vma/include/stubs.h | 5 +++++
> 5 files changed, 23 insertions(+), 8 deletions(-)
>
> diff --git a/include/linux/hugetlb_inline.h b/include/linux/hugetlb_inline.h
> index 593f5d4e108b..755281fab23d 100644
> --- a/include/linux/hugetlb_inline.h
> +++ b/include/linux/hugetlb_inline.h
> @@ -30,7 +30,7 @@ static inline bool is_vma_hugetlb_flags(const vma_flags_t *flags)
>
> #endif
>
> -static inline bool is_vm_hugetlb_page(struct vm_area_struct *vma)
> +static inline bool is_vm_hugetlb_page(const struct vm_area_struct *vma)
> {
> return is_vm_hugetlb_flags(vma->vm_flags);
> }
Ideally we'd use the new VMA flags approach, but I'll fix that later myself when
I make those changes.
> diff --git a/mm/internal.h b/mm/internal.h
> index cb0af847d7d9..8c67637abcdd 100644
> --- a/mm/internal.h
> +++ b/mm/internal.h
> @@ -1218,6 +1218,16 @@ static inline struct file *maybe_unlock_mmap_for_io(struct vm_fault *vmf,
> }
> return fpin;
> }
> +
> +static inline bool vma_supports_mlock(const struct vm_area_struct *vma)
> +{
> + if (vma->vm_flags & (VM_SPECIAL | VM_DROPPABLE))
> + return false;
> + if (vma_is_dax(vma) || is_vm_hugetlb_page(vma))
> + return false;
> + return vma != get_gate_vma(current->mm);
Honestly it's dumb that we don't have vma_is_gate(), I see arm32 have their own
is_gate_vma() macro, but we should really have one to avoid this noise :)
Anyway probably not worth it for this patch esp. if backporting.
Wonder if we should have vma_support_munlock() for secretmem ;) (again one for
another patch I guess).
> +}
> +
> #else /* !CONFIG_MMU */
> static inline void unmap_mapping_folio(struct folio *folio) { }
> static inline void mlock_new_folio(struct folio *folio) { }
> diff --git a/mm/mlock.c b/mm/mlock.c
> index 2f699c3497a5..73551c71cebf 100644
> --- a/mm/mlock.c
> +++ b/mm/mlock.c
> @@ -472,10 +472,12 @@ static int mlock_fixup(struct vma_iterator *vmi, struct vm_area_struct *vma,
> int ret = 0;
> vm_flags_t oldflags = vma->vm_flags;
>
> - if (newflags == oldflags || (oldflags & VM_SPECIAL) ||
> - is_vm_hugetlb_page(vma) || vma == get_gate_vma(current->mm) ||
> - vma_is_dax(vma) || vma_is_secretmem(vma) || (oldflags & VM_DROPPABLE))
> - /* don't set VM_LOCKED or VM_LOCKONFAULT and don't count */
> + if (newflags == oldflags || vma_is_secretmem(vma) ||
> + !vma_supports_mlock(vma))
> + /*
> + * Don't set VM_LOCKED or VM_LOCKONFAULT and don't count.
> + * For secretmem, don't allow the memory to be unlocked.
> + */
> goto out;
>
> vma = vma_modify_flags(vmi, *prev, vma, start, end, &newflags);
> diff --git a/mm/vma.c b/mm/vma.c
> index be64f781a3aa..18c3c5280748 100644
> --- a/mm/vma.c
> +++ b/mm/vma.c
> @@ -2589,9 +2589,7 @@ static void __mmap_complete(struct mmap_state *map, struct vm_area_struct *vma)
>
> vm_stat_account(mm, vma->vm_flags, map->pglen);
> if (vm_flags & VM_LOCKED) {
> - if ((vm_flags & VM_SPECIAL) || vma_is_dax(vma) ||
> - is_vm_hugetlb_page(vma) ||
> - vma == get_gate_vma(mm))
> + if (!vma_supports_mlock(vma))
> vm_flags_clear(vma, VM_LOCKED_MASK);
> else
> mm->locked_vm += map->pglen;
> diff --git a/tools/testing/vma/include/stubs.h b/tools/testing/vma/include/stubs.h
> index 947a3a0c2566..416bb93f5005 100644
> --- a/tools/testing/vma/include/stubs.h
> +++ b/tools/testing/vma/include/stubs.h
> @@ -426,3 +426,8 @@ static inline void vma_adjust_trans_huge(struct vm_area_struct *vma,
> }
>
> static inline void hugetlb_split(struct vm_area_struct *, unsigned long) {}
> +
> +static inline bool vma_supports_mlock(const struct vm_area_struct *vma)
> +{
> + return false;
> +}
Thanks :) tested locally and working fine.
> --
> 2.47.3
>
Cheers, Lorenzo
^ permalink raw reply [flat|nested] 12+ messages in thread* Re: [PATCH v2 1/2] mm: prevent droppable mappings from being locked
2026-03-11 10:36 ` Lorenzo Stoakes (Oracle)
@ 2026-03-11 17:14 ` Andrew Morton
2026-03-12 2:16 ` anthony.yznaga
1 sibling, 0 replies; 12+ messages in thread
From: Andrew Morton @ 2026-03-11 17:14 UTC (permalink / raw)
To: Lorenzo Stoakes (Oracle)
Cc: Anthony Yznaga, linux-mm, linux-kernel, linux-kselftest, david,
Liam.Howlett, vbabka, rppt, surenb, mhocko, jannh, pfalcato,
Jason, shuah
On Wed, 11 Mar 2026 10:36:26 +0000 "Lorenzo Stoakes (Oracle)" <ljs@kernel.org> wrote:
> On Tue, Mar 10, 2026 at 08:58:20AM -0700, Anthony Yznaga wrote:
> > Droppable mappings must not be lockable. There is a check for VMAs with
> > VM_DROPPABLE set in mlock_fixup() along with checks for other types of
> > unlockable VMAs which ensures this when calling mlock()/mlock2().
> >
> > For mlockall(MCL_FUTURE), the check for unlockable VMAs is different.
> > In apply_mlockall_flags(), if the flags parameter has MCL_FUTURE set, the
> > current task's mm's default VMA flag field mm->def_flags has VM_LOCKED
> > applied to it. VM_LOCKONFAULT is also applied if MCL_ONFAULT is also set.
> > When these flags are set as default in this manner they are cleared in
> > __mmap_complete() for new mappings that do not support mlock. A check for
> > VM_DROPPABLE in __mmap_complete() is missing resulting in droppable
> > mappings created with VM_LOCKED set. To fix this and reduce that chance of
> > similar bugs in the future, introduce and use vma_supports_mlock().
> >
> > Fixes: 9651fcedf7b9 ("mm: add MAP_DROPPABLE for designating always lazily freeable mappings")
>
> We should definitely cc: stable I think.
You know what I'm going to ask ;)
Why backport this? What effect does/might the bug have upon our users?
^ permalink raw reply [flat|nested] 12+ messages in thread* Re: [PATCH v2 1/2] mm: prevent droppable mappings from being locked
2026-03-11 10:36 ` Lorenzo Stoakes (Oracle)
2026-03-11 17:14 ` Andrew Morton
@ 2026-03-12 2:16 ` anthony.yznaga
2026-03-12 8:32 ` David Hildenbrand (Arm)
1 sibling, 1 reply; 12+ messages in thread
From: anthony.yznaga @ 2026-03-12 2:16 UTC (permalink / raw)
To: Lorenzo Stoakes (Oracle)
Cc: linux-mm, linux-kernel, linux-kselftest, akpm, david,
Liam.Howlett, vbabka, rppt, surenb, mhocko, jannh, pfalcato,
Jason, shuah
On 3/11/26 3:36 AM, Lorenzo Stoakes (Oracle) wrote:
> On Tue, Mar 10, 2026 at 08:58:20AM -0700, Anthony Yznaga wrote:
>> Droppable mappings must not be lockable. There is a check for VMAs with
>> VM_DROPPABLE set in mlock_fixup() along with checks for other types of
>> unlockable VMAs which ensures this when calling mlock()/mlock2().
>>
>> For mlockall(MCL_FUTURE), the check for unlockable VMAs is different.
>> In apply_mlockall_flags(), if the flags parameter has MCL_FUTURE set, the
>> current task's mm's default VMA flag field mm->def_flags has VM_LOCKED
>> applied to it. VM_LOCKONFAULT is also applied if MCL_ONFAULT is also set.
>> When these flags are set as default in this manner they are cleared in
>> __mmap_complete() for new mappings that do not support mlock. A check for
>> VM_DROPPABLE in __mmap_complete() is missing resulting in droppable
>> mappings created with VM_LOCKED set. To fix this and reduce that chance of
>> similar bugs in the future, introduce and use vma_supports_mlock().
>>
>> Fixes: 9651fcedf7b9 ("mm: add MAP_DROPPABLE for designating always lazily freeable mappings")
> We should definitely cc: stable I think.
>
> It might result in some backport pain since it'll probably pre-date the
> __mmap_region() stuff :)) sorry.
I could add a patch at the beginning that does the cheap fix followed by
this patch.
>
>> Suggested-by: David Hildenbrand <david@kernel.org>
>> Signed-off-by: Anthony Yznaga <anthony.yznaga@oracle.com>
> LGTM, so:
>
> Reviewed-by: Lorenzo Stoakes (Oracle) <ljs@kernel.org>
>
>> ---
>> v2:
>> - Implement vma_supports_mlock() instead of vma flags mask (DavidH)
>> - Add selftests (Lorenzo)
> I know it's a sort of subject thing, but please in future add a cover letter if
> #patches > 1 :) thanks!
Noted.
>
>> include/linux/hugetlb_inline.h | 2 +-
>> mm/internal.h | 10 ++++++++++
>> mm/mlock.c | 10 ++++++----
>> mm/vma.c | 4 +---
>> tools/testing/vma/include/stubs.h | 5 +++++
>> 5 files changed, 23 insertions(+), 8 deletions(-)
>>
>> diff --git a/include/linux/hugetlb_inline.h b/include/linux/hugetlb_inline.h
>> index 593f5d4e108b..755281fab23d 100644
>> --- a/include/linux/hugetlb_inline.h
>> +++ b/include/linux/hugetlb_inline.h
>> @@ -30,7 +30,7 @@ static inline bool is_vma_hugetlb_flags(const vma_flags_t *flags)
>>
>> #endif
>>
>> -static inline bool is_vm_hugetlb_page(struct vm_area_struct *vma)
>> +static inline bool is_vm_hugetlb_page(const struct vm_area_struct *vma)
>> {
>> return is_vm_hugetlb_flags(vma->vm_flags);
>> }
> Ideally we'd use the new VMA flags approach, but I'll fix that later myself when
> I make those changes.
>
>> diff --git a/mm/internal.h b/mm/internal.h
>> index cb0af847d7d9..8c67637abcdd 100644
>> --- a/mm/internal.h
>> +++ b/mm/internal.h
>> @@ -1218,6 +1218,16 @@ static inline struct file *maybe_unlock_mmap_for_io(struct vm_fault *vmf,
>> }
>> return fpin;
>> }
>> +
>> +static inline bool vma_supports_mlock(const struct vm_area_struct *vma)
>> +{
>> + if (vma->vm_flags & (VM_SPECIAL | VM_DROPPABLE))
>> + return false;
>> + if (vma_is_dax(vma) || is_vm_hugetlb_page(vma))
>> + return false;
>> + return vma != get_gate_vma(current->mm);
> Honestly it's dumb that we don't have vma_is_gate(), I see arm32 have their own
> is_gate_vma() macro, but we should really have one to avoid this noise :)
>
> Anyway probably not worth it for this patch esp. if backporting.
But in this case no check at all is needed.
Anthony
>
> Wonder if we should have vma_support_munlock() for secretmem ;) (again one for
> another patch I guess).
>
>> +}
>> +
>> #else /* !CONFIG_MMU */
>> static inline void unmap_mapping_folio(struct folio *folio) { }
>> static inline void mlock_new_folio(struct folio *folio) { }
>> diff --git a/mm/mlock.c b/mm/mlock.c
>> index 2f699c3497a5..73551c71cebf 100644
>> --- a/mm/mlock.c
>> +++ b/mm/mlock.c
>> @@ -472,10 +472,12 @@ static int mlock_fixup(struct vma_iterator *vmi, struct vm_area_struct *vma,
>> int ret = 0;
>> vm_flags_t oldflags = vma->vm_flags;
>>
>> - if (newflags == oldflags || (oldflags & VM_SPECIAL) ||
>> - is_vm_hugetlb_page(vma) || vma == get_gate_vma(current->mm) ||
>> - vma_is_dax(vma) || vma_is_secretmem(vma) || (oldflags & VM_DROPPABLE))
>> - /* don't set VM_LOCKED or VM_LOCKONFAULT and don't count */
>> + if (newflags == oldflags || vma_is_secretmem(vma) ||
>> + !vma_supports_mlock(vma))
>> + /*
>> + * Don't set VM_LOCKED or VM_LOCKONFAULT and don't count.
>> + * For secretmem, don't allow the memory to be unlocked.
>> + */
>> goto out;
>>
>> vma = vma_modify_flags(vmi, *prev, vma, start, end, &newflags);
>> diff --git a/mm/vma.c b/mm/vma.c
>> index be64f781a3aa..18c3c5280748 100644
>> --- a/mm/vma.c
>> +++ b/mm/vma.c
>> @@ -2589,9 +2589,7 @@ static void __mmap_complete(struct mmap_state *map, struct vm_area_struct *vma)
>>
>> vm_stat_account(mm, vma->vm_flags, map->pglen);
>> if (vm_flags & VM_LOCKED) {
>> - if ((vm_flags & VM_SPECIAL) || vma_is_dax(vma) ||
>> - is_vm_hugetlb_page(vma) ||
>> - vma == get_gate_vma(mm))
>> + if (!vma_supports_mlock(vma))
>> vm_flags_clear(vma, VM_LOCKED_MASK);
>> else
>> mm->locked_vm += map->pglen;
>> diff --git a/tools/testing/vma/include/stubs.h b/tools/testing/vma/include/stubs.h
>> index 947a3a0c2566..416bb93f5005 100644
>> --- a/tools/testing/vma/include/stubs.h
>> +++ b/tools/testing/vma/include/stubs.h
>> @@ -426,3 +426,8 @@ static inline void vma_adjust_trans_huge(struct vm_area_struct *vma,
>> }
>>
>> static inline void hugetlb_split(struct vm_area_struct *, unsigned long) {}
>> +
>> +static inline bool vma_supports_mlock(const struct vm_area_struct *vma)
>> +{
>> + return false;
>> +}
> Thanks :) tested locally and working fine.
>
>> --
>> 2.47.3
>>
> Cheers, Lorenzo
^ permalink raw reply [flat|nested] 12+ messages in thread* Re: [PATCH v2 1/2] mm: prevent droppable mappings from being locked
2026-03-12 2:16 ` anthony.yznaga
@ 2026-03-12 8:32 ` David Hildenbrand (Arm)
0 siblings, 0 replies; 12+ messages in thread
From: David Hildenbrand (Arm) @ 2026-03-12 8:32 UTC (permalink / raw)
To: anthony.yznaga, Lorenzo Stoakes (Oracle)
Cc: linux-mm, linux-kernel, linux-kselftest, akpm, Liam.Howlett,
vbabka, rppt, surenb, mhocko, jannh, pfalcato, Jason, shuah
On 3/12/26 03:16, anthony.yznaga@oracle.com wrote:
>
> On 3/11/26 3:36 AM, Lorenzo Stoakes (Oracle) wrote:
>> On Tue, Mar 10, 2026 at 08:58:20AM -0700, Anthony Yznaga wrote:
>>> Droppable mappings must not be lockable. There is a check for VMAs with
>>> VM_DROPPABLE set in mlock_fixup() along with checks for other types of
>>> unlockable VMAs which ensures this when calling mlock()/mlock2().
>>>
>>> For mlockall(MCL_FUTURE), the check for unlockable VMAs is different.
>>> In apply_mlockall_flags(), if the flags parameter has MCL_FUTURE set,
>>> the
>>> current task's mm's default VMA flag field mm->def_flags has VM_LOCKED
>>> applied to it. VM_LOCKONFAULT is also applied if MCL_ONFAULT is also
>>> set.
>>> When these flags are set as default in this manner they are cleared in
>>> __mmap_complete() for new mappings that do not support mlock. A check
>>> for
>>> VM_DROPPABLE in __mmap_complete() is missing resulting in droppable
>>> mappings created with VM_LOCKED set. To fix this and reduce that
>>> chance of
>>> similar bugs in the future, introduce and use vma_supports_mlock().
>>>
>>> Fixes: 9651fcedf7b9 ("mm: add MAP_DROPPABLE for designating always
>>> lazily freeable mappings")
>> We should definitely cc: stable I think.
>>
>> It might result in some backport pain since it'll probably pre-date the
>> __mmap_region() stuff :)) sorry.
>
> I could add a patch at the beginning that does the cheap fix followed by
> this patch.
Any backport conflicts should be easy and fast too resolve (if any). No
need to uglify our mainline patches :)
--
Cheers,
David
^ permalink raw reply [flat|nested] 12+ messages in thread