]> www.infradead.org Git - users/hch/misc.git/commitdiff
mm/memcontrol: add per-memcg pgpgin/pswpin counter
authorJingxiang Zeng <linuszeng@tencent.com>
Fri, 30 Aug 2024 08:22:44 +0000 (16:22 +0800)
committerAndrew Morton <akpm@linux-foundation.org>
Wed, 6 Nov 2024 00:56:21 +0000 (16:56 -0800)
In proactive memory reclamation scenarios, it is necessary to estimate the
pswpin and pswpout metrics of the cgroup to determine whether to continue
reclaiming anonymous pages in the current batch.  This patch will collect
these metrics and expose them.

[linuszeng@tencent.com: v2]
Link: https://lkml.kernel.org/r/20240830082244.156923-1-jingxiangzeng.cas@gmail.com
Li  nk: https://lkml.kernel.org/r/20240913084453.3605621-1-jingxiangzeng.cas@gmail.com
Link: https://lkml.kernel.org/r/20240830082244.156923-1-jingxiangzeng.cas@gmail.com
Signed-off-by: Jingxiang Zeng <linuszeng@tencent.com>
Acked-by: Nhat Pham <nphamcs@gmail.com>
Cc: Johannes Weiner <hannes@cmpxchg.org>
Cc: Michal Hocko <mhocko@kernel.org>
Cc: Muchun Song <muchun.song@linux.dev>
Cc: Roman Gushchin <roman.gushchin@linux.dev>
Cc: Shakeel Butt <shakeel.butt@linux.dev>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
mm/memcontrol.c
mm/page_io.c

index 06df2af9741592f4c0fbe4f5ea3eac239b4f154a..d6159266185f5730a09f11f847f8b24916f096b7 100644 (file)
@@ -418,6 +418,8 @@ static const unsigned int memcg_vm_event_stat[] = {
        PGPGIN,
        PGPGOUT,
 #endif
+       PSWPIN,
+       PSWPOUT,
        PGSCAN_KSWAPD,
        PGSCAN_DIRECT,
        PGSCAN_KHUGEPAGED,
index 69536a2b3c138683209b9ff012f44e7f81191d02..40392782cdcb9d62bac9b29eb28e97735c135147 100644 (file)
@@ -290,6 +290,7 @@ static inline void count_swpout_vm_event(struct folio *folio)
        }
        count_mthp_stat(folio_order(folio), MTHP_STAT_SWPOUT);
 #endif
+       count_memcg_folio_events(folio, PSWPOUT, folio_nr_pages(folio));
        count_vm_events(PSWPOUT, folio_nr_pages(folio));
 }
 
@@ -485,6 +486,7 @@ static void sio_read_complete(struct kiocb *iocb, long ret)
                for (p = 0; p < sio->pages; p++) {
                        struct folio *folio = page_folio(sio->bvec[p].bv_page);
 
+                       count_memcg_folio_events(folio, PSWPIN, folio_nr_pages(folio));
                        folio_mark_uptodate(folio);
                        folio_unlock(folio);
                }
@@ -570,6 +572,7 @@ static void swap_read_folio_bdev_sync(struct folio *folio,
         * attempt to access it in the page fault retry time check.
         */
        get_task_struct(current);
+       count_memcg_folio_events(folio, PSWPIN, folio_nr_pages(folio));
        count_vm_events(PSWPIN, folio_nr_pages(folio));
        submit_bio_wait(&bio);
        __end_swap_bio_read(&bio);
@@ -585,6 +588,7 @@ static void swap_read_folio_bdev_async(struct folio *folio,
        bio->bi_iter.bi_sector = swap_folio_sector(folio);
        bio->bi_end_io = end_swap_bio_read;
        bio_add_folio_nofail(bio, folio, folio_size(folio), 0);
+       count_memcg_folio_events(folio, PSWPIN, folio_nr_pages(folio));
        count_vm_events(PSWPIN, folio_nr_pages(folio));
        submit_bio(bio);
 }