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 01628C04FFE for ; Mon, 20 May 2024 14:31:04 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 423AA6B0088; Mon, 20 May 2024 10:31:04 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 3AC3F6B0089; Mon, 20 May 2024 10:31:04 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 1B1E66B008A; Mon, 20 May 2024 10:31:04 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0017.hostedemail.com [216.40.44.17]) by kanga.kvack.org (Postfix) with ESMTP id F09A86B0088 for ; Mon, 20 May 2024 10:31:03 -0400 (EDT) Received: from smtpin29.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay08.hostedemail.com (Postfix) with ESMTP id 92E66140E55 for ; Mon, 20 May 2024 14:31:03 +0000 (UTC) X-FDA: 82139011206.29.FEDE614 Received: from mail-pl1-f179.google.com (mail-pl1-f179.google.com [209.85.214.179]) by imf04.hostedemail.com (Postfix) with ESMTP id D7A4D40003 for ; Mon, 20 May 2024 14:31:01 +0000 (UTC) Authentication-Results: imf04.hostedemail.com; dkim=pass header.d=ajou.ac.kr header.s=google header.b=gaUb6cWs; spf=pass (imf04.hostedemail.com: domain of tome01@ajou.ac.kr designates 209.85.214.179 as permitted sender) smtp.mailfrom=tome01@ajou.ac.kr; dmarc=pass (policy=reject) header.from=ajou.ac.kr ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1716215461; 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=SgG60yw+644Q9f46uPp0EOPx6ucs+cfRwGlUwKjTcF8=; b=sCAj5N2ESfoGW3tFfQYZpEj0XRQW2vk0Pwv6FzH28+1sh4q36NqlPjzRGGVaTmGva9kNpc ESNBaH1dLD4FBEXS4L4ctm1gtqQUJd+kOqk5KoaQZuap7Zbopxgln1oAGcoSb2m9ksXRtA f1752VjOxtE/im4Tupc1D7Iz6qHjIU4= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1716215461; a=rsa-sha256; cv=none; b=SCG4WksgKu6cijbiOfc12m5rY2ScuIMD1kiayaKPLfgwK2QTeFSQOORdrSXLg3Ck0iiUAP 24TM+Vasc4jQmCyK7jZHIPN0qIZBajGij3nxi00Iem7E+w3v2kf+ZKa9GoEvNPagIU44Vt zN+KjYaxW/SRq4ppl4ew5JTc7O6fkps= ARC-Authentication-Results: i=1; imf04.hostedemail.com; dkim=pass header.d=ajou.ac.kr header.s=google header.b=gaUb6cWs; spf=pass (imf04.hostedemail.com: domain of tome01@ajou.ac.kr designates 209.85.214.179 as permitted sender) smtp.mailfrom=tome01@ajou.ac.kr; dmarc=pass (policy=reject) header.from=ajou.ac.kr Received: by mail-pl1-f179.google.com with SMTP id d9443c01a7336-1ee5235f5c9so73323885ad.2 for ; Mon, 20 May 2024 07:31:01 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ajou.ac.kr; s=google; t=1716215461; x=1716820261; darn=kvack.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=SgG60yw+644Q9f46uPp0EOPx6ucs+cfRwGlUwKjTcF8=; b=gaUb6cWskV8kru/5ASc3JiaxInQLPn7RkIHIYYvZnns3NwWqjuZzP8JKaWMs0QqNEq 7YSuhoNfzIJS2uZ3JWx3dx7Xmh/cw4W7Pse0s5wDXekcLh7IBXaapABhIuBDJxELPL97 Ft1evPIbL8vFeJXJSOLdtvWPhzMHgCU7lcBt8= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1716215461; x=1716820261; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=SgG60yw+644Q9f46uPp0EOPx6ucs+cfRwGlUwKjTcF8=; b=QY8Ys1dvnF+Ct2jtGx5gGHQJSm/etjCb9FaiL7gkESwPFk/+3F3MXAQ2r7K0ka7u30 SWam2iQ9InLshrzEt7pxY9a8xYhmXoFUiZruwVQdeOE9pUbfIs1ZuKMxRcxRORwpSho9 f8Kmgb2dOoGD+3/6+H1L+qPof1XrJKugQcWTbTmUDhgrvbTQ2bEewKaMxIH6jhdvYDxw A2elT4ycj8GOMp36C8+l95HmChdVQx5DhHc4cXbEkUnLPR/qA+abxd/1hIUtDQhjQU+b wPuyK4CuGxAgxZxRQZqasAhXCAciVc1bJ2tQCtVhoHkoN2w2FHWi7VL92fAvRnmjBj1j VNsw== X-Forwarded-Encrypted: i=1; AJvYcCUyTyqeMIRfTU4rrsPoe2sXn3MGug9Lt/MHay6++rC0IGVnNrCKsqCuQDfDud6wd3l+VU17uDkGeC0Q8JH88bAlYWk= X-Gm-Message-State: AOJu0YzVtWvmzo1afOTE7Xi/IdOXrW0A6j54AACyLoj327D1ll73CAOs dZxSFZIyT2ih0I7mtG5cbvzWu7A3lfwNziGPHUcgh4jEWvMO+AfdmjhCC8G1cNHlfbxWmmzuWoF 2g/Q= X-Google-Smtp-Source: AGHT+IHhyPIYEInSJJMQSqbbK4ccOXIi7SNOnrFzx6T0fm27CNPx6pkiV3fzoajJO67ANnolLzKRgw== X-Received: by 2002:a05:6a21:3414:b0:1b1:d371:335d with SMTP id adf61e73a8af0-1b1d3713568mr4247425637.19.1716215460580; Mon, 20 May 2024 07:31:00 -0700 (PDT) Received: from swarm07.ajou.ac.kr ([210.107.197.31]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-6f4d2aa017dsm19714531b3a.96.2024.05.20.07.30.58 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 20 May 2024 07:31:00 -0700 (PDT) From: Jonghyeon Kim To: SeongJae Park , damon@lists.linux.dev, linux-mm@kvack.org Cc: Andrew Morton , linux-kernel@vger.kernel.org, Jonghyeon Kim Subject: [RFC PATCH v2 1/3] mm/damon: Add new metric type and target node for watermark Date: Mon, 20 May 2024 14:30:36 +0000 Message-Id: <20240520143038.189061-2-tome01@ajou.ac.kr> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240520143038.189061-1-tome01@ajou.ac.kr> References: <20240520143038.189061-1-tome01@ajou.ac.kr> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Rspamd-Server: rspam03 X-Rspamd-Queue-Id: D7A4D40003 X-Rspam-User: X-Stat-Signature: u8cstcrjkrgerehdw3akz5f8smmik4hx X-HE-Tag: 1716215461-68904 X-HE-Meta: U2FsdGVkX1/XdBxeia3btKeNwQ3MRzsuf1x4GKEun+p8WOiSYyBXOC7yqHwtjqXXeHk+nhJXIDHYsSHGad7Y80tIubNrAnEe3Exw9XkgvJ/58SStUbUTENAtDQlfydtx45jmXX2GFCoysWQKEXguWhCBUrn/3TOZRALmrF6veMtqvEovywH1GmphCmnMZBjmvjHpumdSm+8pxjIrQ0CH5n6pwHdQNzrd0yPvfnUEwRed5p5s4RiliSCplDRDLs6aCuSaqgT0HoaJBoZhsa4Wu4dtsh+YN9WoNOufbhahkNL7Vq/5htaVBvspx1QmLEQ+bP4wC/TiW8ZlT7hwGLkRPkzLFvQ3Qp8xmhDgDjSLJN9MyooZucIbrOERpw/tU6S7QBT05JE4wViXE+CmFEoYlWxsbZHTh7emris61fGfJBvCKZ8XN22gsf+qe5iyxGeaDj9hSrETWOAtLJpc8kTjm84ZVZcpz8s4BGxCVy5yd10AfhAo76hs+TBVNXmIAZujZP/2+eU8XyHTPnXnOYJKGwDfzrQEhXYu5IhUFx+m8t29AilI5Of2P/n0Bg0esopOx1RDlZEhYWr4dmOhECoB67D2SeRM93YPfcUD5WHNICN7LpLZrpoYmGKEojCt4ZAxJS2iHCLPSdYOzndSFy9JCxDlK+jG7Oguq8i+IsLRpTg7bUP8+wURw3e2MW6MKxGGId9qa5Sr4ZIZ25ZNS6k+ftuotd6kaQ1OACkIhLBGK78iADxs+i0YEsxNzyJbGcELkI7lisO+K25iMw02eDVwY3amXEKY/Ncdf8WYjBZCcB1yzoGG4zbNJCphf9NDhnJWYiOeGqB2kM16DFDHV4rjD9DmAETxU0nHmUwGM1waWkaC0hHMiKdIBN6CIb1r5WAgxA2RQuB0d4vH0c/ddHxez8OIWddShxmWb/UNLpq4/p7uTILRmZev6PNLo3K0Z33P23fLmTqWqYf6Rijw6cZ ndgnXFvp sHYNSYx+sqP4o8MMU10v6p3od/fP4Hyrn5Ndtyarzqk9DijcDEJvV1zga1EpYHQQoIE5X6OOCaX0Cl31cK+YKLx50kW57cFbcXahQYTI+HUTgYWI= X-Bogosity: Ham, tests=bogofilter, spamicity=0.000006, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: For NUMA systems, there is a need to allow damos to select watermark options for monitoring a target NUMA node or total system memory. This patch adds new watermark metric type, DAMOS_WMARK_NODE_FREE_MEM_RATE, and its target node. By doing so, DAMON can avoid that kdamond is not waked up although the free memory of the target node is between mid and low watermark. Signed-off-by: Jonghyeon Kim --- include/linux/damon.h | 11 +++++++++-- mm/damon/core.c | 11 ++++++++--- mm/damon/sysfs-schemes.c | 35 +++++++++++++++++++++++++++++++++-- 3 files changed, 50 insertions(+), 7 deletions(-) diff --git a/include/linux/damon.h b/include/linux/damon.h index 5881e4ac3..d8daa30d7 100644 --- a/include/linux/damon.h +++ b/include/linux/damon.h @@ -206,11 +206,14 @@ struct damos_quota { * * @DAMOS_WMARK_NONE: Ignore the watermarks of the given scheme. * @DAMOS_WMARK_FREE_MEM_RATE: Free memory rate of the system in [0,1000]. + * @DAMOS_WMARK_NODE_FREE_MEM_RATE: Free memory rate of the system in [0,1000] + * for specific NUMA node. * @NR_DAMOS_WMARK_METRICS: Total number of DAMOS watermark metrics */ enum damos_wmark_metric { DAMOS_WMARK_NONE, DAMOS_WMARK_FREE_MEM_RATE, + DAMOS_WMARK_NODE_FREE_MEM_RATE, NR_DAMOS_WMARK_METRICS, }; @@ -221,11 +224,14 @@ enum damos_wmark_metric { * @high: High watermark. * @mid: Middle watermark. * @low: Low watermark. + * @target_nid: Target NUMA node id for the watermarks. * * If &metric is &DAMOS_WMARK_NONE, the scheme is always active. Being active * means DAMON does monitoring and applying the action of the scheme to - * appropriate memory regions. Else, DAMON checks &metric of the system for at - * least every &interval microseconds and works as below. + * appropriate memory regions. Else if $metric is $DAMOS_WMARK_FREE_MEM_RATE, + * DAMON checks &metric of the system for at least every &interval microseconds + * and works as below. If $metric is $DAMOS_WMARK_NODE_FREE_MEM_RATE, DAMON + * only chceks $metric of the $target_nid. * * If &metric is higher than &high, the scheme is inactivated. If &metric is * between &mid and &low, the scheme is activated. If &metric is lower than @@ -237,6 +243,7 @@ struct damos_watermarks { unsigned long high; unsigned long mid; unsigned long low; + int target_nid; /* private: */ bool activated; diff --git a/mm/damon/core.c b/mm/damon/core.c index 5b325749f..b1c8ed5fd 100644 --- a/mm/damon/core.c +++ b/mm/damon/core.c @@ -1380,12 +1380,17 @@ static bool kdamond_need_stop(struct damon_ctx *ctx) return true; } -static unsigned long damos_wmark_metric_value(enum damos_wmark_metric metric) +static unsigned long damos_wmark_metric_value(struct damos_watermarks wmarks) { - switch (metric) { + switch (wmarks.metric) { case DAMOS_WMARK_FREE_MEM_RATE: return global_zone_page_state(NR_FREE_PAGES) * 1000 / totalram_pages(); + case DAMOS_WMARK_NODE_FREE_MEM_RATE: + if (wmarks.target_nid == NUMA_NO_NODE) + return 0; + return sum_zone_node_page_state(wmarks.target_nid, NR_FREE_PAGES) * + 1000 / node_present_pages(wmarks.target_nid); default: break; } @@ -1403,7 +1408,7 @@ static unsigned long damos_wmark_wait_us(struct damos *scheme) if (scheme->wmarks.metric == DAMOS_WMARK_NONE) return 0; - metric = damos_wmark_metric_value(scheme->wmarks.metric); + metric = damos_wmark_metric_value(scheme->wmarks); /* higher than high watermark or lower than low watermark */ if (metric > scheme->wmarks.high || scheme->wmarks.low > metric) { if (scheme->wmarks.activated) diff --git a/mm/damon/sysfs-schemes.c b/mm/damon/sysfs-schemes.c index ae0f0b314..b65291e4a 100644 --- a/mm/damon/sysfs-schemes.c +++ b/mm/damon/sysfs-schemes.c @@ -656,11 +656,13 @@ struct damon_sysfs_watermarks { unsigned long high; unsigned long mid; unsigned long low; + int target_nid; }; static struct damon_sysfs_watermarks *damon_sysfs_watermarks_alloc( enum damos_wmark_metric metric, unsigned long interval_us, - unsigned long high, unsigned long mid, unsigned long low) + unsigned long high, unsigned long mid, unsigned long low, + int target_nid) { struct damon_sysfs_watermarks *watermarks = kmalloc( sizeof(*watermarks), GFP_KERNEL); @@ -673,6 +675,7 @@ static struct damon_sysfs_watermarks *damon_sysfs_watermarks_alloc( watermarks->high = high; watermarks->mid = mid; watermarks->low = low; + watermarks->target_nid = target_nid; return watermarks; } @@ -680,6 +683,7 @@ static struct damon_sysfs_watermarks *damon_sysfs_watermarks_alloc( static const char * const damon_sysfs_wmark_metric_strs[] = { "none", "free_mem_rate", + "node_free_mem_rate", }; static ssize_t metric_show(struct kobject *kobj, struct kobj_attribute *attr, @@ -784,6 +788,27 @@ static ssize_t low_store(struct kobject *kobj, return err ? err : count; } +static ssize_t target_nid_show(struct kobject *kobj, + struct kobj_attribute *attr, char *buf) +{ + struct damon_sysfs_watermarks *watermarks = container_of(kobj, + struct damon_sysfs_watermarks, kobj); + + return sysfs_emit(buf, "%d\n", watermarks->target_nid); +} + +static ssize_t target_nid_store(struct kobject *kobj, + struct kobj_attribute *attr, const char *buf, size_t count) +{ + struct damon_sysfs_watermarks *watermarks = container_of(kobj, + struct damon_sysfs_watermarks, kobj); + int err = kstrtoint(buf, 0, &watermarks->target_nid); + + if (err) + return -EINVAL; + return count; +} + static void damon_sysfs_watermarks_release(struct kobject *kobj) { kfree(container_of(kobj, struct damon_sysfs_watermarks, kobj)); @@ -804,12 +829,16 @@ static struct kobj_attribute damon_sysfs_watermarks_mid_attr = static struct kobj_attribute damon_sysfs_watermarks_low_attr = __ATTR_RW_MODE(low, 0600); +static struct kobj_attribute damon_sysfs_watermarks_target_nid_attr = + __ATTR_RW_MODE(target_nid, 0600); + static struct attribute *damon_sysfs_watermarks_attrs[] = { &damon_sysfs_watermarks_metric_attr.attr, &damon_sysfs_watermarks_interval_us_attr.attr, &damon_sysfs_watermarks_high_attr.attr, &damon_sysfs_watermarks_mid_attr.attr, &damon_sysfs_watermarks_low_attr.attr, + &damon_sysfs_watermarks_target_nid_attr.attr, NULL, }; ATTRIBUTE_GROUPS(damon_sysfs_watermarks); @@ -1471,7 +1500,7 @@ static int damon_sysfs_scheme_set_quotas(struct damon_sysfs_scheme *scheme) static int damon_sysfs_scheme_set_watermarks(struct damon_sysfs_scheme *scheme) { struct damon_sysfs_watermarks *watermarks = - damon_sysfs_watermarks_alloc(DAMOS_WMARK_NONE, 0, 0, 0, 0); + damon_sysfs_watermarks_alloc(DAMOS_WMARK_NONE, 0, 0, 0, 0, NUMA_NO_NODE); int err; if (!watermarks) @@ -1951,6 +1980,7 @@ static struct damos *damon_sysfs_mk_scheme( .high = sysfs_wmarks->high, .mid = sysfs_wmarks->mid, .low = sysfs_wmarks->low, + .target_nid = sysfs_wmarks->target_nid, }; damos_sysfs_set_quota_score(sysfs_quotas->goals, "a); @@ -2002,6 +2032,7 @@ static void damon_sysfs_update_scheme(struct damos *scheme, scheme->wmarks.high = sysfs_wmarks->high; scheme->wmarks.mid = sysfs_wmarks->mid; scheme->wmarks.low = sysfs_wmarks->low; + scheme->wmarks.target_nid = sysfs_wmarks->target_nid; err = damon_sysfs_set_scheme_filters(scheme, sysfs_scheme->filters); if (err) -- 2.34.1