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 DFB3FC5B549 for ; Wed, 4 Jun 2025 18:31:36 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 021696B0472; Wed, 4 Jun 2025 14:31:36 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id E9EF86B0473; Wed, 4 Jun 2025 14:31:35 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id D66AB6B0474; Wed, 4 Jun 2025 14:31:35 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0010.hostedemail.com [216.40.44.10]) by kanga.kvack.org (Postfix) with ESMTP id BF4736B0472 for ; Wed, 4 Jun 2025 14:31:35 -0400 (EDT) Received: from smtpin02.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay07.hostedemail.com (Postfix) with ESMTP id 70E86160527 for ; Wed, 4 Jun 2025 18:31:35 +0000 (UTC) X-FDA: 83518561350.02.B929A21 Received: from dfw.source.kernel.org (dfw.source.kernel.org [139.178.84.217]) by imf05.hostedemail.com (Postfix) with ESMTP id B581E100012 for ; Wed, 4 Jun 2025 18:31:33 +0000 (UTC) Authentication-Results: imf05.hostedemail.com; dkim=pass header.d=kernel.org header.s=k20201202 header.b=hU3vznkD; spf=pass (imf05.hostedemail.com: domain of sj@kernel.org designates 139.178.84.217 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=1749061893; 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=ONAYbBQ7GzcLvhb/mfzm7hWhlcmQ2vZbq0EUG+nJy9DmmQ21RtIkfF8FY6PoHIlaUY+u8L izKxnCf2nEPXcgF2otEOitFzpY4IcrGp6kcRii04mY4NeiDUnz89jQn+AW4QIVkoEftWhx QJ4PaQ9XZAIjnCfQ5fkAdAyvkD0V8A0= ARC-Authentication-Results: i=1; imf05.hostedemail.com; dkim=pass header.d=kernel.org header.s=k20201202 header.b=hU3vznkD; spf=pass (imf05.hostedemail.com: domain of sj@kernel.org designates 139.178.84.217 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=1749061893; a=rsa-sha256; cv=none; b=opjBq0mJ5BZ4qA4z+KOLjqiO366lvOgWsZvW7L7UOlp5OR0D8Zm2XmyEwPvvcMcrcM+Ycz Nok8GtvEQsg4NaFfVbYxe04mYw30lCT060nGkz0m6KLE8Hha61RpHB93vhFz50oUVSzjjG AhVkPDBJuvUTQCwD+lFv4U6uXO+U89o= Received: from smtp.kernel.org (transwarp.subspace.kernel.org [100.75.92.58]) by dfw.source.kernel.org (Postfix) with ESMTP id 2B0835C65A7; Wed, 4 Jun 2025 18:29:16 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 67576C4CEED; Wed, 4 Jun 2025 18:31:32 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1749061892; bh=hKn9MHEuhQIYyoRWDiRwIxmlR7BH2F01294Qax+v28s=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=hU3vznkDCsNTeiF+uurCkOF/Jd/lXzFOOJY034BGjIMGUmUDh1c7xklG+SWZvbrS4 KrYbKwaSKN2gRU4v5FWl+yiw2BwS2abIiJRgnKEBALsi5ZGEhilfnuhalzTpnVHmYu 8LhRNMd86nbzoltzqWuQs1/4Y15tekwwLAVU8cKWcu9UZj6HRSZ749dpaNkN4Ekjti Jt5mNtzh7WTmh3nccAbgKJLNukfQw4VjfzidGnULjHAgOlnP5iBnO9c1ol/IKYG5w1 qRkNsVYkXvfA6+Unw/lUNFozFW4fDthKtdU97fJJfxe3EnqyLR6Q5OHcKK3DoNh+Wd xKuDIlfCNOhzw== 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 v2 1/4] mm/damon: introduce DAMON_STAT module Date: Wed, 4 Jun 2025 11:31:24 -0700 Message-Id: <20250604183127.13968-2-sj@kernel.org> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20250604183127.13968-1-sj@kernel.org> References: <20250604183127.13968-1-sj@kernel.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Rspamd-Queue-Id: B581E100012 X-Stat-Signature: khr946p8fu4rnjazkka81xm5r39gmihd X-Rspam-User: X-Rspamd-Server: rspam04 X-HE-Tag: 1749061893-454169 X-HE-Meta: U2FsdGVkX18c2kJJbtSnW/3n4WtnhbMe0F+PkOvlpI3HZPC5p4hBIu2tXoi9UDPKII7H18oWLBC+6sSDkE8O2Wn4qilEuLCSvQytctirbgMqQkF11/r2SqjJ1bcZ76AWRfXeXkSBzjNOpfRsDnZPW2KMFsgvPlkVAJu7L1l9hcxXArn/vEoFus2ao6wUNN2zJ+zYeBUdh5rGGvD1QKVi4qrruSS5NgoksvUQgf22SO1ZWBktu5C9UJPsv9gABAh+g8uFXEMlzbisbm3y162JuMsd4kxVBFlNW6IMzj2Uf1wijYkXsQXSp2dANkHBmX1US0/Gh7vIJqEClsQ7s0qssKytKiGecZEAEKRBe/s+JpPbdvXjZtHW5059obZ6k01zOOxv7ccQsrBND0D/gpQ94hDMaYmdgjgpptzAwPXlv5K0lTJGbP/qDcpZof9EwkqDyVd4CUILgVbQyL0ybRJVX9ydUJOLGMiXdUneKlQFLg4uY03uMN0WlGBOhwEFldMVvKchJUdNbHqs9oNQFRNfqRs9EHiuhWzCXOy5l0n762Gcd16eh1om9IehXD4pB8O592Ktz6nwOMTHPmi2MRf73TFXx2NZNdmb62RUbtgWSjjRh/AaYyc6hhe2AEHPw1G8V+Wr7vvOsc4IgHM7DLagE54s6TmqKQEStwKWDqzij65LK9O/FfxtlmWzsDuoRdfBw+cj3A3IQEisxynTtklK56qNaYuJ4QZiEuVx1Oci5BQ24ejU/sVpuGDt604gZwap84yCtRWtgUwHQQQrBW7J1v3MOKDhvT7s/62s/2qzZCJMp52XETI2ycU5d5Pu86Pd5UvhQldv6QIfAdNRwHS3SGIAZzYjDsKFAdy5zyJ5/jKnMAHKFsIU+NGE7xh1IBQvGxnNe+OpTDNgNFGbYClbTG4i64uv0DQgLITBKZwIPPyVHO+X3nZqisls1z+30v+XPoUCcZXIF3iKiiVqWxA x8MiIR5z B0j+M7CSGu+Vg4J0SV4CkoCCqId4IXlpRrCHEiV9ptiOVwvhjCp0B+pb8/CwZqj4ruT8VguBnzOZKx1PD0Lm6AHkf+2r10rNSIM6NDu0ZwDT7/nBMan2hepu2LP1icoD9McMl6yqatjAo3M76Q10GBuhCnOWAYKAF4asHdJ5l42M8mNHmk6vZMCsEuI0D653fq4kcShoBUkjPTNqY5y/ILIJH4P5yH5kiC+6MGhRH7h59sml86tcacYdzkd5eNSWJLUnA8OMZcBhlwpc4z8x5GrKdZcIA/wWBzDILApxhf0eOkAwu18G/KBqeaSjdXXLiIDhb 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