On 2024/5/8 17:55, Chengming Zhou wrote: > During testing, I found ksm_pages_scanned is unchanged although the > scan_get_next_rmap_item() did return valid rmap_item that is not NULL. > > The reason is the scan_get_next_rmap_item() will return NULL after > a full scan, so ksm_do_scan() just return without accounting of the > ksm_pages_scanned. > > Fix it by just putting ksm_pages_scanned accounting in that loop, > and it will be accounted more timely if that loop would last for > a long time. > Fixes: b348b5fe2b5f ("mm/ksm: add pages scanned metric") > Signed-off-by: Chengming Zhou <chengming.zhou@xxxxxxxxx> > --- > mm/ksm.c | 6 ++---- > 1 file changed, 2 insertions(+), 4 deletions(-) > > diff --git a/mm/ksm.c b/mm/ksm.c > index e1034bf1c937..0f9c491552ff 100644 > --- a/mm/ksm.c > +++ b/mm/ksm.c > @@ -2753,18 +2753,16 @@ static void ksm_do_scan(unsigned int scan_npages) > { > struct ksm_rmap_item *rmap_item; > struct page *page; > - unsigned int npages = scan_npages; > > - while (npages-- && likely(!freezing(current))) { > + while (scan_npages-- && likely(!freezing(current))) { > cond_resched(); > rmap_item = scan_get_next_rmap_item(&page); > if (!rmap_item) > return; > cmp_and_merge_page(page, rmap_item); > put_page(page); > + ksm_pages_scanned++; > } > - > - ksm_pages_scanned += scan_npages - npages; > } > > static int ksmd_should_run(void) >