On Mon, Sep 14, 2026 at 3:21 PM Lorenzo Stoakes (ARM) <[email protected]> wrote: > > The bpf_map->ops->map_mmap callback invoked by bpf_map_mmap() can be set to > one of ringbuf_map_mmap_kern(), ringbuf_map_mmap_user(), array_map_mmap() > or arena_map_mmap(). > > It is convention in mm to mark mappings whose pages the kernel manages > itself with VM_MIXEDMAP, so the core mm knows not to treat them as ordinary > page cache or anonymous memory. > > The map_mmap callbacks ringbuf_map_mmap_kern() and ringbuf_map_mmap_user() > use remap_vmalloc_range(), which ultimately invokes vm_insert_page() and so > marks the ranges VM_MIXEDMAP, and array_map_mmap() sets VM_MIXEDMAP > explicitly. > > However, the exception to this is arena_map_mmap(), which doesn't set the > flag. > > This patch corrects this and updates the comment to reflect it. > > The pages are refcounted and vm_normal_page() finds them regardless of the > flag, and VM_DONTEXPAND remains set (marking the memory as VM_SPECIAL and > thus unmergeable). The one effect is that NUMA balancing now skips these > VMAs, as it already does for the other bpf map mappings, which is the > reason array_map_mmap() gives for setting the flag. > > The intent of this patch is to be able to establish the invariant that only > PFN-mapped or mixed map ranges may clear the VM_MAYWRITE flag, as is done > in bpf_map_mmap(). > > Signed-off-by: Lorenzo Stoakes (ARM) <[email protected]> > ---
Reviewed-by: Emil Tsalapatis <[email protected]> Dropped some CC's as Gmail is refusing to retain them in the response. > kernel/bpf/arena.c | 3 ++- > 1 file changed, 2 insertions(+), 1 deletion(-) > > diff --git a/kernel/bpf/arena.c b/kernel/bpf/arena.c > index 7b6847200b43..b69fe5e34339 100644 > --- a/kernel/bpf/arena.c > +++ b/kernel/bpf/arena.c > @@ -620,8 +620,9 @@ static int arena_map_mmap(struct bpf_map *map, struct > vm_area_struct *vma) > * clears VM_MAYEXEC. Set VM_DONTEXPAND to avoid potential change > * of user_vm_start. Set VM_DONTCOPY to prevent arena VMA from > * being copied into the child process on fork. > + * This is a kernel page so set VM_MIXEDMAP. > */ > - vm_flags_set(vma, VM_DONTEXPAND | VM_DONTCOPY); > + vm_flags_set(vma, VM_MIXEDMAP | VM_DONTEXPAND | VM_DONTCOPY); > vma->vm_ops = &arena_vm_ops; > return 0; > } > > -- > 2.55.0 > >
