| From: "Matthew Wilcox (Oracle)" <willy@infradead.org> |
| Subject: vmalloc: fix accounting with i915 |
| Date: Wed, 11 Dec 2024 20:25:37 +0000 |
| |
| If the caller of vmap() specifies VM_MAP_PUT_PAGES (currently only the |
| i915 driver), we will decrement nr_vmalloc_pages and MEMCG_VMALLOC in |
| vfree(). These counters are incremented by vmalloc() but not by vmap() so |
| this will cause an underflow. Check the VM_MAP_PUT_PAGES flag before |
| decrementing either counter. |
| |
| Link: https://lkml.kernel.org/r/20241211202538.168311-1-willy@infradead.org |
| Fixes: b944afc9d64d ("mm: add a VM_MAP_PUT_PAGES flag for vmap") |
| Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org> |
| Acked-by: Johannes Weiner <hannes@cmpxchg.org> |
| Reviewed-by: Shakeel Butt <shakeel.butt@linux.dev> |
| Reviewed-by: Balbir Singh <balbirs@nvidia.com> |
| Acked-by: Michal Hocko <mhocko@suse.com> |
| Cc: Christoph Hellwig <hch@lst.de> |
| Cc: Muchun Song <muchun.song@linux.dev> |
| Cc: Roman Gushchin <roman.gushchin@linux.dev> |
| Cc: "Uladzislau Rezki (Sony)" <urezki@gmail.com> |
| Cc: <stable@vger.kernel.org> |
| Signed-off-by: Andrew Morton <akpm@linux-foundation.org> |
| --- |
| |
| mm/vmalloc.c | 6 ++++-- |
| 1 file changed, 4 insertions(+), 2 deletions(-) |
| |
| --- a/mm/vmalloc.c~vmalloc-fix-accounting-with-i915 |
| +++ a/mm/vmalloc.c |
| @@ -3374,7 +3374,8 @@ void vfree(const void *addr) |
| struct page *page = vm->pages[i]; |
| |
| BUG_ON(!page); |
| - mod_memcg_page_state(page, MEMCG_VMALLOC, -1); |
| + if (!(vm->flags & VM_MAP_PUT_PAGES)) |
| + mod_memcg_page_state(page, MEMCG_VMALLOC, -1); |
| /* |
| * High-order allocs for huge vmallocs are split, so |
| * can be freed as an array of order-0 allocations |
| @@ -3382,7 +3383,8 @@ void vfree(const void *addr) |
| __free_page(page); |
| cond_resched(); |
| } |
| - atomic_long_sub(vm->nr_pages, &nr_vmalloc_pages); |
| + if (!(vm->flags & VM_MAP_PUT_PAGES)) |
| + atomic_long_sub(vm->nr_pages, &nr_vmalloc_pages); |
| kvfree(vm->pages); |
| kfree(vm); |
| } |
| _ |