On Tue, Jun 28, 2022 at 12:27:40PM +0100, Matthew Wilcox wrote: > On Tue, Jun 28, 2022 at 05:31:20PM +1000, Dave Chinner wrote: > > So using this technique, I've discovered that there's a dirty page > > accounting leak that eventually results in fsx hanging in > > balance_dirty_pages(). > > Alas, I think this is only an accounting error, and not related to > the problem(s) that Darrick & Zorro are seeing. I think what you're > seeing is dirty pages being dropped at truncation without the > appropriate accounting. ie this should be the fix: Argh, try one that actually compiles. diff --git a/mm/huge_memory.c b/mm/huge_memory.c index f7248002dad9..0553ae90509f 100644 --- a/mm/huge_memory.c +++ b/mm/huge_memory.c @@ -18,6 +18,7 @@ #include <linux/shrinker.h> #include <linux/mm_inline.h> #include <linux/swapops.h> +#include <linux/backing-dev.h> #include <linux/dax.h> #include <linux/khugepaged.h> #include <linux/freezer.h> @@ -2443,6 +2444,9 @@ static void __split_huge_page(struct page *page, struct list_head *list, __delete_from_page_cache(head + i, NULL); if (shmem_mapping(head->mapping)) shmem_uncharge(head->mapping->host, 1); + else + folio_account_cleaned(page_folio(head + i), + inode_to_wb(folio->mapping->host)); put_page(head + i); } else if (!PageAnon(page)) { __xa_store(&head->mapping->i_pages, head[i].index,