On Fri Jul 17, 2026 at 7:37 AM EDT, Jiayuan Chen wrote: > Replace the scratch_page field in the pte-callback data with the arena > pointer; later patches use other arena fields from these callbacks. No > functional change. > > Signed-off-by: Jiayuan Chen <[email protected]>
Reviewed-by: Emil Tsalapatis <[email protected]> > --- > kernel/bpf/arena.c | 17 ++++++++--------- > 1 file changed, 8 insertions(+), 9 deletions(-) > > diff --git a/kernel/bpf/arena.c b/kernel/bpf/arena.c > index 80b7b8a69446..8dbc24460890 100644 > --- a/kernel/bpf/arena.c > +++ b/kernel/bpf/arena.c > @@ -143,14 +143,14 @@ static long compute_pgoff(struct bpf_arena *arena, long > uaddr) > } > > struct apply_range_data { > + struct bpf_arena *arena; > struct page **pages; > - struct page *scratch_page; > int i; > }; > > struct clear_range_data { > + struct bpf_arena *arena; > struct llist_head *free_pages; > - struct page *scratch_page; > }; > > static int apply_range_set_cb(pte_t *pte, unsigned long addr, void *data) > @@ -180,7 +180,7 @@ static int apply_range_set_cb(pte_t *pte, unsigned long > addr, void *data) > > if (pte_none(old)) > continue; > - if (WARN_ON_ONCE(pte_page(old) != d->scratch_page)) > + if (WARN_ON_ONCE(pte_page(old) != d->arena->scratch_page)) > return -EBUSY; > ptep_get_and_clear(&init_mm, addr, pte); > flush_tlb_before_set(addr); > @@ -227,7 +227,7 @@ static int apply_range_clear_cb(pte_t *pte, unsigned long > addr, void *data) > * scratches its PTE. A later bpf_arena_free_pages() over that range > walks > * here. Without the skip, scratch_page would be freed. > */ > - if (page == d->scratch_page) > + if (page == d->arena->scratch_page) > return 0; > > __llist_add(&page->pcp_llist, d->free_pages); > @@ -506,8 +506,7 @@ static vm_fault_t arena_vm_fault(struct vm_fault *vmf) > if (ret) > goto out_sigsegv_memcg; > > - struct apply_range_data data = { .pages = &page, .i = 0, > - .scratch_page = arena->scratch_page }; > + struct apply_range_data data = { .arena = arena, .pages = &page, .i = 0 > }; > /* Account into memcg of the process that created bpf_arena */ > ret = bpf_map_alloc_pages(map, NUMA_NO_NODE, 1, &page); > if (ret) { > @@ -696,8 +695,8 @@ static long arena_alloc_pages(struct bpf_arena *arena, > long uaddr, long page_cnt > bpf_map_memcg_exit(old_memcg, new_memcg); > return 0; > } > + data.arena = arena; > data.pages = pages; > - data.scratch_page = arena->scratch_page; > > if (raw_res_spin_lock_irqsave(&arena->spinlock, flags)) > goto out_free_pages; > @@ -873,8 +872,8 @@ static void arena_free_pages(struct bpf_arena *arena, > long uaddr, long page_cnt, > range_tree_set(&arena->rt, pgoff, page_cnt); > > init_llist_head(&free_pages); > + cdata.arena = arena; > cdata.free_pages = &free_pages; > - cdata.scratch_page = arena->scratch_page; > /* clear ptes and collect struct pages */ > apply_to_existing_page_range(&init_mm, kaddr, page_cnt << PAGE_SHIFT, > apply_range_clear_cb, &cdata); > @@ -981,8 +980,8 @@ static void arena_free_worker(struct work_struct *work) > bpf_map_memcg_enter(&arena->map, &old_memcg, &new_memcg); > > init_llist_head(&free_pages); > + cdata.arena = arena; > cdata.free_pages = &free_pages; > - cdata.scratch_page = arena->scratch_page; > arena_vm_start = bpf_arena_get_kern_vm_start(arena); > user_vm_start = bpf_arena_get_user_vm_start(arena); >

