]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
dma-buf: system_heap: account for system heap allocation in memcg
authorEric Chanudet <echanude@redhat.com>
Fri, 16 Jan 2026 20:05:39 +0000 (15:05 -0500)
committerSumit Semwal <sumit.semwal@linaro.org>
Mon, 19 Jan 2026 13:39:52 +0000 (19:09 +0530)
The system dma-buf heap lets userspace allocate buffers from the page
allocator. However, these allocations are not accounted for in memcg,
allowing processes to escape limits that may be configured.

Pass __GFP_ACCOUNT for system heap allocations, based on the
dma_heap.mem_accounting parameter, to use memcg and account for them.

Signed-off-by: Eric Chanudet <echanude@redhat.com>
Reviewed-by: T.J. Mercier <tjmercier@google.com>
Reviewed-by: Maxime Ripard <mripard@kernel.org>
Signed-off-by: Sumit Semwal <sumit.semwal@linaro.org>
Link: https://patch.msgid.link/20260116-dmabuf-heap-system-memcg-v3-2-ecc6b62cc446@redhat.com
drivers/dma-buf/heaps/system_heap.c

index 4c782fe33fd497a74eb5065797259576f9b651b6..4049d042afa14ec2f4d034f59f1740600a20c1e5 100644 (file)
@@ -320,14 +320,17 @@ static struct page *alloc_largest_available(unsigned long size,
 {
        struct page *page;
        int i;
+       gfp_t flags;
 
        for (i = 0; i < NUM_ORDERS; i++) {
                if (size <  (PAGE_SIZE << orders[i]))
                        continue;
                if (max_order < orders[i])
                        continue;
-
-               page = alloc_pages(order_flags[i], orders[i]);
+               flags = order_flags[i];
+               if (mem_accounting)
+                       flags |= __GFP_ACCOUNT;
+               page = alloc_pages(flags, orders[i]);
                if (!page)
                        continue;
                return page;