]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
bpf: arena: use page_ref_count() instead of page_mapped() in arena_free_pages()
authorDavid Hildenbrand (Arm) <david@kernel.org>
Mon, 27 Apr 2026 11:43:15 +0000 (13:43 +0200)
committerAndrew Morton <akpm@linux-foundation.org>
Fri, 29 May 2026 04:04:56 +0000 (21:04 -0700)
Pages that BPF arena code maps are allocated through
bpf_map_alloc_pages(), which does not allocate folios but pages.

In the future, pages will not have a mapcount, only folios will.
Converting the code to use folios and rely on folio_mapped() sounds like
the wrong approach.

Should BPF arena code allocate folios and use folio_mapped() here?  But
likely we would not want to use folios here longterm, as we don't really
need folio information.

Hard to tell.  But in the meantime, we can simply use the page refcount
instead, as a heuristic whether the page might be mapped to user space and
we would want to try zapping it, so we can get rid of page_mapped().

Page allocation will give us a page with a refcount of 1.  Any user space
mapping adds a page reference.  While there can be references from other
subsystems (e.g., GUP), in the common case for this test here relying on
the page count is good enough.

Link: https://lore.kernel.org/20260427-page_mapped-v1-2-e89c3592c74c@kernel.org
Signed-off-by: David Hildenbrand (Arm) <david@kernel.org>
Reviewed-by: Matthew Wilcox (Oracle) <willy@infradead.org>
Cc: Alexei Starovoitov <ast@kernel.org>
Cc: Andrii Nakryiko <andrii@kernel.org>
Cc: Eduard Zingerman <eddyz87@gmail.com>
Cc: Harry Yoo <harry@kernel.org>
Cc: Jann Horn <jannh@google.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: John Paul Adrian Glaubitz <glaubitz@physik.fu-berlin.de>
Cc: Kumar Kartikeya Dwivedi <memxor@gmail.com>
Cc: Liam R. Howlett <liam@infradead.org>
Cc: Lorenzo Stoakes <ljs@kernel.org>
Cc: Martin KaFai Lau <martin.lau@linux.dev>
Cc: Michal Hocko <mhocko@suse.com>
Cc: Mike Rapoport <rppt@kernel.org>
Cc: Rich Felker <dalias@libc.org>
Cc: Rik van Riel <riel@surriel.com>
Cc: Song Liu <song@kernel.org>
Cc: Suren Baghdasaryan <surenb@google.com>
Cc: Vlastimil Babka <vbabka@kernel.org>
Cc: Yonghong Song <yonghong.song@linux.dev>
Cc: Yoshinori Sato <ysato@users.sourceforge.jp>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
kernel/bpf/arena.c

index 49a8f7b1beef59855cd100f7928c1adc37de82bc..a497c5913bd49124f04fe6686c98be8ca90da8c7 100644 (file)
@@ -729,7 +729,7 @@ static void arena_free_pages(struct bpf_arena *arena, long uaddr, long page_cnt,
 
        llist_for_each_safe(pos, t, __llist_del_all(&free_pages)) {
                page = llist_entry(pos, struct page, pcp_llist);
-               if (page_cnt == 1 && page_mapped(page)) /* mapped by some user process */
+               if (page_cnt == 1 && page_ref_count(page) > 1) /* maybe mapped by user space */
                        /* Optimization for the common case of page_cnt==1:
                         * If page wasn't mapped into some user vma there
                         * is no need to call zap_pages which is slow. When