Skip to content

Commit df48a5f

Browse files
howlettakpm00
authored andcommitted
mm/page_alloc: reduce potential fragmentation in make_alloc_exact()
Try to avoid using the left over split page on the next request for a page by calling __free_pages_ok() with FPI_TO_TAIL. This increases the potential of defragmenting memory when it's used for a short period of time. Link: https://lkml.kernel.org/r/20220531185626.yvlmymbxyoe5vags@revolver Signed-off-by: Liam R. Howlett <[email protected]> Suggested-by: Matthew Wilcox (Oracle) <[email protected]> Signed-off-by: Andrew Morton <[email protected]>
1 parent 08ac855 commit df48a5f

File tree

1 file changed

+12
-8
lines changed

1 file changed

+12
-8
lines changed

mm/page_alloc.c

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5784,14 +5784,18 @@ static void *make_alloc_exact(unsigned long addr, unsigned int order,
57845784
size_t size)
57855785
{
57865786
if (addr) {
5787-
unsigned long alloc_end = addr + (PAGE_SIZE << order);
5788-
unsigned long used = addr + PAGE_ALIGN(size);
5789-
5790-
split_page(virt_to_page((void *)addr), order);
5791-
while (used < alloc_end) {
5792-
free_page(used);
5793-
used += PAGE_SIZE;
5794-
}
5787+
unsigned long nr = DIV_ROUND_UP(size, PAGE_SIZE);
5788+
struct page *page = virt_to_page((void *)addr);
5789+
struct page *last = page + nr;
5790+
5791+
split_page_owner(page, 1 << order);
5792+
split_page_memcg(page, 1 << order);
5793+
while (page < --last)
5794+
set_page_refcounted(last);
5795+
5796+
last = page + (1UL << order);
5797+
for (page += nr; page < last; page++)
5798+
__free_pages_ok(page, 0, FPI_TO_TAIL);
57955799
}
57965800
return (void *)addr;
57975801
}

0 commit comments

Comments
 (0)