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 --- 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 #include #include +#include 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