On Fri, Mar 27, 2020 at 09:17:00PM -0400, Zi Yan wrote: > > The compound page may be locked here if the function called for the first > > time for the page and not locked after that (becouse we've unlocked it we > > saw it the first time). The same with LRU. > > > > For the first time, the compound page is locked and not on LRU, so this VM_BUG_ON passes. > For the second time and so on, the compound page is unlocked and on the LRU, > so this VM_BUG_ON still passes. > > For base page, VM_BUG_ON passes. > > Other unexpected situation (a compound page is locked and on LRU) triggers the VM_BU_ON, > but your VM_BUG_ON will not detect this situation, right? Right. I will rework this code. I've just realized it is racy: after unlock and putback on LRU the page can be locked by somebody else and this code can unlock it which completely borken. I'll pass down compound_pagelist to release_pte_pages() and handle the situation there. > >>> if (likely(writable)) { > >>> if (likely(referenced)) { > >> > >> Do we need a list here? There should be at most one compound page we will see here, right? > > > > Um? It's outside the pte loop. We get here once per PMD range. > > > > 'page' argument to trace_mm_collapse_huge_page_isolate() is misleading: > > it's just the last page handled in the loop. > > > > Throughout the pte loop, we should only see at most one compound page, right? No. mremap(2) opens a possibility for HPAGE_PMD_NR compound pages for single PMD range. -- Kirill A. Shutemov