Received: by 2002:a05:6a10:a0d1:0:0:0:0 with SMTP id j17csp163193pxa; Tue, 4 Aug 2020 02:19:31 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwYAw3nBR+s8oRo9rJeepoktA5P6lK3JaNsvaLtNv8a4PiHClTwQ1jAOpAfNrowmrDSMRfK X-Received: by 2002:a17:906:1392:: with SMTP id f18mr19947252ejc.521.1596532771183; Tue, 04 Aug 2020 02:19:31 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1596532771; cv=none; d=google.com; s=arc-20160816; b=hfvSP7Q1Xf2Uz63sZylB+16LaxmJ8cs/E/B/nn7Dq9EGeCrsLRMLiRYQXI1wmGJTAP 2kRGYOEWIx0C448rxBeIOpvC8tHMkzvKsSofQX4EuMLo+NIpOXx2u5es/M15VEX9piQG PvkwdgU4rY355I3nLAmR3vY9F1byIEIREvWovPDMBQHu6WfbfR5mrgGs4UdOr1Kr6YXt 9hN8jHCkwWBuU1XU6JhCHM/Ft65qxkv/iucdLKwp4iCr86en43hIefFTbIZu9jo5wmpG 1PFIdcdxDXXHLSLJ+vVZa/NF1WwF3wk3SmS9KmLrUktdqr7vSaL0+gY1JIyrjzf1EMzS vchg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:ironport-sdr:dkim-signature; bh=/TznM7/xseBS3M5AC6EVueb36LhyqU/w6LMQcW6hZjo=; b=GbkrA+rjyDV/NV2FS1iPvi5nv3TgRgZDqw2lKDtxSJlYwoARzIh6B4aX/YQeQUJVSs JV2RIt5sZ1P55DQiwnF4ITIXMx0Huj7JxQvJ0C85v6iEwZA/iI0j+9xKluIGz1xFUi8a dKHYfqFo4Uu8G6yg2QH7zioUF44+lr/qhj5f1UrFoKn93J74zv3MidHGhXqy/YGUiwZ6 keB3bGyS7yefJ0ZtWBTQ1Pcz6PzHbU9DV9zjZEP5a9YmeBcRTb3ey1oNQitgsN00okAN iar+GRD2IFuMr62RSMZ+9O6ZvLz1xByP5k13uOMnDCCiaQYA1ajpjlRWmL/vXFbdTGYY 1iRw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@amazon.com header.s=amazon201209 header.b="csu/zWJE"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=amazon.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id a8si3155555ejx.662.2020.08.04.02.19.08; Tue, 04 Aug 2020 02:19:31 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@amazon.com header.s=amazon201209 header.b="csu/zWJE"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=amazon.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729606AbgHDJQO (ORCPT + 99 others); Tue, 4 Aug 2020 05:16:14 -0400 Received: from smtp-fw-33001.amazon.com ([207.171.190.10]:25859 "EHLO smtp-fw-33001.amazon.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726201AbgHDJQO (ORCPT ); Tue, 4 Aug 2020 05:16:14 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amazon.com; i=@amazon.com; q=dns/txt; s=amazon201209; t=1596532573; x=1628068573; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version; bh=/TznM7/xseBS3M5AC6EVueb36LhyqU/w6LMQcW6hZjo=; b=csu/zWJEN8ejzAGNtB4d2MLxTAZVSN/JP4WEr11x/EbkS9HthrJKrwba eTU6rIsz9/MiQL7bQ5LTGbheIzfwxGEaOkMEu1IV1CQtaQOA7bD/caAZX pNcz71ewEA9xpYqlSghnpDJ2BzVbSDwv3/YNHL8SkL82l+nPcdsPCBfdI 4=; IronPort-SDR: CKPhQGrXJB6ov4cbze1QCF9ce9TmIsJ5pAoCiLboQHZ2+o80vVlVsRLdsp3kE1aSfs4GT6Rwhq VhETQAWmcwCg== X-IronPort-AV: E=Sophos;i="5.75,433,1589241600"; d="scan'208";a="64155700" Received: from sea32-co-svc-lb4-vlan3.sea.corp.amazon.com (HELO email-inbound-relay-2a-69849ee2.us-west-2.amazon.com) ([10.47.23.38]) by smtp-border-fw-out-33001.sea14.amazon.com with ESMTP; 04 Aug 2020 09:16:12 +0000 Received: from EX13MTAUEA002.ant.amazon.com (pdx4-ws-svc-p6-lb7-vlan2.pdx.amazon.com [10.170.41.162]) by email-inbound-relay-2a-69849ee2.us-west-2.amazon.com (Postfix) with ESMTPS id BDB27A2318; Tue, 4 Aug 2020 09:16:09 +0000 (UTC) Received: from EX13D31EUA001.ant.amazon.com (10.43.165.15) by EX13MTAUEA002.ant.amazon.com (10.43.61.77) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Tue, 4 Aug 2020 09:16:09 +0000 Received: from u886c93fd17d25d.ant.amazon.com (10.43.162.248) by EX13D31EUA001.ant.amazon.com (10.43.165.15) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Tue, 4 Aug 2020 09:15:51 +0000 From: SeongJae Park To: CC: SeongJae Park , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , Subject: [PATCH v19 04/15] mm/damon: Track dynamic monitoring target regions update Date: Tue, 4 Aug 2020 11:14:05 +0200 Message-ID: <20200804091416.31039-5-sjpark@amazon.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20200804091416.31039-1-sjpark@amazon.com> References: <20200804091416.31039-1-sjpark@amazon.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [10.43.162.248] X-ClientProxiedBy: EX13D36UWA004.ant.amazon.com (10.43.160.175) To EX13D31EUA001.ant.amazon.com (10.43.165.15) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: SeongJae Park The monitoring target address range can be dynamically changed. For example, virtual memory could be dynamically mapped and unmapped. Physical memory could be hot-plugged. As the changes could be quite frequent in some cases, DAMON checks the dynamic memory mapping changes and applies it to the abstracted target area only for each of a user-specified time interval, ``regions update interval``. Signed-off-by: SeongJae Park Reviewed-by: Leonard Foerster --- include/linux/damon.h | 20 +++++++++++++++----- mm/damon.c | 23 +++++++++++++++++++++-- 2 files changed, 36 insertions(+), 7 deletions(-) diff --git a/include/linux/damon.h b/include/linux/damon.h index 84a959360f58..6bd86bc47a74 100644 --- a/include/linux/damon.h +++ b/include/linux/damon.h @@ -64,13 +64,16 @@ struct damon_target { * * @sample_interval: The time between access samplings. * @aggr_interval: The time between monitor results aggregations. + * @regions_update_interval: The time between monitor regions updates. * @min_nr_regions: The minimum number of monitoring regions. * @max_nr_regions: The maximum number of monitoring regions. * * For each @sample_interval, DAMON checks whether each region is accessed or * not. It aggregates and keeps the access information (number of accesses to - * each region) for @aggr_interval time. All time intervals are in - * micro-seconds. + * each region) for @aggr_interval time. DAMON also checks whether the target + * memory regions need update (e.g., by ``mmap()`` calls from the application, + * in case of virtual memory monitoring) and applies the changes for each + * @regions_update_interval. All time intervals are in micro-seconds. * * @kdamond: Kernel thread who does the monitoring. * @kdamond_stop: Notifies whether kdamond should stop. @@ -94,6 +97,7 @@ struct damon_target { * @targets_list: Head of monitoring targets (&damon_target) list. * * @init_target_regions: Constructs initial monitoring target regions. + * @update_target_regions: Updates monitoring target regions. * @prepare_access_checks: Prepares next access check of target regions. * @check_accesses: Checks the access of target regions. * @target_valid: Determine if the target is valid. @@ -103,12 +107,15 @@ struct damon_target { * DAMON can be extended for various address spaces by users. For this, users * can register the target address space dependent low level functions for * their usecases via the callback pointers of the context. The monitoring - * thread calls @init_target_regions before starting the monitoring, and + * thread calls @init_target_regions before starting the monitoring, + * @update_target_regions for each @regions_update_interval, and * @prepare_access_checks, @check_accesses, and @target_valid for each * @sample_interval. * * @init_target_regions should construct proper monitoring target regions and * link those to the DAMON context struct. + * @update_target_regions should update the monitoring target regions for + * current status. * @prepare_access_checks should manipulate the monitoring regions to be * prepare for the next access check. * @check_accesses should check the accesses to each region that made after the @@ -125,10 +132,12 @@ struct damon_target { struct damon_ctx { unsigned long sample_interval; unsigned long aggr_interval; + unsigned long regions_update_interval; unsigned long min_nr_regions; unsigned long max_nr_regions; struct timespec64 last_aggregation; + struct timespec64 last_regions_update; struct task_struct *kdamond; bool kdamond_stop; @@ -138,6 +147,7 @@ struct damon_ctx { /* callbacks */ void (*init_target_regions)(struct damon_ctx *context); + void (*update_target_regions)(struct damon_ctx *context); void (*prepare_access_checks)(struct damon_ctx *context); unsigned int (*check_accesses)(struct damon_ctx *context); bool (*target_valid)(struct damon_target *target); @@ -147,8 +157,8 @@ struct damon_ctx { int damon_set_targets(struct damon_ctx *ctx, unsigned long *ids, ssize_t nr_ids); -int damon_set_attrs(struct damon_ctx *ctx, - unsigned long sample_int, unsigned long aggr_int, +int damon_set_attrs(struct damon_ctx *ctx, unsigned long sample_int, + unsigned long aggr_int, unsigned long regions_update_int, unsigned long min_nr_reg, unsigned long max_nr_reg); int damon_start(struct damon_ctx *ctx); int damon_stop(struct damon_ctx *ctx); diff --git a/mm/damon.c b/mm/damon.c index 0b1000e11121..9183b22ab4c9 100644 --- a/mm/damon.c +++ b/mm/damon.c @@ -382,6 +382,17 @@ static void kdamond_split_regions(struct damon_ctx *ctx) last_nr_regions = nr_regions; } +/* + * Check whether it is time to check and apply the target monitoring regions + * + * Returns true if it is. + */ +static bool kdamond_need_update_regions(struct damon_ctx *ctx) +{ + return damon_check_reset_time_interval(&ctx->last_regions_update, + ctx->regions_update_interval); +} + /* * Check whether current monitoring should be stopped * @@ -447,6 +458,12 @@ static int kdamond_fn(void *data) kdamond_reset_aggregated(ctx); kdamond_split_regions(ctx); } + + if (kdamond_need_update_regions(ctx)) { + if (ctx->update_target_regions) + ctx->update_target_regions(ctx); + sz_limit = damon_region_sz_limit(ctx); + } } damon_for_each_target(t, ctx) { damon_for_each_region_safe(r, next, t) @@ -557,6 +574,7 @@ int damon_set_targets(struct damon_ctx *ctx, * damon_set_attrs() - Set attributes for the monitoring. * @ctx: monitoring context * @sample_int: time interval between samplings + * @regions_update_int: time interval between target regions update * @aggr_int: time interval between aggregations * @min_nr_reg: minimal number of regions * @max_nr_reg: maximum number of regions @@ -566,8 +584,8 @@ int damon_set_targets(struct damon_ctx *ctx, * * Return: 0 on success, negative error code otherwise. */ -int damon_set_attrs(struct damon_ctx *ctx, - unsigned long sample_int, unsigned long aggr_int, +int damon_set_attrs(struct damon_ctx *ctx, unsigned long sample_int, + unsigned long aggr_int, unsigned long regions_update_int, unsigned long min_nr_reg, unsigned long max_nr_reg) { if (min_nr_reg < 3) { @@ -583,6 +601,7 @@ int damon_set_attrs(struct damon_ctx *ctx, ctx->sample_interval = sample_int; ctx->aggr_interval = aggr_int; + ctx->regions_update_interval = regions_update_int; ctx->min_nr_regions = min_nr_reg; ctx->max_nr_regions = max_nr_reg; -- 2.17.1