Message ID | 20240508-b4-ksm-counters-v1-1-e2a9b13f70c5@linux.dev (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | mm/ksm: fix some accounting problems | expand |
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@linux.dev> > --- > 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) >
On 08.05.24 12:35, Chengming Zhou wrote: > 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") Acked-by: David Hildenbrand <david@redhat.com>
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)
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. Signed-off-by: Chengming Zhou <chengming.zhou@linux.dev> --- mm/ksm.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-)