Hi Lorenzo,

On Thu, Mar 19, 2026 at 06:23:39PM +0000, Lorenzo Stoakes (Oracle) wrote:
> A user can invoke mmap_action_map_kernel_pages() to specify that the
> mapping should map kernel pages starting from desc->start of a specified
> number of pages specified in an array.
> 
> In order to implement this, adjust mmap_action_prepare() to be able to
> return an error code, as it makes sense to assert that the specified
> parameters are valid as quickly as possible as well as updating the VMA
> flags to include VMA_MIXEDMAP_BIT as necessary.
> 
> This provides an mmap_prepare equivalent of vm_insert_pages().  We
> additionally update the existing vm_insert_pages() code to use
> range_in_vma() and add a new range_in_vma_desc() helper function for the
> mmap_prepare case, sharing the code between the two in range_is_subset().
> 
> We add both mmap_action_map_kernel_pages() and
> mmap_action_map_kernel_pages_full() to allow for both partial and full VMA
> mappings.
> 
> We update the documentation to reflect the new features.
> 
> Finally, we update the VMA tests accordingly to reflect the changes.
> 
> Reviewed-by: Suren Baghdasaryan <[email protected]>
> Signed-off-by: Lorenzo Stoakes (Oracle) <[email protected]>
...
> diff --git a/mm/util.c b/mm/util.c
> index 8cf59267a9ac..682d0d24e1c6 100644
> --- a/mm/util.c
> +++ b/mm/util.c
> @@ -1446,6 +1446,8 @@ int mmap_action_prepare(struct vm_area_desc *desc)
>               return io_remap_pfn_range_prepare(desc);
>       case MMAP_SIMPLE_IO_REMAP:
>               return simple_ioremap_prepare(desc);
> +     case MMAP_MAP_KERNEL_PAGES:
> +             return map_kernel_pages_prepare(desc);
>       }
>  
>       WARN_ON_ONCE(1);
> @@ -1476,6 +1478,9 @@ int mmap_action_complete(struct vm_area_struct *vma,
>       case MMAP_REMAP_PFN:
>               err = remap_pfn_range_complete(vma, action);
>               break;
> +     case MMAP_MAP_KERNEL_PAGES:
> +             err = map_kernel_pages_complete(vma, action);
> +             break;
>       case MMAP_IO_REMAP_PFN:
>       case MMAP_SIMPLE_IO_REMAP:
>               /* Should have been delegated. */
> @@ -1497,6 +1502,7 @@ int mmap_action_prepare(struct vm_area_desc *desc)
>       case MMAP_REMAP_PFN:
>       case MMAP_IO_REMAP_PFN:
>       case MMAP_SIMPLE_IO_REMAP:
> +     case MMAP_MAP_KERNEL_PAGES:
>               WARN_ON_ONCE(1); /* nommu cannot handle these. */
>               break;
>       }

Not sure if it has been reported/addressed yet but it looks like
mmap_action_complete() was missed here, as pointed out by clang:

  $ make -skj"$(nproc)" ARCH=arm LLVM=1 mrproper allnoconfig mm/util.o
  mm/util.c:1520:10: warning: enumeration value 'MMAP_MAP_KERNEL_PAGES' not 
handled in switch [-Wswitch]
   1520 |         switch (action->type) {
        |                 ^~~~~~~~~~~~

I assume

diff --git a/mm/util.c b/mm/util.c
index 682d0d24e1c6..c41c119a5a74 100644
--- a/mm/util.c
+++ b/mm/util.c
@@ -1523,6 +1523,7 @@ int mmap_action_complete(struct vm_area_struct *vma,
        case MMAP_REMAP_PFN:
        case MMAP_IO_REMAP_PFN:
        case MMAP_SIMPLE_IO_REMAP:
+       case MMAP_MAP_KERNEL_PAGES:
                WARN_ON_ONCE(1); /* nommu cannot handle this. */
 
                err = -EINVAL;
--

should be the fix?

Cheers,
Nathan

Reply via email to