Message ID | 20230321004829.2012847-1-zi.yan@sent.com |
---|---|
Headers | show |
Series | Split a folio to any lower order folios | expand |
Hello. On Mon, Mar 20, 2023 at 08:48:26PM -0400, Zi Yan <zi.yan@sent.com> wrote: > @@ -5746,8 +5746,8 @@ static void *make_alloc_exact(unsigned long addr, unsigned int order, > struct page *page = virt_to_page((void *)addr); > struct page *last = page + nr; > > - split_page_owner(page, 1 << order); > - split_page_memcg(page, 1 << order); > + split_page_owner(page, 1 << order, 1); > + split_page_memcg(page, 1 << order, 1); I think here should be > + split_page_owner(page, order, 0); > + split_page_memcg(page, 1 << order, 1); because I was wondering why split_page_memcg() doesn't use orders too? (E.g. it wouldn't work well if nr % new_new != 0). Thanks, Michal
On 24 Mar 2023, at 11:17, Michal Koutný wrote: > Hello. > > On Mon, Mar 20, 2023 at 08:48:26PM -0400, Zi Yan <zi.yan@sent.com> wrote: >> @@ -5746,8 +5746,8 @@ static void *make_alloc_exact(unsigned long addr, unsigned int order, >> struct page *page = virt_to_page((void *)addr); >> struct page *last = page + nr; >> >> - split_page_owner(page, 1 << order); >> - split_page_memcg(page, 1 << order); >> + split_page_owner(page, 1 << order, 1); >> + split_page_memcg(page, 1 << order, 1); > > I think here should be > >> + split_page_owner(page, order, 0); >> + split_page_memcg(page, 1 << order, 1); > > because I was wondering why split_page_memcg() doesn't use orders too? > (E.g. it wouldn't work well if nr % new_new != 0). Thanks. Good point. I will make both use orders instead in next version. -- Best Regards, Yan, Zi
From: Zi Yan <ziy@nvidia.com> Hi all, File folio supports any order and people would like to support flexible orders for anonymous folio[1] too. Currently, split_huge_page() only splits a huge page to order-0 pages, but splitting to orders higher than 0 is also useful. This patchset adds support for splitting a huge page to any lower order pages and uses it during folio truncate operations. The patchset is on top of mm-everything-2023-03-19-21-50. * Patch 1 and 2 add new_order parameter split_page_memcg() and split_page_owner() and prepare for upcoming changes. * Patch 3 adds split_huge_page_to_list_to_order() to split a huge page to any lower order. The original split_huge_page_to_list() calls split_huge_page_to_list_to_order() with new_order = 0. * Patch 4 uses split_huge_page_to_list_to_order() in large pagecache folio truncation instead of split the large folio all the way down to order-0. * Patch 5 adds a test API to debugfs and test cases in split_huge_page_test selftests. Comments and/or suggestions are welcome. [1] https://lore.kernel.org/linux-mm/Y%2FblF0GIunm+pRIC@casper.infradead.org/ Zi Yan (5): mm: memcg: make memcg huge page split support any order split. mm: page_owner: add support for splitting to any order in split page_owner. mm: thp: split huge page to any lower order pages. mm: truncate: split huge page cache page to a non-zero order if possible. mm: huge_memory: enable debugfs to split huge pages to any order. include/linux/huge_mm.h | 10 +- include/linux/memcontrol.h | 5 +- include/linux/page_owner.h | 12 +- mm/huge_memory.c | 138 ++++++++--- mm/memcontrol.c | 8 +- mm/page_alloc.c | 8 +- mm/page_owner.c | 11 +- mm/truncate.c | 21 +- .../selftests/mm/split_huge_page_test.c | 225 +++++++++++++++++- 9 files changed, 368 insertions(+), 70 deletions(-)