On Mon, Nov 26, 2018 at 03:25:01PM -0800, Hugh Dickins wrote: > Huge tmpfs testing on a shortish file mapped into a pmd-rounded extent hit > shmem_evict_inode()'s WARN_ON(inode->i_blocks) followed by clear_inode()'s > BUG_ON(inode->i_data.nrpages) when the file was later closed and unlinked. > > khugepaged's collapse_shmem() was forgetting to update mapping->nrpages on > the rollback path, after it had added but then needs to undo some holes. > > There is indeed an irritating asymmetry between shmem_charge(), whose > callers want it to increment nrpages after successfully accounting blocks, > and shmem_uncharge(), when __delete_from_page_cache() already decremented > nrpages itself: oh well, just add a comment on that to them both. > > And shmem_recalc_inode() is supposed to be called when the accounting is > expected to be in balance (so it can deduce from imbalance that reclaim > discarded some pages): so change shmem_charge() to update nrpages earlier > (though it's rare for the difference to matter at all). > > Fixes: 800d8c63b2e98 ("shmem: add huge pages support") > Fixes: f3f0e1d2150b2 ("khugepaged: add support of collapse for tmpfs/shmem pages") > Signed-off-by: Hugh Dickins <hughd@xxxxxxxxxx> > Cc: Kirill A. Shutemov <kirill.shutemov@xxxxxxxxxxxxxxx> > Cc: stable@xxxxxxxxxxxxxxx # 4.8+ Acked-by: Kirill A. Shutemov <kirill.shutemov@xxxxxxxxxxxxxxx> I think we would need to revisit the accounting helpers to make them less error prone. But it's out of scope for the patchset. -- Kirill A. Shutemov