From patchwork Mon Jun 24 17:58:14 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: SeongJae Park X-Patchwork-Id: 13709953 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 92DDFC2BD09 for ; Mon, 24 Jun 2024 17:58:26 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 1F2FA6B019C; Mon, 24 Jun 2024 13:58:26 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 1A2E76B02C8; Mon, 24 Jun 2024 13:58:26 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 06B286B02C9; Mon, 24 Jun 2024 13:58:26 -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 DAD456B019C for ; Mon, 24 Jun 2024 13:58:25 -0400 (EDT) Received: from smtpin18.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay05.hostedemail.com (Postfix) with ESMTP id 8244241221 for ; Mon, 24 Jun 2024 17:58:25 +0000 (UTC) X-FDA: 82266541770.18.8863615 Received: from sin.source.kernel.org (sin.source.kernel.org [145.40.73.55]) by imf01.hostedemail.com (Postfix) with ESMTP id 8EA8D4001F for ; Mon, 24 Jun 2024 17:58:22 +0000 (UTC) Authentication-Results: imf01.hostedemail.com; dkim=pass header.d=kernel.org header.s=k20201202 header.b=ENjwz9wd; dmarc=pass (policy=none) header.from=kernel.org; spf=pass (imf01.hostedemail.com: domain of sj@kernel.org designates 145.40.73.55 as permitted sender) smtp.mailfrom=sj@kernel.org ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1719251892; a=rsa-sha256; cv=none; b=6HJZxndoxj76j+aey5ZQkUz7XfkKzcV6ByM2EmsnYSCDw+KlnvaWG2fraWjl53WckP0hEB hPCv1P6eOfyLHkcHaFCURjycBLV9KBLI09H6cF9n3SfQloT3RreRfdu6ShZYChnUR4xzwJ xgioYMtPZUkByv5tWPHwmzW4I4f9UwA= ARC-Authentication-Results: i=1; imf01.hostedemail.com; dkim=pass header.d=kernel.org header.s=k20201202 header.b=ENjwz9wd; dmarc=pass (policy=none) header.from=kernel.org; spf=pass (imf01.hostedemail.com: domain of sj@kernel.org designates 145.40.73.55 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=1719251892; 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:references:dkim-signature; bh=ZSUF61zsLqt32t/D+vVh3UU01R8AQOb0t1hG4T119+w=; b=SbJoZF+DALhoWDUcHZ2CtF+5HjUBtVh6WhWpp8+NOqc2tBJho808ZGNw75gK+cHuE+/PC8 Jp7gv8GRerLethcki4ArZ3xwCO/zXcFRjHdwacvI+o9d75+MkL//SnNve//+kMGXyD+M2s LZcg2L37rDs4SzSjhJmdjP0WUQZKjM0= Received: from smtp.kernel.org (transwarp.subspace.kernel.org [100.75.92.58]) by sin.source.kernel.org (Postfix) with ESMTP id 4F01DCE1308; Mon, 24 Jun 2024 17:58:18 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id DADCEC2BBFC; Mon, 24 Jun 2024 17:58:16 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1719251897; bh=YTBdXq2TGG2GhM+XlgLTSVVwIadpxauvL8szohE7zO0=; h=From:To:Cc:Subject:Date:From; b=ENjwz9wdsaeRlckaB8ZWYIdy5ErpdGluAMVz1vjPPy1hd7Uvf31aeWSt87r96sab/ RQl+VYURfa2tZJShM21Bdsrvw8sTmFl8XY5sezW25kc0WhW1Gi0mZmAFan6yDB/NC7 erwKzeamoUHkFvVBysnGh2R2j5PPndzfdt51UjaKC/A4R88J/hdN0rlolmDJY10Wsu /9XDUMWTOQkZkrm2+LQcNVKxmJaz0kYUl9/MFAvfrO1ktlPgNPiDTs4zIF+ChgSBW7 DZ+oszY0aqJWKacBJLwCa89ogO2KfnlbEXq9Xz+GDZ+TBG/73xptVAAjzSCuAvpIIC QXTLDTXtwYIbQ== From: SeongJae Park To: Andrew Morton Cc: SeongJae Park , damon@lists.linux.dev, linux-mm@kvack.org, linux-kernel@vger.kernel.org, stable@vger.kernel.org Subject: [PATCH] mm/damon/core: merge regions aggressively when max_nr_regions is unmet Date: Mon, 24 Jun 2024 10:58:14 -0700 Message-Id: <20240624175814.89611-1-sj@kernel.org> X-Mailer: git-send-email 2.39.2 MIME-Version: 1.0 X-Rspamd-Queue-Id: 8EA8D4001F X-Rspam-User: X-Rspamd-Server: rspam05 X-Stat-Signature: 9osbnbusw5co7otnbzi96796oqphjb4m X-HE-Tag: 1719251902-235829 X-HE-Meta: U2FsdGVkX1/yP0ccbPialtxsIca1o83sIGbhkwrCOnUXVVYgbEycevTCtcq/BO6686M4NeRnRjXEQ+dABAjnBkTJUXd6XowMRYeeLnrM6oA2inx5WBSWzsi+HA3CDgfNM8pUkKIBIVXbvjz75la72Ky9sOBt5sUx70h0sRicEv54lA7jUWop6/NOXCaaoIMn/lFQmSJCCm4HFJD8ckuKAlklrgJp4OPYjbwW1Q7FiEhHmiwgNxBn2pPvFdzWtnOKlTzQKJKhGWoCbsnNjgdWPZtRaVknsusvCuqVTu7D/CfN72LywUO4bsvSoNr7qI2oRpQv1xK6ybvMVf6dV7Cx2Y91d8YMe/28CmZNMKhmiXRp1UZV4jXr+9vmkEmZh6GSPKRQC7Zt6RmzZkWp+i6k6RH+I0dRr55A0vFnal7yBDAQv4mC0cmkTNtxDSnKhm+8ObZFdYMBdGom16jAVYor+OPjWrEAUFO11pIBZZ29j5+pgFoGFU3nQGC0H/P14MG/GQanqCLf8P6TrcBunCyEMnTGMOqhqoLueFiTtK11tz0c/kAhqxmr6+PQU2OTXVZsTS/7G3zdYfVNHS+PZWQgUbQio4C5cnO8l+JhqTZeM3Q5tjcPWZZMtqKvbtVN35XWemLUAyFTmM4Sw0NyegKoB5YA4z7vp5Pzv7mLPjtsWphceZgWSKzLZ2xAiGRFo+A138etNTlTmMssKqcnibVZvIFO8P2Rym7h+da4TF9LVPbV0RUPHztIrSiu9CAbP8XVg0SOd2H8OnaTDBSLPIX/ypYUGIU2oONtNFwZ4G004JuqK7Cb7+wIDpXm8TwuUvntiYLdnqVA02vWs7skNTEvAofIAGOtEk1boujZFLX2Yxp8CbWURiWDuR73t4i4r9EQz/KsAjv7FVDHFPRSDXfaaG1hyas9edaFrNDJzAJ6yjzDKI3rcb2pRIF2dcoYdcw2NlyRnGlHOki7sqB6lSL Q4DxiLq8 1mGeCxBZD0mZIsQBdvBhOt/kV471STfbSJV/BH3UjS9xNN9YOs2d/d4q6njTn1N4Ed6mSh/bk07Opdc1K5RRv+N7DweTaxL+QdsVgRIyTwlvTh7TQvcFF94+CZRLM3G9tzxRzwKsMz7VAmeuI8/MUnhxZocRkGDyCeN7GwmEQ8flBxnnynZ1Z2Y5UWvhzgpv64jypTQ2TnJ2JwqB2U5GlcdBkRsiQioD+zS6wZUXIpFiTICLD6KCYZevIKQkOi4sHQ82Vuy2U7IhcMUPqbQzlR5tTaw== 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 keeps the number of regions under max_nr_regions by skipping regions split operations when doing so can make the number higher than the limit. It works well for preventing violation of the limit. But, if somehow the violation happens, it cannot recovery well depending on the situation. In detail, if the real number of regions having different access pattern is higher than the limit, the mechanism cannot reduce the number below the limit. In such a case, the system could suffer from high monitoring overhead of DAMON. The violation can actually happen. For an example, the user could reduce max_nr_regions while DAMON is running, to be lower than the current number of regions. Fix the problem by repeating the merge operations with increasing aggressiveness in kdamond_merge_regions() for the case, until the limit is met. Fixes: b9a6ac4e4ede ("mm/damon: adaptively adjust regions") Cc: # 5.15.x Signed-off-by: SeongJae Park --- mm/damon/core.c | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/mm/damon/core.c b/mm/damon/core.c index f69250b68bcc..e6598c44b53c 100644 --- a/mm/damon/core.c +++ b/mm/damon/core.c @@ -1694,14 +1694,30 @@ static void damon_merge_regions_of(struct damon_target *t, unsigned int thres, * access frequencies are similar. This is for minimizing the monitoring * overhead under the dynamically changeable access pattern. If a merge was * unnecessarily made, later 'kdamond_split_regions()' will revert it. + * + * The total number of regions could be temporarily higher than the + * user-defined limit, max_nr_regions for some cases. For an example, the user + * updates max_nr_regions to a number that lower than the current number of + * regions while DAMON is running. Depending on the access pattern, it could + * take indefinitve time to reduce the number below the limit. For such a + * case, repeat merging until the limit is met while increasing @threshold and + * @sz_limit. */ static void kdamond_merge_regions(struct damon_ctx *c, unsigned int threshold, unsigned long sz_limit) { struct damon_target *t; + unsigned int nr_regions; - damon_for_each_target(t, c) - damon_merge_regions_of(t, threshold, sz_limit); + do { + nr_regions = 0; + damon_for_each_target(t, c) { + damon_merge_regions_of(t, threshold, sz_limit); + nr_regions += damon_nr_regions(t); + } + threshold = max(1, threshold * 2); + sz_limit = max(1, sz_limit * 2); + } while (nr_regions > c->attrs.max_nr_regions); } /*