[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <f25f8fb9-47a9-ebd9-5a7a-95ca6dc324c9@suse.cz>
Date: Thu, 8 Dec 2016 09:04:12 +0100
From: Vlastimil Babka <vbabka@...e.cz>
To: David Rientjes <rientjes@...gle.com>,
Andrew Morton <akpm@...ux-foundation.org>
Cc: Joonsoo Kim <iamjoonsoo.kim@....com>, linux-kernel@...r.kernel.org,
linux-mm@...ck.org
Subject: Re: [patch] mm, compaction: add vmstats for kcompactd work
On 12/08/2016 02:50 AM, David Rientjes wrote:
> A "compact_daemon_wake" vmstat exists that represents the number of times
> kcompactd has woken up. This doesn't represent how much work it actually
> did, though.
>
> It's useful to understand how much compaction work is being done by
> kcompactd versus other methods such as direct compaction and explicitly
> triggered per-node (or system) compaction.
>
> This adds two new vmstats: "compact_daemon_migrate_scanned" and
> "compact_daemon_free_scanned" to represent the number of pages kcompactd
> has scanned as part of its migration scanner and freeing scanner,
> respectively.
>
> These values are still accounted for in the general
> "compact_migrate_scanned" and "compact_free_scanned" for compatibility.
>
> It could be argued that explicitly triggered compaction could also be
> tracked separately, and that could be added if others find it useful.
>
> Signed-off-by: David Rientjes <rientjes@...gle.com>
A bit of downside is that stats are only updated when compaction
finishes, but I guess it's acceptable. Also I don't think the
compact_control variables need the "total_" prefix, but no strong
feelings. The explicit zero init should be also unnecessary.
Acked-by: Vlastimil Babka <vbabka@...e.cz>
> ---
> include/linux/vm_event_item.h | 1 +
> mm/compaction.c | 22 +++++++++++++++++++---
> mm/internal.h | 2 ++
> mm/vmstat.c | 2 ++
> 4 files changed, 24 insertions(+), 3 deletions(-)
>
> diff --git a/include/linux/vm_event_item.h b/include/linux/vm_event_item.h
> --- a/include/linux/vm_event_item.h
> +++ b/include/linux/vm_event_item.h
> @@ -56,6 +56,7 @@ enum vm_event_item { PGPGIN, PGPGOUT, PSWPIN, PSWPOUT,
> COMPACTISOLATED,
> COMPACTSTALL, COMPACTFAIL, COMPACTSUCCESS,
> KCOMPACTD_WAKE,
> + KCOMPACTD_MIGRATE_SCANNED, KCOMPACTD_FREE_SCANNED,
> #endif
> #ifdef CONFIG_HUGETLB_PAGE
> HTLB_BUDDY_PGALLOC, HTLB_BUDDY_PGALLOC_FAIL,
> diff --git a/mm/compaction.c b/mm/compaction.c
> --- a/mm/compaction.c
> +++ b/mm/compaction.c
> @@ -548,7 +548,7 @@ static unsigned long isolate_freepages_block(struct compact_control *cc,
> if (blockpfn == end_pfn)
> update_pageblock_skip(cc, valid_page, total_isolated, false);
>
> - count_compact_events(COMPACTFREE_SCANNED, nr_scanned);
> + cc->total_free_scanned += nr_scanned;
> if (total_isolated)
> count_compact_events(COMPACTISOLATED, total_isolated);
> return total_isolated;
> @@ -939,7 +939,7 @@ isolate_migratepages_block(struct compact_control *cc, unsigned long low_pfn,
> trace_mm_compaction_isolate_migratepages(start_pfn, low_pfn,
> nr_scanned, nr_isolated);
>
> - count_compact_events(COMPACTMIGRATE_SCANNED, nr_scanned);
> + cc->total_migrate_scanned += nr_scanned;
> if (nr_isolated)
> count_compact_events(COMPACTISOLATED, nr_isolated);
>
> @@ -1643,6 +1643,9 @@ static enum compact_result compact_zone(struct zone *zone, struct compact_contro
> zone->compact_cached_free_pfn = free_pfn;
> }
>
> + count_compact_events(COMPACTMIGRATE_SCANNED, cc->total_migrate_scanned);
> + count_compact_events(COMPACTFREE_SCANNED, cc->total_free_scanned);
> +
> trace_mm_compaction_end(start_pfn, cc->migrate_pfn,
> cc->free_pfn, end_pfn, sync, ret);
>
> @@ -1657,6 +1660,8 @@ static enum compact_result compact_zone_order(struct zone *zone, int order,
> struct compact_control cc = {
> .nr_freepages = 0,
> .nr_migratepages = 0,
> + .total_migrate_scanned = 0,
> + .total_free_scanned = 0,
> .order = order,
> .gfp_mask = gfp_mask,
> .zone = zone,
> @@ -1767,6 +1772,8 @@ static void compact_node(int nid)
> struct zone *zone;
> struct compact_control cc = {
> .order = -1,
> + .total_migrate_scanned = 0,
> + .total_free_scanned = 0,
> .mode = MIGRATE_SYNC,
> .ignore_skip_hint = true,
> .whole_zone = true,
> @@ -1892,6 +1899,8 @@ static void kcompactd_do_work(pg_data_t *pgdat)
> struct zone *zone;
> struct compact_control cc = {
> .order = pgdat->kcompactd_max_order,
> + .total_migrate_scanned = 0,
> + .total_free_scanned = 0,
> .classzone_idx = pgdat->kcompactd_classzone_idx,
> .mode = MIGRATE_SYNC_LIGHT,
> .ignore_skip_hint = true,
> @@ -1899,7 +1908,7 @@ static void kcompactd_do_work(pg_data_t *pgdat)
> };
> trace_mm_compaction_kcompactd_wake(pgdat->node_id, cc.order,
> cc.classzone_idx);
> - count_vm_event(KCOMPACTD_WAKE);
> + count_compact_event(KCOMPACTD_WAKE);
>
> for (zoneid = 0; zoneid <= cc.classzone_idx; zoneid++) {
> int status;
> @@ -1917,6 +1926,8 @@ static void kcompactd_do_work(pg_data_t *pgdat)
>
> cc.nr_freepages = 0;
> cc.nr_migratepages = 0;
> + cc.total_migrate_scanned = 0;
> + cc.total_free_scanned = 0;
> cc.zone = zone;
> INIT_LIST_HEAD(&cc.freepages);
> INIT_LIST_HEAD(&cc.migratepages);
> @@ -1935,6 +1946,11 @@ static void kcompactd_do_work(pg_data_t *pgdat)
> defer_compaction(zone, cc.order);
> }
>
> + count_compact_events(KCOMPACTD_MIGRATE_SCANNED,
> + cc.total_migrate_scanned);
> + count_compact_events(KCOMPACTD_FREE_SCANNED,
> + cc.total_free_scanned);
> +
> VM_BUG_ON(!list_empty(&cc.freepages));
> VM_BUG_ON(!list_empty(&cc.migratepages));
> }
> diff --git a/mm/internal.h b/mm/internal.h
> --- a/mm/internal.h
> +++ b/mm/internal.h
> @@ -173,6 +173,8 @@ struct compact_control {
> struct list_head migratepages; /* List of pages being migrated */
> unsigned long nr_freepages; /* Number of isolated free pages */
> unsigned long nr_migratepages; /* Number of pages to migrate */
> + unsigned long total_migrate_scanned;
> + unsigned long total_free_scanned;
> unsigned long free_pfn; /* isolate_freepages search base */
> unsigned long migrate_pfn; /* isolate_migratepages search base */
> unsigned long last_migrated_pfn;/* Not yet flushed page being freed */
> diff --git a/mm/vmstat.c b/mm/vmstat.c
> --- a/mm/vmstat.c
> +++ b/mm/vmstat.c
> @@ -1038,6 +1038,8 @@ const char * const vmstat_text[] = {
> "compact_fail",
> "compact_success",
> "compact_daemon_wake",
> + "compact_daemon_migrate_scanned",
> + "compact_daemon_free_scanned",
> #endif
>
> #ifdef CONFIG_HUGETLB_PAGE
>
> --
> To unsubscribe, send a message with 'unsubscribe linux-mm' in
> the body to majordomo@...ck.org. For more info on Linux MM,
> see: http://www.linux-mm.org/ .
> Don't email: <a href=mailto:"dont@...ck.org"> email@...ck.org </a>
>
Powered by blists - more mailing lists