[RFC PATCH v2 14/16] mm: Free pages, remove files and clean cache when one alloc fails

From: Juan Yescas

Date: Wed Aug 05 2026 - 21:21:51 EST


When one of the requested allocations failed, do

- free the pages that were previously allocated as part of the request.
- remove the files that were created as part of the request.
- clean the kmem cache.
- Erase the struct page_alloc objects from the xarray that were inserted
as part of the request.

Signed-off-by: Juan Yescas <jyescas@xxxxxxxxxx>
---

Changes in v2:
- Remove comment about the future implementation.

mm/page_alloc_hogger.c | 31 +++++++++++++++++++++++++++----
1 file changed, 27 insertions(+), 4 deletions(-)

diff --git a/mm/page_alloc_hogger.c b/mm/page_alloc_hogger.c
index a70c924e4172..ce53a17ac790 100644
--- a/mm/page_alloc_hogger.c
+++ b/mm/page_alloc_hogger.c
@@ -93,6 +93,7 @@
#include <linux/nodemask.h>
#include <linux/printk.h>
#include <linux/slab.h>
+#include <linux/xarray.h>

static struct dentry *mmdir;

@@ -252,6 +253,23 @@ static int make_alloc(struct req_alloc *req,
return ret;
}

+static int free_alloc_helper(unsigned long alloc_id)
+{
+ struct page_alloc *pa;
+
+ pa = xa_erase(&allocs_xa, alloc_id);
+ if (!pa) {
+ pr_err("The alloc_id %lu was not found!", alloc_id);
+ return -EINVAL;
+ }
+
+ __free_pages(pa->page, pa->req_alloc->order);
+ debugfs_remove(pa->alloc_dentry);
+ kmem_cache_free(page_alloc_cache, pa);
+
+ return 0;
+}
+
/**
* req_page_alloc_write() - Allocates the pages on the requested node, zone,
* order and migrate type. Once the allocation is performed, a file is created
@@ -293,10 +311,15 @@ static ssize_t req_page_alloc_write(struct file *file, const char __user *ubuf,
return cnt;

free_allocs:
- /*
- * A proper clean up of the pages and page_alloc allocations will
- * be done in a follow up patch of this topic.
- */
+ /* Free all the pages and resources previously allocated. */
+ for (int j = 0; j < i; j++) {
+ int ret2 = free_alloc_helper(allocs_ids[j]);
+
+ if (ret2)
+ pr_err("Unable to free pages associated with file %lu",
+ allocs_ids[j]);
+ }
+
kfree(allocs_ids);

return ret;
--
2.55.0.629.g250fe7f194-goog