On Sat, Jul 17, 2021 at 10:17:13AM -0700, Darrick J. Wong wrote: > I experience the same problem that Murphy does, and I tracked it down > to this chunk of inode_do_switch_wbs: > > /* > * Count and transfer stats. Note that PAGECACHE_TAG_DIRTY points > * to possibly dirty pages while PAGECACHE_TAG_WRITEBACK points to > * pages actually under writeback. > */ > xas_for_each_marked(&xas, page, ULONG_MAX, PAGECACHE_TAG_DIRTY) { > here >>>>>>>>>> if (PageDirty(page)) { > dec_wb_stat(old_wb, WB_RECLAIMABLE); > inc_wb_stat(new_wb, WB_RECLAIMABLE); > } > } > > I suspect that "page" is really a pfn to a pmem mapping and not a real > struct page. I think you're right. Running scripts/decodecode on the original report, that's: 0: 48 8b 50 08 mov 0x8(%rax),%rdx RAX: 0000000005b0f661 so rax is not a struct page, it's a PFN (/DAX) entry. We shouldn't even be calling inode_do_switch_wbs() for DAX inodes because we don't do writeback for DAX inodes (at least as far as the kernel's writeback infrastructure is concerned; obviously the CPU does writeback from its caches to PMEM). Maybe some check at a higher level would be appropriate? I don't know much about this part of the kernel.