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 X-Spam-Level: X-Spam-Status: No, score=-15.7 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 5E46CC47096 for ; Mon, 31 May 2021 13:38:36 +0000 (UTC) Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.kernel.org (Postfix) with ESMTP id 0BF1F6195C for ; Mon, 31 May 2021 13:38:36 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 0BF1F6195C Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=owner-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix) id A07336B0073; Mon, 31 May 2021 09:38:35 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 9DDBF6B0074; Mon, 31 May 2021 09:38:35 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 796A36B0075; Mon, 31 May 2021 09:38:35 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0092.hostedemail.com [216.40.44.92]) by kanga.kvack.org (Postfix) with ESMTP id 4844C6B0073 for ; Mon, 31 May 2021 09:38:35 -0400 (EDT) Received: from smtpin07.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay05.hostedemail.com (Postfix) with ESMTP id D6D99181AEF1A for ; Mon, 31 May 2021 13:38:34 +0000 (UTC) X-FDA: 78201630948.07.78BC50D Received: from mail-qt1-f174.google.com (mail-qt1-f174.google.com [209.85.160.174]) by imf28.hostedemail.com (Postfix) with ESMTP id AF3F520010A2 for ; Mon, 31 May 2021 13:38:23 +0000 (UTC) Received: by mail-qt1-f174.google.com with SMTP id m13so7895984qtk.13 for ; Mon, 31 May 2021 06:38:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=8oDfTPCaQHlfzMwtOb005Z5DVxnI2Qln9RV3pvHJRdc=; b=t3TM6phNfaa5xYMVX8AEe5RlN5nfvUoJJh6cR8bm14DiIK4ocwxBKgcyRl95FzdPGs lx0Zhee/UBxZ4vOhVDawXg7/HsYLI5Mmybs1Y0Iau8CxNQci7q0MkMue9L3K1dcod8/o FSKePvElzSupZm4snBt4KXBz6DZlNmZUNGpycmslcq7s0wywn9Kq113yKtVElvTdSjpm GcPk0n5iuDGm0A3pl82wfVA32OFheVZjNUBqQ4TuO+JcWButvSnyN2fbxVKR0PPdTw0J xKNgVibW0LQPCSX7q8Cy9W1EAFIjlpzu4Hh//Pz7O1m8hX24dr3Z0ww2vXigUzvFUGDS UStg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=8oDfTPCaQHlfzMwtOb005Z5DVxnI2Qln9RV3pvHJRdc=; b=QJMKdThQxLmCubTLVqCy0Vi2eonIQSk1JgXNUGotbFXLLZ7c2r19sOc+AvKyTGKrfn rbs3z6v8/+wZT3iZEy3clPvTKULdBa7fjUuCrLE7mgHrnunKHW2/uOF8nlVL5OCHaYDQ BVdfTZZ44wHF6FyNmWQ39oBSkbWR55zz9KebAigVfz4rmQAtVG1Up2j4vHQ3fszvYE+k 8b3xYig1hZkSQfWWDBx3VNyB8vVJTNQQEOianp0rFYq7AnFp2z3drweM0c5KdolXfk0a +M5ZLvNTPJZkF3sdA+fLqKYIob6gSX2q7pfp9PRwqTrrs73djCYGIy1nXqoijkV52LFO S71Q== X-Gm-Message-State: AOAM5311V76RCELh9MpHf+zjSCvUk8QqTPBlAodX6KUrGy/LcDbhDwTA Adb4YIm3zQ5jsHzzyagPqUQ= X-Google-Smtp-Source: ABdhPJzUxCfrhtWHdhZnTNc2ZGr4kXBoiYlFu6aWGvcHzSWJBIYI4qNtXCuSzcdIBXO/QKPoySCDFA== X-Received: by 2002:aed:20e7:: with SMTP id 94mr9765856qtb.66.1622468313949; Mon, 31 May 2021 06:38:33 -0700 (PDT) Received: from localhost.localdomain (ec2-35-169-212-159.compute-1.amazonaws.com. [35.169.212.159]) by smtp.gmail.com with ESMTPSA id h8sm8293085qtp.46.2021.05.31.06.38.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 31 May 2021 06:38:33 -0700 (PDT) From: sj38.park@gmail.com To: akpm@linux-foundation.org Cc: SeongJae Park , Jonathan.Cameron@Huawei.com, acme@kernel.org, alexander.shishkin@linux.intel.com, amit@kernel.org, benh@kernel.crashing.org, brendanhiggins@google.com, corbet@lwn.net, david@redhat.com, dwmw@amazon.com, elver@google.com, fan.du@intel.com, foersleo@amazon.de, greg@kroah.com, gthelen@google.com, guoju.fgj@alibaba-inc.com, mgorman@suse.de, minchan@kernel.org, mingo@redhat.com, namhyung@kernel.org, peterz@infradead.org, riel@surriel.com, rientjes@google.com, rostedt@goodmis.org, rppt@kernel.org, shakeelb@google.com, shuah@kernel.org, sj38.park@gmail.com, snu@zelle79.org, vbabka@suse.cz, vdavydov.dev@gmail.com, zgf574564920@gmail.com, linux-damon@amazon.com, linux-mm@kvack.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [RFC PATCH 03/13] damon/core/schemes: Skip already charged targets and regions Date: Mon, 31 May 2021 13:38:06 +0000 Message-Id: <20210531133816.12689-4-sj38.park@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20210531133816.12689-1-sj38.park@gmail.com> References: <20210531133816.12689-1-sj38.park@gmail.com> X-Rspamd-Queue-Id: AF3F520010A2 Authentication-Results: imf28.hostedemail.com; dkim=pass header.d=gmail.com header.s=20161025 header.b=t3TM6phN; spf=pass (imf28.hostedemail.com: domain of sj38park@gmail.com designates 209.85.160.174 as permitted sender) smtp.mailfrom=sj38park@gmail.com; dmarc=pass (policy=none) header.from=gmail.com X-Rspamd-Server: rspam04 X-Stat-Signature: 44ehxfbhnsrpquqyqk8mfwggwkwsao5e X-HE-Tag: 1622468303-860561 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: From: SeongJae Park If DAMOS stopped applying action to memory regions due to the speed limit, it does nothing until next charge window starts. Then, it starts the work from the beginning of the address space. If there is a huge memory region at the beginning of the address space and it fulfills the scheme target data access pattern, the action will applied to only the region. This commit mitigates the case by skipping memory regions that charged in previous charge window at the beginning of current charge window. Signed-off-by: SeongJae Park --- include/linux/damon.h | 5 +++++ mm/damon/core.c | 29 ++++++++++++++++++++++++++--- 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/include/linux/damon.h b/include/linux/damon.h index 35068b0ece6f..0df81dd2d560 100644 --- a/include/linux/damon.h +++ b/include/linux/damon.h @@ -104,6 +104,8 @@ struct damos_speed_limit { /* private: for limit accounting */ unsigned long charged_sz; unsigned long charged_from; + struct damon_target *charge_target_from; + unsigned long charge_addr_from; }; /** @@ -331,6 +333,9 @@ struct damon_ctx { #define damon_prev_region(r) \ (container_of(r->list.prev, struct damon_region, list)) +#define damon_last_region(t) \ + (list_last_entry(&t->regions_list, struct damon_region, list)) + #define damon_for_each_region(r, t) \ list_for_each_entry(r, &t->regions_list, list) diff --git a/mm/damon/core.c b/mm/damon/core.c index df784c72ea80..fab687f18d9c 100644 --- a/mm/damon/core.c +++ b/mm/damon/core.c @@ -107,6 +107,8 @@ struct damos *damon_new_scheme( scheme->limit.ms = limit->ms; scheme->limit.charged_sz = 0; scheme->limit.charged_from = 0; + scheme->limit.charge_target_from = NULL; + scheme->limit.charge_addr_from = 0; return scheme; } @@ -558,6 +560,21 @@ static void damon_do_apply_schemes(struct damon_ctx *c, if (limit->sz && limit->charged_sz >= limit->sz) continue; + if (limit->charge_target_from) { + if (t != limit->charge_target_from) + continue; + if (r == damon_last_region(t)) { + limit->charge_target_from = NULL; + limit->charge_addr_from = 0; + continue; + } + if (limit->charge_addr_from && + r->ar.start < limit->charge_addr_from) + continue; + limit->charge_target_from = NULL; + limit->charge_addr_from = 0; + } + sz = r->ar.end - r->ar.start; /* Check the target regions condition */ if (sz < s->min_sz_region || s->max_sz_region < sz) @@ -576,6 +593,10 @@ static void damon_do_apply_schemes(struct damon_ctx *c, } c->primitive.apply_scheme(c, t, r, s); limit->charged_sz += sz; + if (limit->sz && limit->charged_sz >= limit->sz) { + limit->charge_target_from = t; + limit->charge_addr_from = r->ar.end + 1; + } } if (s->action != DAMOS_STAT) r->age = 0; @@ -593,11 +614,13 @@ static void kdamond_apply_schemes(struct damon_ctx *c) struct damos *s; damon_for_each_scheme(s, c) { + struct damos_speed_limit *limit = &s->limit; + /* Reset charge window if the duration passed */ - if (time_after_eq(jiffies, s->limit.charged_from + + if (limit->sz && time_after_eq(jiffies, s->limit.charged_from + msecs_to_jiffies(s->limit.ms))) { - s->limit.charged_from = jiffies; - s->limit.charged_sz = 0; + limit->charged_from = jiffies; + limit->charged_sz = 0; } } -- 2.17.1