On Sun, 3 May 2020, Matthew Wilcox wrote: > On Sun, May 03, 2020 at 09:43:41AM +0100, Nikolaus Rath wrote: > > Here's what I got: > > > > [ 221.277260] page:ffffec4bbd639880 refcount:1 mapcount:0 mapping:0000000000000000 index:0xd9 > > [ 221.277265] flags: 0x17ffffc0000097(locked|waiters|referenced|uptodate|lru) > > [ 221.277269] raw: 0017ffffc0000097 ffffec4bbd62f048 ffffec4bbd619308 0000000000000000 > > [ 221.277271] raw: 00000000000000d9 0000000000000000 00000001ffffffff ffff9aec11beb000 > > [ 221.277272] page dumped because: fuse: trying to steal weird page > > [ 221.277273] page->mem_cgroup:ffff9aec11beb000 > > Great! Here's the condition: > > if (page_mapcount(page) || > page->mapping != NULL || > page_count(page) != 1 || > (page->flags & PAGE_FLAGS_CHECK_AT_PREP & > ~(1 << PG_locked | > 1 << PG_referenced | > 1 << PG_uptodate | > 1 << PG_lru | > 1 << PG_active | > 1 << PG_reclaim))) { > > mapcount is 0, mapping is NULL, refcount is 1, so that's all fine. > flags has 'waiters' set, which is not in the allowed list. I don't > know the internals of FUSE, so I don't know why that is. That list of PG_flags dates back to 2010: which 2016's 62906027091f ("mm: add PageWaiters indicating tasks are waiting for a page bit") ought to have updated. Though it's understandable that it did not: surprising to find a list of PG_flags outside of mm/ and fs/proc/. Just add PG_waiters to the list and the issue should go away. > > Also, page_count() is unstable. Agreed: fine to back out if page_count() is high, but not good to issue a worrying warning about it. > Unless there has been an RCU grace period > between when the page was freed and now, a speculative reference may exist > from the page cache. So I would say this is a bad thing to check for. > > Thanks for the swift provision of the debugging data!