From patchwork Thu Mar 20 05:39:34 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: SeongJae Park X-Patchwork-Id: 14023449 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 59CD1C36002 for ; Thu, 20 Mar 2025 05:39:49 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id ED8B6280001; Thu, 20 Mar 2025 01:39:46 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id E86D5280004; Thu, 20 Mar 2025 01:39:46 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id D4F1D280001; Thu, 20 Mar 2025 01:39:46 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0016.hostedemail.com [216.40.44.16]) by kanga.kvack.org (Postfix) with ESMTP id BBA4E280004 for ; Thu, 20 Mar 2025 01:39:46 -0400 (EDT) Received: from smtpin10.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay08.hostedemail.com (Postfix) with ESMTP id AB6CD140CF4 for ; Thu, 20 Mar 2025 05:39:47 +0000 (UTC) X-FDA: 83240827614.10.F5B2D25 Received: from tor.source.kernel.org (tor.source.kernel.org [172.105.4.254]) by imf04.hostedemail.com (Postfix) with ESMTP id 2A8C540009 for ; Thu, 20 Mar 2025 05:39:46 +0000 (UTC) Authentication-Results: imf04.hostedemail.com; dkim=pass header.d=kernel.org header.s=k20201202 header.b=Fyc9tomQ; spf=pass (imf04.hostedemail.com: domain of sj@kernel.org designates 172.105.4.254 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=1742449186; 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=y1P+LUFKpRms8lmVRSipo+cZaSNxGesVZHZEtlO7Aq4=; b=PPGN+XqG5G0HTOVC1ipY4AvY29xSVCGq+PMPG1WGrfQRY1m7V2MQOE/dcZLW7hYj3OmmEK 16GORHFTh1JL6s/bWZIWXcKF15+tYnYePfOYoWIHlO6h2W7VKKWbl6wzpAauELCqFQXzam y3q+rsG5fjzXPZWTtoreoMAo3Jf1KiY= ARC-Authentication-Results: i=1; imf04.hostedemail.com; dkim=pass header.d=kernel.org header.s=k20201202 header.b=Fyc9tomQ; spf=pass (imf04.hostedemail.com: domain of sj@kernel.org designates 172.105.4.254 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=1742449186; a=rsa-sha256; cv=none; b=DfWCX9cjf9qPyfp8oh21/1DbVYXOvg9gFomiEqoO42PGLgmzTKkWgvb1/28pfLuy4DSo0P xSkyDo5LkCSTMsIpr+5Jee9pQ4fhihxcojZw2uWqOGyHQu359gvJZUh7IW3l0KVhaI3UmT ZaC7sACRvZNZYJG/2UTWcTipGEfbfjY= Received: from smtp.kernel.org (transwarp.subspace.kernel.org [100.75.92.58]) by tor.source.kernel.org (Postfix) with ESMTP id 0B69061134; Thu, 20 Mar 2025 05:39:44 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 1A920C4CEE3; Thu, 20 Mar 2025 05:39:45 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1742449185; bh=OWte6lejDS7n5xIpsWqNW8pBu+MRjbH+R4O10AsrXCs=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Fyc9tomQ64s56+TofXY8CXmj7hPdLTha2V/olx6+ZQbTBJJanyE+TAb6+p2b94+RZ 1P64OLMK8aXnOoWxEkCbHrxkFhqEN9O2lRgKkUcrJaOLVZvsDmKf9+cMwcZAJU42t0 Vi164iO6fwcKtPiEpGv8rv+FisbgxZWnLQtk24QCtlmZYCsCiut9gIX2COawqTk/i8 ZKjsMGo4YuEOm7HbXO4mR8zpF5ZDX0YNZKq/JPeGuRQ4NRVBn+lxSAn9EYq0p3YGPJ bhCakZMystvl3krGPdFcIpMpgerUxj73uB4KopW95FsZdEn6ZrxOOrInavSdZX4WAL 0X8/1PZZdnasg== From: SeongJae Park To: Cc: SeongJae Park , Andrew Morton , damon@lists.linux.dev, kernel-team@meta.com, linux-kernel@vger.kernel.org, linux-mm@kvack.org Subject: [RFC PATCH 1/4] mm/damon/core: introduce two damos quota goal metrics for NUMA memory utilization and free space ratios Date: Wed, 19 Mar 2025 22:39:34 -0700 Message-Id: <20250320053937.57734-2-sj@kernel.org> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20250320053937.57734-1-sj@kernel.org> References: <20250320053937.57734-1-sj@kernel.org> MIME-Version: 1.0 X-Rspam-User: X-Rspamd-Server: rspam10 X-Rspamd-Queue-Id: 2A8C540009 X-Stat-Signature: m461sd9gpn1unesuqszb3eu7qf7nk4xz X-HE-Tag: 1742449186-319099 X-HE-Meta: U2FsdGVkX1+jUsPtwg+Q3QY5sKUNTMT8zBoIibBeA7iufp3WIQCjeEIQ1zOJAZOvVTE79FNzSWpbGoTLRrmf5qHBuRe+rXHqRKOw/F0tmhagGCMXtKa4mBVnLle75keX9nnijydemBLLOYFrkSIgyVyvJhyCe2fKv6RW4igqq9A0n8AhoSzhtJBoF9iS5LmoZejW6LmTbIb3vM0vUCsb5X6lYEbaBG7BkjupWEuM2U+regTPOnnfj1gak36MidDwoEqrv2oBnhniepISOzQY09b/wP30/7e1UzSV9BmROT/X3S5IGHgwTO6dPFiPogWGhInTnsu9MAMACsXCknEDuqXBjvd4Ax+7biOXyXci5clOrGB6xctHR0kD+4rPDTPNDJdY702v2qd4gCFwEcrSBdgRMQbnOk5MqNiNRnjF2dFbiNkhKmQbQOFcdiWhVmjix1xIFC64S33gEld0pu/4exOWJmSnq6S4J6dyCtF+1izu7KMyaCaTZtEs9LXFue3Uj0ymYwgviTZjUDOgBYNq9m48fjXu5M6D5QtcG0wo68eQCkbfxE8qX+4wtP8QnhffgnC/XIwgSxXilCXEJTEtYg92gbNhWymt5cH1AFcJ+BEJt351eFdrbkXglUEN9mwhYzWiX08zzKjDN+dtG9FCI7uVwfuiG4ioUD/VX6AeaQ2iBosM4U2FjyTLjyBlq6obp7DKWZFY21bd8gZIrcd/0JNqW1ajH9lqnQRzYN6TvjrnY5d9Jmn4jLg8KZFmf6TWUC47e90Am/KdVS3JxASlKaLuZHJoTr+OYqWAlRudYx9bjEFbl4fqOnwDDDuJUqsWnFUORhPQjdN3dA4ZVkx4mxThHMAffkFXgjbQT2f23ROOuiVr/cE7tzNwhQ2ocBXxSYi2o5i/s6i1Ec1RyEo6H8UtV0DhwBNyiU3E3txKv7ckUfvwT9QDgCuiH2dDInyQfT1AoArQnzyMjwWTUF5 kar5BYvS hdZzk/5TV8U8LKF5UpBg/3BGOHaHRh/ofAwRtNM/5vvh2eD7osdhewInYFLqHZVHWcR7Ki4HFJX/sJtaCnRQmySWXw+dRHkyanEyfi7cUSqddnKQj9gkjweieElH6CQX8yHCnvc17fJR+L1niH2ZxerY8MmjM/7IFgYQGhuQUp0FEVrTdomZC8bN6YCqkcZreWLbHLkHonHuJuA042rKMFftaVL22l0lX2fK+EWrKYllT4A8= 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: Utilization and free space ratios for specific NUMA nodes can be useful inputs for NUMA-specific DAMOS schemes' aggressiveness self-tuning feedback loop. Implement DAMOS quota goal metrics for such self-tuned schemes. Signed-off-by: SeongJae Park --- include/linux/damon.h | 6 ++++++ mm/damon/core.c | 27 +++++++++++++++++++++++++++ mm/damon/sysfs-schemes.c | 2 ++ 3 files changed, 35 insertions(+) diff --git a/include/linux/damon.h b/include/linux/damon.h index 9f0eec85e636..ba3604cd4d60 100644 --- a/include/linux/damon.h +++ b/include/linux/damon.h @@ -154,6 +154,8 @@ enum damos_action { * * @DAMOS_QUOTA_USER_INPUT: User-input value. * @DAMOS_QUOTA_SOME_MEM_PSI_US: System level some memory PSI in us. + * @DAMOS_QUOTA_NODE_MEM_USED_BP: MemUsed ratio of a node. + * @DAMOS_QUOTA_NODE_MEM_FREE_BP: MemFree ratio of a node. * @NR_DAMOS_QUOTA_GOAL_METRICS: Number of DAMOS quota goal metrics. * * Metrics equal to larger than @NR_DAMOS_QUOTA_GOAL_METRICS are unsupported. @@ -161,6 +163,8 @@ enum damos_action { enum damos_quota_goal_metric { DAMOS_QUOTA_USER_INPUT, DAMOS_QUOTA_SOME_MEM_PSI_US, + DAMOS_QUOTA_NODE_MEM_USED_BP, + DAMOS_QUOTA_NODE_MEM_FREE_BP, NR_DAMOS_QUOTA_GOAL_METRICS, }; @@ -170,6 +174,7 @@ enum damos_quota_goal_metric { * @target_value: Target value of @metric to achieve with the tuning. * @current_value: Current value of @metric. * @last_psi_total: Last measured total PSI + * @nid: Node id. * @list: List head for siblings. * * Data structure for getting the current score of the quota tuning goal. The @@ -188,6 +193,7 @@ struct damos_quota_goal { /* metric-dependent fields */ union { u64 last_psi_total; + int nid; }; struct list_head list; }; diff --git a/mm/damon/core.c b/mm/damon/core.c index fc1eba3da419..c4ce8e2c22c1 100644 --- a/mm/damon/core.c +++ b/mm/damon/core.c @@ -1890,6 +1890,29 @@ static inline u64 damos_get_some_mem_psi_total(void) #endif /* CONFIG_PSI */ +#ifdef CONFIG_NUMA +static __kernel_ulong_t damos_get_node_mem_bp( + struct damos_quota_goal *goal) +{ + struct sysinfo i; + __kernel_ulong_t numerator; + + si_meminfo_node(&i, goal->nid); + if (goal->metric == DAMOS_QUOTA_NODE_MEM_USED_BP) + numerator = i.totalram - i.freeram; + else /* DAMOS_QUOTA_NODE_MEM_FREE_BP */ + numerator = i.freeram; + return numerator * 10000 / i.totalram; +} +#else +static __kernel_ulong_t damos_get_node_mem_bp( + struct damos_quota_goal *goal) +{ + return 0; +} +#endif + + static void damos_set_quota_goal_current_value(struct damos_quota_goal *goal) { u64 now_psi_total; @@ -1903,6 +1926,10 @@ static void damos_set_quota_goal_current_value(struct damos_quota_goal *goal) goal->current_value = now_psi_total - goal->last_psi_total; goal->last_psi_total = now_psi_total; break; + case DAMOS_QUOTA_NODE_MEM_USED_BP: + case DAMOS_QUOTA_NODE_MEM_FREE_BP: + goal->current_value = damos_get_node_mem_bp(goal); + break; default: break; } diff --git a/mm/damon/sysfs-schemes.c b/mm/damon/sysfs-schemes.c index 9cff4ec6973f..0f338ba1db43 100644 --- a/mm/damon/sysfs-schemes.c +++ b/mm/damon/sysfs-schemes.c @@ -942,6 +942,8 @@ struct damos_sysfs_quota_goal { static const char * const damos_sysfs_quota_goal_metric_strs[] = { "user_input", "some_mem_psi_us", + "node_mem_used_bp", + "node_mem_free_bp", }; static struct damos_sysfs_quota_goal *damos_sysfs_quota_goal_alloc(void) From patchwork Thu Mar 20 05:39:35 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: SeongJae Park X-Patchwork-Id: 14023451 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 C637AC36003 for ; Thu, 20 Mar 2025 05:39:51 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 18A9A280005; Thu, 20 Mar 2025 01:39:48 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 13D6D280004; Thu, 20 Mar 2025 01:39:48 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id EF6E0280005; Thu, 20 Mar 2025 01:39:47 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0012.hostedemail.com [216.40.44.12]) by kanga.kvack.org (Postfix) with ESMTP id D2702280004 for ; Thu, 20 Mar 2025 01:39:47 -0400 (EDT) Received: from smtpin05.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay10.hostedemail.com (Postfix) with ESMTP id B5B51C0CAD for ; Thu, 20 Mar 2025 05:39:48 +0000 (UTC) X-FDA: 83240827656.05.E0D470F Received: from tor.source.kernel.org (tor.source.kernel.org [172.105.4.254]) by imf13.hostedemail.com (Postfix) with ESMTP id 30B9F20006 for ; Thu, 20 Mar 2025 05:39:47 +0000 (UTC) Authentication-Results: imf13.hostedemail.com; dkim=pass header.d=kernel.org header.s=k20201202 header.b="vIw0uP/f"; spf=pass (imf13.hostedemail.com: domain of sj@kernel.org designates 172.105.4.254 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=1742449187; 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=c0w2UMORg4ovpRS8B6FVtUnPr4JFaq9dKlryV6fOVVQ=; b=EbOul49ITKmp1hR9263+vMae0+tbRvKsERyv3jZPTv4bAzzZBFwurSM3IaKQA+tBRmAGVR egWdE4N5RaAdP1/N5pxIr38684eu7vodkQKx4DE0eWRi9/WEiEQpVVB1UODB5G3h05R7wd JzJzdEP4kSocaXTdF3TojRdP4cPiPi8= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1742449187; a=rsa-sha256; cv=none; b=1A+j5md5avrk8SEHxHSGqSrDeOWVFgDBi2UT4pvFUYUr2PD6alNNx9V2qFybRspkIXtiHJ a7j+WueRTHeiTKtyeu8aEPN9M1k8eSvHqQX3364nTxtoUWY2ZUiFnshF7cQJgHirQQzqod QLUypUFQAokHjCd/FdNLUjQlB4REqP4= ARC-Authentication-Results: i=1; imf13.hostedemail.com; dkim=pass header.d=kernel.org header.s=k20201202 header.b="vIw0uP/f"; spf=pass (imf13.hostedemail.com: domain of sj@kernel.org designates 172.105.4.254 as permitted sender) smtp.mailfrom=sj@kernel.org; dmarc=pass (policy=quarantine) header.from=kernel.org Received: from smtp.kernel.org (transwarp.subspace.kernel.org [100.75.92.58]) by tor.source.kernel.org (Postfix) with ESMTP id 1CDA06115A; Thu, 20 Mar 2025 05:39:45 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 2A287C4CEDD; Thu, 20 Mar 2025 05:39:46 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1742449186; bh=00PQCLtovSAjyu/3Lndfh7V4VIWve/5SxCLnZNKDSzg=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=vIw0uP/fO84iFLnADRPGs235ZTy+7Ert1btRyCCAzUmsM2rr26wGlPrAs5Fq6xwfr pV6RrGnuZtMXEDhldoQaQNo26/o0EY1i/LhBf6seZMXn8hctmfKO6euFwRPrtpwvBv j71/okQQdhFBK2ohC9Fp8lgQwMR45BTp4PljsrzyY5OCRW43MwyTA9a/PSO14RVEs6 krR4BM+A0DbqqFdSM3iyagCIWHfhnbWLwIDlCPSWy5k7W6DyLl9b9r/By4IDFrWK49 bEczofxfcKczVftWHK4oI4p2t1ptgywoAnFyduYWXPyYBb9nb0Dn2Cec2+np8KMpmt jmZlEKR9feEsg== From: SeongJae Park To: Cc: SeongJae Park , Andrew Morton , damon@lists.linux.dev, kernel-team@meta.com, linux-kernel@vger.kernel.org, linux-mm@kvack.org Subject: [RFC PATCH 2/4] mm/damon/sysfs-schemes: implement file for quota goal nid parameter Date: Wed, 19 Mar 2025 22:39:35 -0700 Message-Id: <20250320053937.57734-3-sj@kernel.org> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20250320053937.57734-1-sj@kernel.org> References: <20250320053937.57734-1-sj@kernel.org> MIME-Version: 1.0 X-Rspam-User: X-Rspamd-Server: rspam01 X-Rspamd-Queue-Id: 30B9F20006 X-Stat-Signature: fa7gfyy3s7nt9kr3asf4519b5gtpm8xr X-HE-Tag: 1742449187-435815 X-HE-Meta: U2FsdGVkX19/aibeGfoCgHPSSEdDL/JePSgVlh3H+c4YW4Gh3+f8VrEaCeql7CBAY82fjgwrPnHZNfrmHRUGJiOZaAkCACWz6f39QbqDzCID+0uyWkdn/LjK/znXkXqCPvIbXqxp8Z5X94Y3qU16uy6AO3TqOuTwl+BjxuVkY4SJ398Kx2+/o7LKSwV0ebQlf6uKKxCvRDGE4Bm0vxmRvu/CPHUS7WfzqYN9+wsTNogWpQ21aSe44gWNxl0k7fS1wFfy10qcxURC2n7+d/2EsfjmsovkCbKpOOGSYmhIinpP41v3FdkI00Ql3js5+eCRWmcoekwI6JTjPbkL86XAggEeb2ecRrp1zD/iQpEslOROPeuF6BfMJ7mdZAI8TZmicqjQhqOSc5yMLm3l08PqHSTUreKGgFXde3c8Gyky9efNiLTJia5609ynCMit7i0qOhHQQpZPogs6FJisodpfma49X2KvnaXLB6SIFdc8TqiO63y7PahIr3eZNJvSeF7npxw0TUJ/QlVpEgBTiK0vQsbVFseJZfq1+thoZ9SX7019DF+2O0jAlGJlLnS0oujbvFlRXeAiUt/jKdOfzgVCdWLIx0av5qPPA3rg8cZjdR2UkVCkDJvWtri0Xy2ZjKkddZFlHcSxTWeyeF/nTf8Q9O9Fuf6TV1azzIFk1b1o3y/elIKsxW+ER4Vtptsr9Ad6XHvhcoUeHkd6g7cSXZcd3Z9ZELFEirEh5fKHczE0C3F+bb2qrA4noZOjGhY/GGeT9HH04i3uWGrhR6clHO23cVoSfCo7CX3zMdGEqH4yZzHUC+D09lRFJx6gUswAwnVgyg537HnbuPiO67dpqdM3tW0qtQ+iHkMDkm9WvuuYxlltV8HEUTiIhOdmCuFQ45R2xQ+T3H1d66Dty+BgTPfcl/ENXifNTX9l5hwNeQ31ooYqy12wgUr9qBWmGgxSSlETULpIPI+P/zYansrqB+e f7duas9o MjOyBslVGDM0V7rs+7FZXeslosdZE1oE5qw5YwleFZFN40GQFautnChGeaAqGXOPG4aLgPajMfuxcyGf8KwlvRVWK3aUg0sbGZxuS2ReSt1NRlpAkumTcbBy6U6utjO3/IX051vtJhRh4536dfpRqFqwE0EsWFn6S7QuVDxa9rKyi+3FlZcp34me3pokC0iV14dgcaqFgt8+ocx8Vi9PvqeDUf81pUgch/9Ga50/usgtD+dQ= 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: Only DAMON core kernel API callers can use the DAMOS quota goal metrics for specific NUMA node's utilization and free ratios. Implement DAMON sysfs files to receive the node id for the goals. Signed-off-by: SeongJae Park --- mm/damon/sysfs-schemes.c | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/mm/damon/sysfs-schemes.c b/mm/damon/sysfs-schemes.c index 0f338ba1db43..8c51906c8268 100644 --- a/mm/damon/sysfs-schemes.c +++ b/mm/damon/sysfs-schemes.c @@ -936,6 +936,7 @@ struct damos_sysfs_quota_goal { enum damos_quota_goal_metric metric; unsigned long target_value; unsigned long current_value; + int nid; }; /* This should match with enum damos_quota_goal_metric */ @@ -1016,6 +1017,28 @@ static ssize_t current_value_store(struct kobject *kobj, return err ? err : count; } +static ssize_t nid_show(struct kobject *kobj, + struct kobj_attribute *attr, char *buf) +{ + struct damos_sysfs_quota_goal *goal = container_of(kobj, struct + damos_sysfs_quota_goal, kobj); + + /* todo: return error if the goal is not using nid */ + + return sysfs_emit(buf, "%d\n", goal->nid); +} + +static ssize_t nid_store(struct kobject *kobj, + struct kobj_attribute *attr, const char *buf, size_t count) +{ + struct damos_sysfs_quota_goal *goal = container_of(kobj, struct + damos_sysfs_quota_goal, kobj); + int err = kstrtoint(buf, 0, &goal->nid); + + /* feed callback should check existence of this file and read value */ + return err ? err : count; +} + static void damos_sysfs_quota_goal_release(struct kobject *kobj) { /* or, notify this release to the feed callback */ @@ -1031,10 +1054,14 @@ static struct kobj_attribute damos_sysfs_quota_goal_target_value_attr = static struct kobj_attribute damos_sysfs_quota_goal_current_value_attr = __ATTR_RW_MODE(current_value, 0600); +static struct kobj_attribute damos_sysfs_quota_goal_nid_attr = + __ATTR_RW_MODE(nid, 0600); + static struct attribute *damos_sysfs_quota_goal_attrs[] = { &damos_sysfs_quota_goal_target_metric_attr.attr, &damos_sysfs_quota_goal_target_value_attr.attr, &damos_sysfs_quota_goal_current_value_attr.attr, + &damos_sysfs_quota_goal_nid_attr.attr, NULL, }; ATTRIBUTE_GROUPS(damos_sysfs_quota_goal); From patchwork Thu Mar 20 05:39:36 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: SeongJae Park X-Patchwork-Id: 14023452 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 283DBC28B30 for ; Thu, 20 Mar 2025 05:39:54 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id B1D18280006; Thu, 20 Mar 2025 01:39:49 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id ACB0B280004; Thu, 20 Mar 2025 01:39:49 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 920E9280006; Thu, 20 Mar 2025 01:39:49 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0013.hostedemail.com [216.40.44.13]) by kanga.kvack.org (Postfix) with ESMTP id 6DAF0280004 for ; Thu, 20 Mar 2025 01:39:49 -0400 (EDT) Received: from smtpin16.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay06.hostedemail.com (Postfix) with ESMTP id 6A197B872A for ; Thu, 20 Mar 2025 05:39:50 +0000 (UTC) X-FDA: 83240827740.16.09F0AE9 Received: from sea.source.kernel.org (sea.source.kernel.org [172.234.252.31]) by imf24.hostedemail.com (Postfix) with ESMTP id E83E418000F for ; Thu, 20 Mar 2025 05:39:48 +0000 (UTC) Authentication-Results: imf24.hostedemail.com; dkim=pass header.d=kernel.org header.s=k20201202 header.b=q3UdBg7N; spf=pass (imf24.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=1742449189; 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=etX38YVZjfUYd7HQnUizEaecExuhG1GRdEiUGfvBTMc=; b=qCdoGm0gwREVtoNxAotrH4n2anEBqkUBk7MhACzHE5Xq6cI/+P4K+nHxwqRQ9dtlJRnDzY 4S038PkLCOswwnjlhoIDmnuY7gamXOvH8WqhQTER9IXbrx6aPF9HiZAIWVS0cMwJ/8IgZH vxB1uWoi2RpJIprcQC45JxzAa+A1Ars= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1742449189; a=rsa-sha256; cv=none; b=2Y6O3oM0te39a51fqsD+fobSx3Elp8gxHGse62YTQucQ+A1I6SIszfZ8Dzy0+axVIIajKu LVv0C0Bf8DxWs5fIc+JpC3Hu2dzVoVBpS0J+OrdLfuS0Otsj75UlZCg6xqAh02M/qZg8Va eDJ1I+KyrXnDox7Oz5ttKG42AhmsQ/A= ARC-Authentication-Results: i=1; imf24.hostedemail.com; dkim=pass header.d=kernel.org header.s=k20201202 header.b=q3UdBg7N; spf=pass (imf24.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 Received: from smtp.kernel.org (transwarp.subspace.kernel.org [100.75.92.58]) by sea.source.kernel.org (Postfix) with ESMTP id 07C4C43ADC; Thu, 20 Mar 2025 05:39:47 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 45791C4CEEC; Thu, 20 Mar 2025 05:39:47 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1742449187; bh=XQaaK4k+JMUnTnVG3VsB0CorNexnddJX0Ik+pe2BQNA=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=q3UdBg7NUn2KJfiPTiy4xitiLKXZyJ9KCW0pGb2YpljslkUGavw7Hz1A9+QTikZuh 95N4Z9LwkdglOzUKA5qla1QGc9Bg59LBHcBXuJKpdMmZz9m8VbzuuEXZtWw7pqqutN 0ns5GIeZKr6gRh34POdwaW9Tpfnhcn2hEQX0OBGgkIQgCGqGEMHrNLdELRDnjSU1vP XKfHhbW3OEh6cC1ghgs6xenERVoDnvmbWTsDLW7GEuR1VZpLTIT6JPc2ODo8sef7ut wV/8KJoZtrgxym1XE3aY9yYlhyEr9Prm1XY0i5GHDS55EX1NxAIfZeuiDJH2qNfEXu XNS5UeA09+4og== From: SeongJae Park To: Cc: SeongJae Park , Andrew Morton , damon@lists.linux.dev, kernel-team@meta.com, linux-kernel@vger.kernel.org, linux-mm@kvack.org Subject: [RFC PATCH 3/4] mm/damon/sysfs-schemes: connect damos_quota_goal nid with core layer Date: Wed, 19 Mar 2025 22:39:36 -0700 Message-Id: <20250320053937.57734-4-sj@kernel.org> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20250320053937.57734-1-sj@kernel.org> References: <20250320053937.57734-1-sj@kernel.org> MIME-Version: 1.0 X-Rspam-User: X-Rspamd-Server: rspam02 X-Rspamd-Queue-Id: E83E418000F X-Stat-Signature: 1wbxxxpaomj9rwkjj3af1r6nbxreg7eo X-HE-Tag: 1742449188-253416 X-HE-Meta: U2FsdGVkX1+O7e212PxJRRUeKtb0Gkcz8y2jnf6axXtx5ur5QFX9sUU1iLMZco4406sCqMGL3zV+5ulOJU5x2dsacAtOWhW4iIEjIySyZ3qoKx3Za79iuosN7i4cHj4A2HHnMTX8/J9gOcu0Ia30bEiLp4KzWJtAvh+j8Vc/6XsGE7B+jw5Uk2uCiFRmP/Qnp0tQ6mAH2qBwkA5R0mDEdUkAMte99ZOMxGuwjjS8Eh0w9lVnj7LH/ThzW2XXSR9Zll+o6rbjFWCrUOORFxUMW0baxM6M9TXJN+JfHobca+EXR9qbTO6Z+krG71mzUARjfePCvfnPGFcXpT1SfnQ3qQ/uTgTd2Zxo/5jKPi/KI0RRRoKnMO12WsYoxR0CNtoKJZp+DaiGtKSFh6+92i0LCA0NnRup+l0iZ1+YlHsowIekfwygEG9qb46iXw79yOBci17NiVprLFwBRk1vCABWWRsLSBI4ebYWV/JYXI0uX4hXQ8rML0qpRalsFKMM7/Rb2Y3goqkXZJxJVCv+nZdgluW1FvRbBScc+kjAYer+eEId9C8+OUZjQu5nVsH+VfAA3zHP36LB5xUuQjtDNRxVHqb6UdndrnlsWWPoMRVLE+uBedu9atWTXwe2JnkBofvQyNwjLhMKH6krbHa2gnHjVAD2cvEv48gsG/WcgB2yJ3ud8AhDIZKMk5EYFFTsLLeQXKtv+P0DGifwzl/cUcXd1Z+F9D1RR5Zbuh+pvuDRBcTqdbCdbqpivyWPbJEEKEt2EFlXDjtPeOqec9mHpCWEdjo/sgCG57ThwdbUBjIdJllSh13S8OXaeRmsVHFosU0tsTc21T28gUVij7VmG9mFBQIEaHhBxbDeHSq8p7Ns6ZdItCSygEgzSZm9pHgUoC+tjWYvxpa80RLa2ui0WdeK0TEzO2Ml4LmrsxPYXDOxuIr/Ix7oxLFUXqFJ2CU7+dYC5TFHel7AMShWOU6CuyL PjOhclQU KGDEp 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: DAMON sysfs interface file for DAMOS quota goal's node id argument is not passed to core layer. Implement the link. Signed-off-by: SeongJae Park --- mm/damon/sysfs-schemes.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/mm/damon/sysfs-schemes.c b/mm/damon/sysfs-schemes.c index 8c51906c8268..e85559b16d6e 100644 --- a/mm/damon/sysfs-schemes.c +++ b/mm/damon/sysfs-schemes.c @@ -2153,8 +2153,17 @@ static int damos_sysfs_add_quota_score( sysfs_goal->target_value); if (!goal) return -ENOMEM; - if (sysfs_goal->metric == DAMOS_QUOTA_USER_INPUT) + switch (sysfs_goal->metric) { + case DAMOS_QUOTA_USER_INPUT: goal->current_value = sysfs_goal->current_value; + break; + case DAMOS_QUOTA_NODE_MEM_USED_BP: + case DAMOS_QUOTA_NODE_MEM_FREE_BP: + goal->nid = sysfs_goal->nid; + break; + default: + break; + } damos_add_quota_goal(quota, goal); } return 0; From patchwork Thu Mar 20 05:39:37 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: SeongJae Park X-Patchwork-Id: 14023453 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 E3D74C28B30 for ; Thu, 20 Mar 2025 05:39:56 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id C0446280007; Thu, 20 Mar 2025 01:39:50 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id B60CF280004; Thu, 20 Mar 2025 01:39:50 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 9B7CB280007; Thu, 20 Mar 2025 01:39:50 -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 6DC2A280004 for ; Thu, 20 Mar 2025 01:39:50 -0400 (EDT) Received: from smtpin20.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay03.hostedemail.com (Postfix) with ESMTP id 5D8B9AA92B for ; Thu, 20 Mar 2025 05:39:51 +0000 (UTC) X-FDA: 83240827782.20.76E6ECB Received: from sea.source.kernel.org (sea.source.kernel.org [172.234.252.31]) by imf26.hostedemail.com (Postfix) with ESMTP id A12D214000B for ; Thu, 20 Mar 2025 05:39:49 +0000 (UTC) Authentication-Results: imf26.hostedemail.com; dkim=pass header.d=kernel.org header.s=k20201202 header.b=LilgjRVh; dmarc=pass (policy=quarantine) header.from=kernel.org; spf=pass (imf26.hostedemail.com: domain of sj@kernel.org designates 172.234.252.31 as permitted sender) smtp.mailfrom=sj@kernel.org ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1742449189; a=rsa-sha256; cv=none; b=gmkoIlTGLXJsBBnBPhYmvM/of7oU54SeJVIp45POeveN0AfvYHtbRzmwJ7db/4qYpWSCrg 2LhXc1FkeFV3RTrDrCb57KpZWp0CDPTTgqVjpotsMcqrBhM2Np41zAAGKj4S7eIQf8cn6n HG+iFYYmtdI7NjLe+R3Pt2a9HKxfz1c= ARC-Authentication-Results: i=1; imf26.hostedemail.com; dkim=pass header.d=kernel.org header.s=k20201202 header.b=LilgjRVh; dmarc=pass (policy=quarantine) header.from=kernel.org; spf=pass (imf26.hostedemail.com: domain of sj@kernel.org designates 172.234.252.31 as permitted sender) smtp.mailfrom=sj@kernel.org ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1742449189; 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=vuv0OhORYu/of6BSIAmiI7Qh3ttGQoHiIwJSqXYJ70E=; b=DSHemM0JZUx1gC/aSZXlMwlvdTZOKINwziS1AjxL9jSUH3gxC57dbYZl8pgko69O/VXwF7 zd6oM/QZzLrtAPpSgXr0ZMxu113aPsTa/nYW24dCz4dXdnADLIG0C/vDvlv5sIviGCwIKg AVOURmbCcgKkdLXrJoSQAT6hPKxHv60= Received: from smtp.kernel.org (transwarp.subspace.kernel.org [100.75.92.58]) by sea.source.kernel.org (Postfix) with ESMTP id 379FA43AB7; Thu, 20 Mar 2025 05:39:48 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 58F54C4CEEC; Thu, 20 Mar 2025 05:39:48 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1742449188; bh=Y3dAxBX8HTBcmXTfevqW10FoZFkNzFdE4brVy2x1Zu4=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=LilgjRVhZdDVtaHBAl9itceBOPwxnAvSmvhS6PZXVbHgxEzIcjHc4vFP7D0GiZrVO +LZ9eFcFZ/zRtvsBixms6OOo2kwhSGNd3TehNj5kvsNyHby1iHdHPgGg9FU6d7i43b wVYX8eTWHtL/vQNl9spze8dsiAbz34eISctHWv+eCE2IWCtymRxUtGDkO4kHLlVM9J WgOSsB9D4oCG+4RtWDoHMPL4a5lqG7BlCMullmYhfZQpZtudLBT9BR02Ld76zjGoRw yjRsO2Ua0C8AelEeCJvdgcl8A2h5PAbM1sxtAxDrYrS5yLSiutkfqa4XnchIY+Fp3d KqvZC0/4zxFSQ== From: SeongJae Park To: Cc: SeongJae Park , damon@lists.linux.dev, kernel-team@meta.com, linux-kernel@vger.kernel.org, linux-mm@kvack.org Subject: [RFC PATCH 4/4] samples/damon: implement a DAMON module for memory tiering Date: Wed, 19 Mar 2025 22:39:37 -0700 Message-Id: <20250320053937.57734-5-sj@kernel.org> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20250320053937.57734-1-sj@kernel.org> References: <20250320053937.57734-1-sj@kernel.org> MIME-Version: 1.0 X-Rspamd-Server: rspam07 X-Rspam-User: X-Stat-Signature: baof9qmqqcu4axiqc795jb6ubf7dctua X-Rspamd-Queue-Id: A12D214000B X-HE-Tag: 1742449189-878553 X-HE-Meta: U2FsdGVkX19rEf4PAy/AFuHWLIOeHikD/yKVxmD7zkRorW3U+p1/KchVL8lQVJgb2HkJkNvcpnKG6uIK2iHV+XcLRc9XSoOAFVvKMqTFpYbrusfhgkUvwLnHyqUnmidXwhtGynrA1Ecbc4LGM3DIO3EjqdBmW4wlA5Z7Z6GEOI2oZ+vyXQsnsbMOnMDsLlNX0A2xlacE7o0lrWnpyXlcZzuo5GRWdxNrbtyu07MTlyMX3v6PjiGGxBja8gn2IMQ7hgkGNbsk8CGpiJbTHNpLH9u0jUHI6/Ga1J6gRudgsvSLkkMIC7xgTSuLBaJHrGr0+QQyzR/UOez7WWWGk10iFbs8OfaK6fjwRe4Hc4jpsEXZag47jxh4yoIT/GE1eJya5w2k0D3wC+bwUIyzhyU6NE2jwELbUNKbfoi+kQ4LNWmXnmp/eIsGhclUgNqvlokBPCYpz4UiL0Wz4h/Y9jVD27jlQ6yq43H4t4ztuFk479N4zoMYUOe2lnppRYB1IScdFVM/vhtQVqpctS57UL/Pptko9vHPexhqJQnZ9j9WGGpWCk4TOPKOGJssnY7RMFrUUMZHnKh9APcL8khcSLk7bsbQ/EJEUv6qJAl7Fe+6LfKkwTX8+cAgWG1D/Y9BrL1N/l1gl4wY8ogB5gOOQ+yYrsMyZiMKolgUk90YWEoRSoJlYNI1kD2LXJblmAEXOKzkCb4IWV6TB+rV7Wb6O7NFa2+Kz0b/XGSJ3DoiHm9hFZt2zU2unqHoMJDT2TlwVmK72TFHuIsP0Y8cyhi2tKKgeWRnM8PaR52cQyFT6zQY1kx/pAHGf5ZhKDeUZ54LOSWFuVjFB31ohxJ0ZsD7E1Cb+9iz8dQjU+DJ+RgdPBi/0lY3Ka2XXAyywSxGFDyzBG+EwlQiPGTwbzxHi+Eda4nK39wDANUCJC3lFJQPfK+Qk8A8golQ3EH64YhjNWX0UmG4+kuyluH7y0lR5hjSFco Q/JRvDN/ Krcqo5RVOMCmIHYwgwKY+ZuPKhgwriGnVWEOhblGQmYe3E/LEtmSmaGwOYyEUrOxS71I5kFhqdIuJgs/nauo8fzo+Y66p0cRjjzkbSDTA6Bpa34LFDk1aDlZZgsS7Gnv1c+WhW/wczLU9WRg/+eAajA1hxQuvti8qwTHjP0xqt/HCPTZTTNw0T9xx9kLcOJQaD2Fg4cKuUmHHxtugcM4GQbW4CRCIiB5reR8g7yeTa4vAJqE= 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: Implement a sample DAMON module that shows how self-tuned DAMON-based memory tiering can be written. It is a sample since the purpose is to gives an idea about how it can be implemented, rather than be used as is. Especially, the production purpose module would need to find memory tiers and set the scheme target address ranges automatically. Signed-off-by: SeongJae Park --- samples/damon/Kconfig | 13 ++++ samples/damon/Makefile | 1 + samples/damon/mtier.c | 167 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 181 insertions(+) create mode 100644 samples/damon/mtier.c diff --git a/samples/damon/Kconfig b/samples/damon/Kconfig index 564c49ed69a2..cbf96fd8a8bf 100644 --- a/samples/damon/Kconfig +++ b/samples/damon/Kconfig @@ -27,4 +27,17 @@ config SAMPLE_DAMON_PRCL If unsure, say N. +config SAMPLE_DAMON_MTIER + bool "DAMON sample module for memory tiering" + depends on DAMON && DAMON_PADDR + help + Thps builds DAMON sample module for memory tierign. + + The module assumes the system is constructed with two NUMA nodes, + which seems as local and remote nodes to all CPUs. For example, + node0 is for DDR5 DRAMs connected via DIMM, while node1 is for DDR4 + DRAMs connected via CXL. + + If unsure, say N. + endmenu diff --git a/samples/damon/Makefile b/samples/damon/Makefile index 7f155143f237..72f68cbf422a 100644 --- a/samples/damon/Makefile +++ b/samples/damon/Makefile @@ -2,3 +2,4 @@ obj-$(CONFIG_SAMPLE_DAMON_WSSE) += wsse.o obj-$(CONFIG_SAMPLE_DAMON_PRCL) += prcl.o +obj-$(CONFIG_SAMPLE_DAMON_MTIER) += mtier.o diff --git a/samples/damon/mtier.c b/samples/damon/mtier.c new file mode 100644 index 000000000000..3390b7d30c26 --- /dev/null +++ b/samples/damon/mtier.c @@ -0,0 +1,167 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * memory tiering: migrate cold pages in node 0 and hot pages in node 1 to node + * 1 and node 0, respectively. Adjust the hotness/coldness threshold aiming + * resulting 99.6 % node 0 utilization ratio. + */ + +#define pr_fmt(fmt) "damon_sample_mtier: " fmt + +#include +#include +#include +#include + +static unsigned long node0_start_addr __read_mostly; +module_param(node0_start_addr, ulong, 0600); + +static unsigned long node0_end_addr __read_mostly; +module_param(node0_end_addr, ulong, 0600); + +static unsigned long node1_start_addr __read_mostly; +module_param(node1_start_addr, ulong, 0600); + +static unsigned long node1_end_addr __read_mostly; +module_param(node1_end_addr, ulong, 0600); + +static int damon_sample_mtier_enable_store( + const char *val, const struct kernel_param *kp); + +static const struct kernel_param_ops enable_param_ops = { + .set = damon_sample_mtier_enable_store, + .get = param_get_bool, +}; + +static bool enable __read_mostly; +module_param_cb(enable, &enable_param_ops, &enable, 0600); +MODULE_PARM_DESC(enable, "Enable of disable DAMON_SAMPLE_MTIER"); + +static struct damon_ctx *ctxs[2]; + +static struct damon_ctx *damon_sample_mtier_build_ctx(bool promote) +{ + struct damon_ctx *ctx; + struct damon_target *target; + struct damon_region *region; + struct damos *scheme; + struct damos_quota_goal *quota_goal; + struct damos_filter *filter; + + ctx = damon_new_ctx(); + if (!ctx) + return NULL; + /* + * 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); + region = damon_new_region( + promote ? node1_start_addr : node0_start_addr, + promote ? node1_end_addr : node0_end_addr); + if (!region) + goto free_out; + damon_add_region(region, target); + + scheme = damon_new_scheme( + /* access pattern */ + &(struct damos_access_pattern) { + .min_sz_region = PAGE_SIZE, + .max_sz_region = ULONG_MAX, + .min_nr_accesses = promote ? 1 : 0, + .max_nr_accesses = promote ? UINT_MAX : 0, + .min_age_region = 0, + .max_age_region = UINT_MAX}, + /* action */ + promote ? DAMOS_MIGRATE_HOT : DAMOS_MIGRATE_COLD, + 1000000, /* apply interval (1s) */ + &(struct damos_quota){ + /* 200 MiB per sec by most */ + .reset_interval = 1000, + .sz = 200 * 1024 * 1024, + /* ignore size of region when prioritizing */ + .weight_sz = 0, + .weight_nr_accesses = 100, + .weight_age = 100, + }, + &(struct damos_watermarks){}, + promote ? 0 : 1); /* migrate target node id */ + if (!scheme) + goto free_out; + damon_set_schemes(ctx, &scheme, 1); + quota_goal = damos_new_quota_goal( + promote ? DAMOS_QUOTA_NODE_MEM_USED_BP : + DAMOS_QUOTA_NODE_MEM_FREE_BP, + promote ? 9970 : 50); + if (!quota_goal) + goto free_out; + quota_goal->nid = 0; + damos_add_quota_goal(&scheme->quota, quota_goal); + filter = damos_new_filter(DAMOS_FILTER_TYPE_YOUNG, true, promote); + if (!filter) + goto free_out; + damos_add_filter(scheme, filter); + return ctx; +free_out: + damon_destroy_ctx(ctx); + return NULL; +} + +static int damon_sample_mtier_start(void) +{ + struct damon_ctx *ctx; + + ctx = damon_sample_mtier_build_ctx(true); + if (!ctx) + return -ENOMEM; + ctxs[0] = ctx; + ctx = damon_sample_mtier_build_ctx(false); + if (!ctx) { + damon_destroy_ctx(ctxs[0]); + return -ENOMEM; + } + ctxs[1] = ctx; + return damon_start(ctxs, 2, true); +} + +static void damon_sample_mtier_stop(void) +{ + damon_stop(ctxs, 2); + damon_destroy_ctx(ctxs[0]); + damon_destroy_ctx(ctxs[1]); +} + +static int damon_sample_mtier_enable_store( + const char *val, const struct kernel_param *kp) +{ + bool enabled = enable; + int err; + + err = kstrtobool(val, &enable); + if (err) + return err; + + if (enable == enabled) + return 0; + + if (enable) + return damon_sample_mtier_start(); + damon_sample_mtier_stop(); + return 0; +} + +static int __init damon_sample_mtier_init(void) +{ + return 0; +} + +module_init(damon_sample_mtier_init);