From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 0F670C5AE59 for ; Mon, 26 May 2025 21:09:46 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id B15266B0083; Mon, 26 May 2025 17:09:45 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id AC6056B0085; Mon, 26 May 2025 17:09:45 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 9B4406B0088; Mon, 26 May 2025 17:09:45 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0015.hostedemail.com [216.40.44.15]) by kanga.kvack.org (Postfix) with ESMTP id 803D56B0083 for ; Mon, 26 May 2025 17:09:45 -0400 (EDT) Received: from smtpin29.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay04.hostedemail.com (Postfix) with ESMTP id 25D831A0E4D for ; Mon, 26 May 2025 21:09:45 +0000 (UTC) X-FDA: 83486300730.29.C28CE20 Received: from sea.source.kernel.org (sea.source.kernel.org [172.234.252.31]) by imf20.hostedemail.com (Postfix) with ESMTP id 79D9C1C0004 for ; Mon, 26 May 2025 21:09:43 +0000 (UTC) Authentication-Results: imf20.hostedemail.com; dkim=pass header.d=kernel.org header.s=k20201202 header.b=VKdcCS2E; spf=pass (imf20.hostedemail.com: domain of sj@kernel.org designates 172.234.252.31 as permitted sender) smtp.mailfrom=sj@kernel.org; dmarc=pass (policy=quarantine) header.from=kernel.org ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1748293783; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=cR+v6VKozLbJhdtMam8c0ajwSdUgK/2w0n0Q2lnZjoc=; b=t9QBAPbWg3s+bof70oXUxYU9PtzRet1eVHJQ5Pb+PBqgMmY2cWcUlDfLkLL83f29GaVGh9 xDEAawgEzEIKYOh+Q5/QujSA5baGgB8tMcwpSKq7wbQYBZSZ2I7vVpkBfM1D8TTbC3A543 Q9s99e3k7rsKhybwkwFJT3TMbetZ+Cc= ARC-Authentication-Results: i=1; imf20.hostedemail.com; dkim=pass header.d=kernel.org header.s=k20201202 header.b=VKdcCS2E; spf=pass (imf20.hostedemail.com: domain of sj@kernel.org designates 172.234.252.31 as permitted sender) smtp.mailfrom=sj@kernel.org; dmarc=pass (policy=quarantine) header.from=kernel.org ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1748293783; a=rsa-sha256; cv=none; b=Uh3RZ2fwQD+jxlqu33S4PaSPTjKD41pFWYCPHX7RKbskMzbPG+nTZyztr0497/SqCgxSGf 3z5clJqZ3riAeMs35x8mko56e6r5kJHnarjdh2v4MjP9LqbDgtAVA2WemZ8T+t2J1jFGkT GRDfcHCYj+IAgHJbIq11LpzlR3bdcfU= Received: from smtp.kernel.org (transwarp.subspace.kernel.org [100.75.92.58]) by sea.source.kernel.org (Postfix) with ESMTP id 515A649DBC; Mon, 26 May 2025 21:09:42 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id EE024C4CEEE; Mon, 26 May 2025 21:09:41 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1748293782; bh=hKn9MHEuhQIYyoRWDiRwIxmlR7BH2F01294Qax+v28s=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=VKdcCS2EWqLYinEOmrPSDcgg0gJRzLafODRPQBm+Pl8XXyFEtWLCgk627f3mW+XQS KELmM7R305BbpswkAd02zUD4HsgLjBvfn5iIr/JB6cBhAzucmfoESr+il5aKUNd5uE WtpaKk0CMMX4EHF3APGtATra5z3ZmccJBEx/erJNaefEufEAKdi4YmbNWSnsK0tDIk Q1iCNdxd8xhs+VI6HYpRC2UansXRHS0+LG8uY3vZHMP8gw3Zt6cvgvWDCewdYKF6e/ 9SgalZERP9ra1GnA709Odp6l48PBfqNspqydS2IEIqIOaQLMgqSWCjVOnv0pgr0gxU XwT08eMaMm9uQ== From: SeongJae Park To: Andrew Morton Cc: SeongJae Park , damon@lists.linux.dev, kernel-team@meta.com, linux-kernel@vger.kernel.org, linux-mm@kvack.org Subject: [PATCH 1/4] mm/damon: introduce DAMON_STAT module Date: Mon, 26 May 2025 14:09:33 -0700 Message-Id: <20250526210936.2744-2-sj@kernel.org> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20250526210936.2744-1-sj@kernel.org> References: <20250526210936.2744-1-sj@kernel.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Rspam-User: X-Rspamd-Queue-Id: 79D9C1C0004 X-Rspamd-Server: rspam09 X-Stat-Signature: 64pcb966rpbboams6oaa5qmpz8zqe479 X-HE-Tag: 1748293783-775036 X-HE-Meta: U2FsdGVkX1/fytPa/08s7WYZ1Y2My7mfcACUovhev5v5dk93/zJIb6AN5K52m0sl3kxiknNThmh7igPRZV8J0d4VE4XP+vqR4XXtInjtXXX/Na307r7w7zjeBtY4IRvNEqw/kAhqjtIOgrgi+pXLzwuIMxWdoHZPG0GiOffaZaOMo17vvBnxY67Owd+ROV1Rg27/rwDkNsfD+o/3zvB0QPwzAPbmaP07WnryI+ULi+h3Bug3udj+JolESgi4mXZatclnRp8A9ppPUSxxOY76PQetxIZelN/lygNjSIA09lIJ3gmQcptMdIoCzRW8A9fgkXykbzCAy/YilGUb9sPN0mElz4i/BSRHb9bMsfQy4V+d9VXOgJAF8hrtCWx4Ry4IfxsotZDrzQ4F3PPKn3VFdTno7Pg8om0hZZ+dCYjDM/szgQ7a9ycPA2mt95oiqVFRLdcJUMir7xh85Dgc7CLuDWfwK5U0AiGACiUFj4XTwBUyy1VkCRY0H9TnXeh1J/tOjW6SZhtTodVwmxqBl3QQhVq/Gx7JqArOfBTjBcmQLgMAZ1AjwkhMe2vjIk0YvmMyhT4PfnC5SaLSL/Gx1pxTJ9S/xXeVxVPjv7KWtvFf2Gj/Rsv6poeMwJrdpL2pbjKwqNUS2N2g+/9zmlSSnkb4dgt8yCMBtwblrGXIIVLtpcAjUHwQdJE6/MO8DM3q4tvWF37GbMnhU+LyXJ/6XwZq9nd3R7gctQ0ppS5mBTjOwc4XwoE5qoCXea4BOk93YLfhPKnRly+DMYHFjB9NcqD8fOavXfs8coBOmp1VGU902VnFsdCF/9z5hSri5hbeGzyHzU3BV2EeDnaC6jcy38wc68nk6xwz6sCFUvgjrHXV63btgWjNphdSg4KC8i3TAaZkwFQUjQtx5MSF09hBviVhqlpdYB+EUjGmqXq+G4uUfrI7is+obUccLphpC0SKL8Px1VhiQEf2U1wUGDO/Uv5 24RPsPZ0 viyV9yNHtLmGhAmaxWBtkoAOnadyOH147sWlwuJHNJU9QQiB6Qg9lYD/Bg0JACWtrx7AUEhyPBqSF5ANhLzjhGUIWBX0up0FQzgTSsg4KWw8GS+F1eH8oPuQeg1GaGzDl3wurDLBme8L4rDu/RV7W8HS4uNRtBANaeSariJabcdXLGOCAg4rMHOofFOfjUYsYDeS7E/OyKKfECVdBRyhFxdVByo6CK++jLeymZGTWAGY/kh3Xg+ZMdhkm2h1pjLrSt6j/3uhtFWiMAa17caN8sgEvhwdB840mi3wQ1j2Rphw2DoFx/e6+r1kUkHuGBdjRlQsP X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: To use DAMON for monitoring access patterns of the system, users should manually start DAMON via DAMON sysfs ABI with a number of parameters for specifying the monitoring target address space, address ranges, and monitoring intervals. After that, users should also wait until desired amount of time data is captured into DAMON's monitoring results. It is bothersome and take a long time to be practical for access monitoring on large fleet level production environments. For access-aware system operations use cases like proactive cold memory reclamation, similar problems existed. We we solved those by introducing dedicated static kernel modules such as DAMON_RECLAIM. Implement such static kernel module for access monitoring, namely DAMON_STAT. It monitors the entire physical address space with auto-tuned monitoring intervals. The auto-tuning is set to capture 4 % of observable access events in each snapshot while keeping the sampling intervals 5 milliseconds in minimum and 10 seconds in maximum. From a few production environments, we confirmed this setup provides high quality monitoring results with minimum overheads. The module therefore receives only one user input, whether to enable or disable it. It can be set on build or boot time via build configuration or kernel boot command line. It can also be overridden at runtime. Note that this commit only implements the DAMON control part of the module. Users could get the monitoring results via damon:damon_aggregated tracepoint, but that's of course not the recommended way. Following commits will implement convenient and optimized ways for serving the monitoring results to users. Signed-off-by: SeongJae Park --- mm/damon/Kconfig | 16 ++++++ mm/damon/Makefile | 1 + mm/damon/stat.c | 138 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 155 insertions(+) create mode 100644 mm/damon/stat.c diff --git a/mm/damon/Kconfig b/mm/damon/Kconfig index 551745df011b..9f482e3adc67 100644 --- a/mm/damon/Kconfig +++ b/mm/damon/Kconfig @@ -95,4 +95,20 @@ config DAMON_LRU_SORT protect frequently accessed (hot) pages while rarely accessed (cold) pages reclaimed first under memory pressure. +config DAMON_STAT + bool "Build data access monitoring stat (DAMON_STAT)" + depends on DAMON_PADDR + help + This builds the DAMON-based access monitoring statistics subsystem. + It runs DAMON and expose access monitoring results in simple stat + metrics. + +config DAMON_STAT_ENABLED_DEFAULT + bool "Enable DAMON_STAT by default" + depends on DAMON_PADDR + default DAMON_STAT + help + Whether to enable DAMON_STAT by default. Users can disable it in + boot or runtime using its 'enabled' parameter. + endmenu diff --git a/mm/damon/Makefile b/mm/damon/Makefile index 8b49012ba8c3..d8d6bf5f8bff 100644 --- a/mm/damon/Makefile +++ b/mm/damon/Makefile @@ -6,3 +6,4 @@ obj-$(CONFIG_DAMON_PADDR) += ops-common.o paddr.o obj-$(CONFIG_DAMON_SYSFS) += sysfs-common.o sysfs-schemes.o sysfs.o obj-$(CONFIG_DAMON_RECLAIM) += modules-common.o reclaim.o obj-$(CONFIG_DAMON_LRU_SORT) += modules-common.o lru_sort.o +obj-$(CONFIG_DAMON_STAT) += modules-common.o stat.o diff --git a/mm/damon/stat.c b/mm/damon/stat.c new file mode 100644 index 000000000000..852848ce844e --- /dev/null +++ b/mm/damon/stat.c @@ -0,0 +1,138 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Shows data access monitoring resutls in simple metrics. + */ + +#define pr_fmt(fmt) "damon-stat: " fmt + +#include +#include +#include +#include +#include + +#ifdef MODULE_PARAM_PREFIX +#undef MODULE_PARAM_PREFIX +#endif +#define MODULE_PARAM_PREFIX "damon_stat." + +static int damon_stat_enabled_store( + const char *val, const struct kernel_param *kp); + +static const struct kernel_param_ops enabled_param_ops = { + .set = damon_stat_enabled_store, + .get = param_get_bool, +}; + +static bool enabled __read_mostly = CONFIG_DAMON_STAT_ENABLED_DEFAULT; +module_param_cb(enabled, &enabled_param_ops, &enabled, 0600); +MODULE_PARM_DESC(enabled, "Enable of disable DAMON_STAT"); + +static struct damon_ctx *damon_stat_context; + +static struct damon_ctx *damon_stat_build_ctx(void) +{ + struct damon_ctx *ctx; + struct damon_attrs attrs; + struct damon_target *target; + unsigned long start = 0, end = 0; + + ctx = damon_new_ctx(); + if (!ctx) + return NULL; + attrs = (struct damon_attrs) { + .sample_interval = 5 * USEC_PER_MSEC, + .aggr_interval = 100 * USEC_PER_MSEC, + .ops_update_interval = 60 * USEC_PER_MSEC * MSEC_PER_SEC, + .min_nr_regions = 10, + .max_nr_regions = 1000, + }; + /* + * auto-tune sampling and aggregation interval aiming 4% DAMON-observed + * accesses ratio, keeping sampling interval in [5ms, 10s] range. + */ + attrs.intervals_goal = (struct damon_intervals_goal) { + .access_bp = 400, .aggrs = 3, + .min_sample_us = 5000, .max_sample_us = 10000000, + }; + if (damon_set_attrs(ctx, &attrs)) + goto free_out; + + /* + * auto-tune sampling and aggregation interval aiming 4% DAMON-observed + * accesses ratio, keeping sampling interval in [5ms, 10s] range. + */ + ctx->attrs.intervals_goal = (struct damon_intervals_goal) { + .access_bp = 400, .aggrs = 3, + .min_sample_us = 5000, .max_sample_us = 10000000, + }; + if (damon_select_ops(ctx, DAMON_OPS_PADDR)) + goto free_out; + + target = damon_new_target(); + if (!target) + goto free_out; + damon_add_target(ctx, target); + if (damon_set_region_biggest_system_ram_default(target, &start, &end)) + goto free_out; + return ctx; +free_out: + damon_destroy_ctx(ctx); + return NULL; +} + +static int damon_stat_start(void) +{ + damon_stat_context = damon_stat_build_ctx(); + if (!damon_stat_context) + return -ENOMEM; + return damon_start(&damon_stat_context, 1, true); +} + +static void damon_stat_stop(void) +{ + damon_stop(&damon_stat_context, 1); + damon_destroy_ctx(damon_stat_context); +} + +static bool damon_stat_init_called; + +static int damon_stat_enabled_store( + const char *val, const struct kernel_param *kp) +{ + bool is_enabled = enabled; + int err; + + err = kstrtobool(val, &enabled); + if (err) + return err; + + if (is_enabled == enabled) + return 0; + + if (!damon_stat_init_called) + /* + * probably called from command line parsing (parse_args()). + * Cannot call damon_new_ctx(). Let damon_stat_init() handle. + */ + return 0; + + if (enabled) + return damon_stat_start(); + damon_stat_stop(); + return 0; +} + +static int __init damon_stat_init(void) +{ + int err = 0; + + damon_stat_init_called = true; + + /* probably set via command line */ + if (enabled) + err = damon_stat_start(); + return err; +} + +module_init(damon_stat_init); -- 2.39.5