On 12/07/2024 09:50, Zhijian Li (Fujitsu) wrote: > CPU0 CPU1 > ----------- --------- > // erase pcp_list > zone_pcp_disable // pcp->count = 0 > > lru_cache_diable() __rmqueue_pcplist() // re-add pages to pcp_lsit > __rmqueue_pcplist() // drop pages from pcp_list > decay_pcp_high() // drop pages from pcp_list > loop { ... > __rmqueue_pcplist() // drop pages from pcp_list, > // it will be only called a few times during the loop > scan_movable_pages() ... > migration_pages() decay_pcp_high() // drop pages from pcp_list, it will be called by > // a worker periodically during the loop > > // wait pcp_list to be empty > } while (test_pages_isolated()) > > > And we noticed that re-add pages to pcp_list in '__rmqueue_pcplist()` only happen once, > pcp->count changed to 200 from 0 for example. > > The later calls to __rmqueue_pcplist() will drop pcp->count by step 1 for each call, > For example, pcp->count: 199->198->197->196..., > However it stops calling __rmqueue_pcplist after a few times before pcp->count is dropped to 0. > > In the normal/good case, we also noticed that __rmqueue_pcplist() dropped pcp->count to 0. I doubt all these(after calling zone_pcp_disable()) 1. __rmqueue_pcplist() should re-add pages to pcp_list 2. __rmqueue_pcplist() should drop pcp->count till 0 if 1 is true 3. decay_pcp_high() should drop pcp->count till 0, its name and comments don't indicate this.