From patchwork Fri Feb 16 19:40:24 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: SeongJae Park X-Patchwork-Id: 13560507 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 69CB3C48260 for ; Fri, 16 Feb 2024 19:40:41 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 740828D0005; Fri, 16 Feb 2024 14:40:38 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 6E3138D0003; Fri, 16 Feb 2024 14:40:38 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 57FA28D0006; Fri, 16 Feb 2024 14:40:38 -0500 (EST) 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 2E0708D0003 for ; Fri, 16 Feb 2024 14:40:38 -0500 (EST) Received: from smtpin12.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay05.hostedemail.com (Postfix) with ESMTP id E488D40555 for ; Fri, 16 Feb 2024 19:40:37 +0000 (UTC) X-FDA: 81798684114.12.81C7AA1 Received: from sin.source.kernel.org (sin.source.kernel.org [145.40.73.55]) by imf09.hostedemail.com (Postfix) with ESMTP id 97A6F14002C for ; Fri, 16 Feb 2024 19:40:34 +0000 (UTC) Authentication-Results: imf09.hostedemail.com; dkim=pass header.d=kernel.org header.s=k20201202 header.b=g+2b+1Uq; spf=pass (imf09.hostedemail.com: domain of sj@kernel.org designates 145.40.73.55 as permitted sender) smtp.mailfrom=sj@kernel.org; dmarc=pass (policy=none) header.from=kernel.org ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1708112435; 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=SxIuwHiuGPubgBbVurJBzQQpNGnbBDtXe25eeHWS90g=; b=TRsG+MJhrODedHUinKQjaMk06aEVzv+UqfdlFK1Cy8auv2Zq3AzFM9ah+jHNUg2ByH7UBl 2qJoOki5JckkAvD0sf4okdJzKgwwU0flhrZHSXrXGiLUa9N3IpfrQER5UrO/8toj2/ZmrR 1woQdaQqYljfxch0lcfu9J2fflso7xg= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1708112435; a=rsa-sha256; cv=none; b=V4WkLG3Yp3AjrCoI/FUZ/WccGspv0tnsAoX7PpaJtuOI5nhp0mqnfWmhwkqA8faTdgNa0y htGNaXNj7FU1+zqjsHiaLtYrn0zVyVKdamtR0QEcyIlXBTbKB8Tck/NNbrqoYDxk/mlLBG jDnGsbEDR8QGkoaVOrZdtyg4EGvUXfU= ARC-Authentication-Results: i=1; imf09.hostedemail.com; dkim=pass header.d=kernel.org header.s=k20201202 header.b=g+2b+1Uq; spf=pass (imf09.hostedemail.com: domain of sj@kernel.org designates 145.40.73.55 as permitted sender) smtp.mailfrom=sj@kernel.org; dmarc=pass (policy=none) header.from=kernel.org Received: from smtp.kernel.org (transwarp.subspace.kernel.org [100.75.92.58]) by sin.source.kernel.org (Postfix) with ESMTP id 4DAA9CE2CF2; Fri, 16 Feb 2024 19:40:31 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 07673C433C7; Fri, 16 Feb 2024 19:40:29 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1708112430; bh=wFv2F9t2fMsiAoT3IOLKoZDJI+fzPndeClSvme5e6Q4=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=g+2b+1UqP2yCNcw/xOo31GOXP7ob/HXcyUZESmL35zWEyfjwA72ZHfBG93hbxOw4H b2alqF+qJGJCVBCxlSrMtwQkFMuoxm6HfR33tAOZbnHUrek/7Zut81P9IA6mQJfnBa zCqF11OuTF62r3qmmz1Wp8ZgKVPdQHIGBTwAPYtAtwvEjTuiHFchmV4dsP5fIsH/Q3 5fu7n0t/SOX3rS/qnU++vyVCgD+oCPW3Q6yNf7lJAwgmI33yoUHsD4c1rTso4uhliH AcMAoMekLiF9FMbwCA2p14cO0terTjnbif1wn9OtfsoYioBaoK58P10N0mZ4HJVItL z1iEuFR/MegUA== From: SeongJae Park To: Andrew Morton Cc: SeongJae Park , damon@lists.linux.dev, linux-mm@kvack.org, stable@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH 1/2] mm/damon/reclaim: fix quota stauts loss due to online tunings Date: Fri, 16 Feb 2024 11:40:24 -0800 Message-Id: <20240216194025.9207-2-sj@kernel.org> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20240216194025.9207-1-sj@kernel.org> References: <20240216194025.9207-1-sj@kernel.org> MIME-Version: 1.0 X-Rspamd-Queue-Id: 97A6F14002C X-Rspam-User: X-Stat-Signature: wrk8bb8c6a4jaborfejnrgge4b7t53dh X-Rspamd-Server: rspam03 X-HE-Tag: 1708112434-455329 X-HE-Meta: U2FsdGVkX18Lo+0UGA5U0BFyvEU0HSxzTxu7DjU4BWT1IatDv8OrJBrepiZiGS5nVLJVWnGpbv28tSToLlSJBnI+DPqap/8+fQetZEgzLgr1awPmThYbnQXHWZWmMwj68b7+rqQsosIX7mqaBIKN9sBip2NRx+ApwqNsOVUC9X4HSLw32Wpy/1KRwl2tizWg3cByNIjo14dz2LNb4aFdoB1O3utXS9i3vv7GcHPRmGn3xoJOs0MQGo8KiChl1WiFFWCyK0RksWFsjZBrR5i7ox3hxVcLbVxpBjjkfNkzPfAg/h3y1W+XfI34Vt+1ruxwFG0NzqUjE/6dZNaFpxzvh/ANcDnhvZcHqwxHMBOEAWAskVNimfJvuRZ9AIeEG2/f+xloQUg7MhFOXu+BSEMcD3xe/v9PcOUH1SoaxWvjFHQ/Xk6I8qAHCxGmIMxZGnIjjk4DG2+F8broYcYVjhfd5j45awoqJZH5aUAYYZ7e+eX0PgAKY11NP9o1IcpDoL0jKCW0FzHNerxZ4SLUSGUA5AYHB2UlnUJ9jFl83gVbZojrspEbW82brvCqZeNs+JKtbZQkZ7ruJa9bBwN4I8f/39x3S39e6F/Ce/iLbR8unRM+2GGpoZVPTvMJPsSnxVkjZOkvJR9ZGJqhp0/uTBdfLomwrdugY1BVVWF7+YvS3sQtf4yCAjd/Te05sR3BUjZhdZbiZDlNRvEmb460R+PbVc9hj9awI3e2Tz8YT7t35wRInWFrk35cNDBsr1KfAz5rYsYck7qnz5YB+/UGW+6/OaderzZgpZni7LpngRgK+qxjnw0w+gHniaJGscLSYguTvgEk/HAlWPxbz4+MpfawX55mtllRvaHcLyyLHANtU0w/iRpzh8RZXEXy/R+pWBCwZTgMwEjSZTHlEUBD4MaUCywuaHyiNKHUrwdC1MviDk4= 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: For online parameters change, DAMON_RECLAIM creates new scheme based on latest values of the parameters and replaces the old scheme with the new one. When creating it, the internal status of the quota of the old scheme is not preserved. As a result, charging of the quota starts from zero after the online tuning. The data that collected to estimate the throughput of the scheme's action is also reset, and therefore the estimation should start from the scratch again. Because the throughput estimation is being used to convert the time quota to the effective size quota, this could result in temporal time quota inaccuracy. It would be recovered over time, though. In short, the quota accuracy could be temporarily degraded after online parameters update. Fix the problem by checking the case and copying the internal fields for the status. Fixes: e035c280f6df ("mm/damon/reclaim: support online inputs update") Cc: # 5.19.x Signed-off-by: SeongJae Park --- mm/damon/reclaim.c | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/mm/damon/reclaim.c b/mm/damon/reclaim.c index ab974e477d2f..66e190f0374a 100644 --- a/mm/damon/reclaim.c +++ b/mm/damon/reclaim.c @@ -150,9 +150,20 @@ static struct damos *damon_reclaim_new_scheme(void) &damon_reclaim_wmarks); } +static void damon_reclaim_copy_quota_status(struct damos_quota *dst, + struct damos_quota *src) +{ + dst->total_charged_sz = src->total_charged_sz; + dst->total_charged_ns = src->total_charged_ns; + dst->charged_sz = src->charged_sz; + dst->charged_from = src->charged_from; + dst->charge_target_from = src->charge_target_from; + dst->charge_addr_from = src->charge_addr_from; +} + static int damon_reclaim_apply_parameters(void) { - struct damos *scheme; + struct damos *scheme, *old_scheme; struct damos_filter *filter; int err = 0; @@ -164,6 +175,11 @@ static int damon_reclaim_apply_parameters(void) scheme = damon_reclaim_new_scheme(); if (!scheme) return -ENOMEM; + if (!list_empty(&ctx->schemes)) { + damon_for_each_scheme(old_scheme, ctx) + damon_reclaim_copy_quota_status(&scheme->quota, + &old_scheme->quota); + } if (skip_anon) { filter = damos_new_filter(DAMOS_FILTER_TYPE_ANON, true); if (!filter) { From patchwork Fri Feb 16 19:40:25 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: SeongJae Park X-Patchwork-Id: 13560505 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 83AC4C48260 for ; Fri, 16 Feb 2024 19:40:38 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id E33D48D0002; Fri, 16 Feb 2024 14:40:37 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id DE4A08D0001; Fri, 16 Feb 2024 14:40:37 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id CABE48D0002; Fri, 16 Feb 2024 14:40:37 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0014.hostedemail.com [216.40.44.14]) by kanga.kvack.org (Postfix) with ESMTP id B981B8D0001 for ; Fri, 16 Feb 2024 14:40:37 -0500 (EST) Received: from smtpin14.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay03.hostedemail.com (Postfix) with ESMTP id 666DDA0149 for ; Fri, 16 Feb 2024 19:40:37 +0000 (UTC) X-FDA: 81798684114.14.6B32772 Received: from sin.source.kernel.org (sin.source.kernel.org [145.40.73.55]) by imf06.hostedemail.com (Postfix) with ESMTP id 13975180019 for ; Fri, 16 Feb 2024 19:40:34 +0000 (UTC) Authentication-Results: imf06.hostedemail.com; dkim=pass header.d=kernel.org header.s=k20201202 header.b="fRYPNC/u"; spf=pass (imf06.hostedemail.com: domain of sj@kernel.org designates 145.40.73.55 as permitted sender) smtp.mailfrom=sj@kernel.org; dmarc=pass (policy=none) header.from=kernel.org ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1708112435; a=rsa-sha256; cv=none; b=51fnEEUyFsGJN4r6s+wMTe6Dk4ApitfhpmVLZ3K1f2MF9FLgGs0WPOHoLmtaSXbLCLjZfx 0SRRA7LtZXeOHdLsYn0l/YNI4eOaOzCk+x/o+QQ+pNLgS2Xbgv+o6p8LL9nSHUDxB+wFjA 1OTO3soZNq8xTUfkUuI0d60MA+rWJoo= ARC-Authentication-Results: i=1; imf06.hostedemail.com; dkim=pass header.d=kernel.org header.s=k20201202 header.b="fRYPNC/u"; spf=pass (imf06.hostedemail.com: domain of sj@kernel.org designates 145.40.73.55 as permitted sender) smtp.mailfrom=sj@kernel.org; dmarc=pass (policy=none) header.from=kernel.org ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1708112435; 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=/24cm7afV6e186Dqe4gHkPtQtpLtENSIIrSKT1lNAaY=; b=iDLuxGow2ltOmTfEjAcijiUl34wUl292lbHaq6Q+hSbDsdSBPawX+Wj4y75T/pAYdkfnXr fUx8UKX8HkpnOqTUjiwW/3wKQnotyDdsD44Vq9K/S68Q6nKoSGTK6KjjZrycH0sVIq9zK3 9aSzSaSppTAnUBQK1eHiS2AVjPe7H0I= Received: from smtp.kernel.org (transwarp.subspace.kernel.org [100.75.92.58]) by sin.source.kernel.org (Postfix) with ESMTP id 53BFFCE2D29; Fri, 16 Feb 2024 19:40:32 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id B4D2BC43390; Fri, 16 Feb 2024 19:40:30 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1708112431; bh=etiMiObm+F9ASsbV6LLYp5TjRxnoRmCToWxcmcZj1K8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=fRYPNC/ufDnWbXmlor3hTrxVpeLeQeqoH5Tg7VzdZ22oqQ3qLjlcQJGqBrWZcR5Ub ouYrL/CbRvtNKpTdOFIQgPUaW+HhRLqCjz4l8rAGDGNrO52C4FMbK/n9mYfRqiHiPv aGFG8KmoVc6K1f8gwozQf+vRPWxBoA52ltgfVCsadI+uVfMglPoyrlqnAO+KNtD+n1 1DvQocMmt7Xwv84fgFSDj4M3YX3JVe7P3r766bZ9OTsih9V3wg2dIz5eKUFtJed+uK 1lf7O5mydvMnqpnEVljBemydiL1kyxZV7erNndJb4784B1DYoDaZ76h0PWLOynQ65z 3gXRHCAU2KFCw== From: SeongJae Park To: Andrew Morton Cc: SeongJae Park , damon@lists.linux.dev, linux-mm@kvack.org, stable@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH 2/2] mm/damon/lru_sort: fix quota status loss due to online tunings Date: Fri, 16 Feb 2024 11:40:25 -0800 Message-Id: <20240216194025.9207-3-sj@kernel.org> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20240216194025.9207-1-sj@kernel.org> References: <20240216194025.9207-1-sj@kernel.org> MIME-Version: 1.0 X-Rspamd-Server: rspam08 X-Rspamd-Queue-Id: 13975180019 X-Stat-Signature: z9ejrf1sd96pjnwocab7w5ayow3iumm1 X-Rspam-User: X-HE-Tag: 1708112434-192497 X-HE-Meta: U2FsdGVkX19Td1qd5flgYJSCW0YCCWNgZEj62r9bpAjylkQG85Pmok3surA3relqfDvqV/DSygxaX9Tocp3D2QwopmXrSIanhb1vCIUrvdabxrYd62BCeXwc/JAbeCz4/lWYecklPW4tfJ2o6i1E6/s7nEKL7aGGFwzJv2CDV1Krflyyqj7UpMoZO1Sl6E4jZbdgdbeCR3i/U3UqzKJRoLuLMSns7jGUIxA2kb32juYmcGMuBAhUXLNzy3BI50NDagkemKQTS70qVx3WaF3m2aBnT/1rHaiUjn2IvNKalMS66Q0GngBw/djNIc8QFjMjImHn/Q0V9k9uXqpzLkXh41eug3tRV7PY+q9TkBt9eiSfMeSADvw254ZDRbGTHHA0dvywyNoW2ptjTvB3ph09EWrZTcoo53if5IS+JMU3+LtHFbyTMvS1n/vj/BkVi2JnEHj/R2QyeWu79i19yRxq5GmheKd13xLGENFsQP++wkwDJWN/kE8xuS+s3A/kULaOia8BGOvpGkgg4CwRBjWeCjj1Ml2E0agQXqYSCPpLaKAohxw09tWQrQIRgOMnJmD4Zs727DSJJrpu4Ly/EirmF9xuQ9D7diQX1lalHh7jhxbxSxn2lmNWu4ySeUhX/xOpMBpP/x2tLzUwegrkgXlVgAQP8fl51bB6JOwFWX134BicMhS3HjN5DewuQk49BgvdQuMdImpzg3xVNO4GnG23np9+VfbCSjaNI0wCF0vaN81xmxhB5UmT6p4WoNA361lNo8EKTweP50tc2H1sTbuFFdEx7+VeYZ/0dPF8pKK7vS/h4loofo3GqPHKe0HxAZXpDz4zWTN7FhMXsnujWksXovbCM7dRiZ+h4oeD+doiMXqC84//uL/nqPtA4gt9nh4USFp+J5V/AMjKj5pTdSXrZoVm2NimwskF9s97bty9i5CKxtFYAx//6npBZSAithxfQj+DJWQnASp17uUQ2cL v+l58+Yw GXenP 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: For online parameters change, DAMON_LRU_SORT creates new schemes based on latest values of the parameters and replaces the old schemes with the new one. When creating it, the internal status of the quotas of the old schemes is not preserved. As a result, charging of the quota starts from zero after the online tuning. The data that collected to estimate the throughput of the scheme's action is also reset, and therefore the estimation should start from the scratch again. Because the throughput estimation is being used to convert the time quota to the effective size quota, this could result in temporal time quota inaccuracy. It would be recovered over time, though. In short, the quota accuracy could be temporarily degraded after online parameters update. Fix the problem by checking the case and copying the internal fields for the status. Fixes: 40e983cca927 ("mm/damon: introduce DAMON-based LRU-lists Sorting") Cc: # 6.0.x Signed-off-by: SeongJae Park --- mm/damon/lru_sort.c | 43 ++++++++++++++++++++++++++++++++++++------- 1 file changed, 36 insertions(+), 7 deletions(-) diff --git a/mm/damon/lru_sort.c b/mm/damon/lru_sort.c index f2e5f9431892..3de2916a65c3 100644 --- a/mm/damon/lru_sort.c +++ b/mm/damon/lru_sort.c @@ -185,9 +185,21 @@ static struct damos *damon_lru_sort_new_cold_scheme(unsigned int cold_thres) return damon_lru_sort_new_scheme(&pattern, DAMOS_LRU_DEPRIO); } +static void damon_lru_sort_copy_quota_status(struct damos_quota *dst, + struct damos_quota *src) +{ + dst->total_charged_sz = src->total_charged_sz; + dst->total_charged_ns = src->total_charged_ns; + dst->charged_sz = src->charged_sz; + dst->charged_from = src->charged_from; + dst->charge_target_from = src->charge_target_from; + dst->charge_addr_from = src->charge_addr_from; +} + static int damon_lru_sort_apply_parameters(void) { - struct damos *scheme; + struct damos *scheme, *hot_scheme, *cold_scheme; + struct damos *old_hot_scheme = NULL, *old_cold_scheme = NULL; unsigned int hot_thres, cold_thres; int err = 0; @@ -195,18 +207,35 @@ static int damon_lru_sort_apply_parameters(void) if (err) return err; + damon_for_each_scheme(scheme, ctx) { + if (!old_hot_scheme) { + old_hot_scheme = scheme; + continue; + } + old_cold_scheme = scheme; + } + hot_thres = damon_max_nr_accesses(&damon_lru_sort_mon_attrs) * hot_thres_access_freq / 1000; - scheme = damon_lru_sort_new_hot_scheme(hot_thres); - if (!scheme) + hot_scheme = damon_lru_sort_new_hot_scheme(hot_thres); + if (!hot_scheme) return -ENOMEM; - damon_set_schemes(ctx, &scheme, 1); + if (old_hot_scheme) + damon_lru_sort_copy_quota_status(&hot_scheme->quota, + &old_hot_scheme->quota); cold_thres = cold_min_age / damon_lru_sort_mon_attrs.aggr_interval; - scheme = damon_lru_sort_new_cold_scheme(cold_thres); - if (!scheme) + cold_scheme = damon_lru_sort_new_cold_scheme(cold_thres); + if (!cold_scheme) { + damon_destroy_scheme(hot_scheme); return -ENOMEM; - damon_add_scheme(ctx, scheme); + } + if (old_cold_scheme) + damon_lru_sort_copy_quota_status(&cold_scheme->quota, + &old_cold_scheme->quota); + + damon_set_schemes(ctx, &hot_scheme, 1); + damon_add_scheme(ctx, cold_scheme); return damon_set_region_biggest_system_ram_default(target, &monitor_region_start,