From: SeongJae Park <sjpark@amazon.com>
To: <akpm@linux-foundation.org>
Cc: SeongJae Park <sjpark@amazon.de>, <acme@kernel.org>,
<alexander.shishkin@linux.intel.com>, <amit@kernel.org>,
<brendan.d.gregg@gmail.com>, <brendanhiggins@google.com>,
<cai@lca.pw>, <colin.king@canonical.com>, <corbet@lwn.net>,
<dwmw@amazon.com>, <jolsa@redhat.com>, <kirill@shutemov.name>,
<mark.rutland@arm.com>, <mgorman@suse.de>, <minchan@kernel.org>,
<mingo@redhat.com>, <namhyung@kernel.org>, <peterz@infradead.org>,
<rdunlap@infradead.org>, <rostedt@goodmis.org>,
<shuah@kernel.org>, <sj38.park@gmail.com>,
<vdavydov.dev@gmail.com>, <linux-mm@kvack.org>,
<linux-doc@vger.kernel.org>, <linux-kernel@vger.kernel.org>
Subject: [PATCH v5 07/14] mm/damon: Implement kernel space API
Date: Mon, 17 Feb 2020 11:25:37 +0100 [thread overview]
Message-ID: <20200217102544.29012-8-sjpark@amazon.com> (raw)
In-Reply-To: <20200217102544.29012-1-sjpark@amazon.com>
From: SeongJae Park <sjpark@amazon.de>
This commit implements the DAMON api for the kernel. Other kernel code
can use DAMON by calling damon_start() and damon_stop() with their own
'struct damon_ctx'.
Signed-off-by: SeongJae Park <sjpark@amazon.de>
---
include/linux/damon.h | 71 +++++++++++++++++++++++++++++++++++++++++++
mm/damon.c | 71 +++++++++----------------------------------
2 files changed, 85 insertions(+), 57 deletions(-)
create mode 100644 include/linux/damon.h
diff --git a/include/linux/damon.h b/include/linux/damon.h
new file mode 100644
index 000000000000..78785cb88d42
--- /dev/null
+++ b/include/linux/damon.h
@@ -0,0 +1,71 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * DAMON api
+ *
+ * Copyright 2019 Amazon.com, Inc. or its affiliates. All rights reserved.
+ *
+ * Author: SeongJae Park <sjpark@amazon.de>
+ */
+
+#ifndef _DAMON_H_
+#define _DAMON_H_
+
+#include <linux/random.h>
+#include <linux/spinlock_types.h>
+#include <linux/time64.h>
+#include <linux/types.h>
+
+/* Represents a monitoring target region on the virtual address space */
+struct damon_region {
+ unsigned long vm_start;
+ unsigned long vm_end;
+ unsigned long sampling_addr;
+ unsigned int nr_accesses;
+ struct list_head list;
+};
+
+/* Represents a monitoring target task */
+struct damon_task {
+ unsigned long pid;
+ struct list_head regions_list;
+ struct list_head list;
+};
+
+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;
+
+ unsigned char *rbuf;
+ unsigned int rbuf_len;
+ unsigned int rbuf_offset;
+ char *rfile_path;
+
+ struct task_struct *kdamond;
+ bool kdamond_stop;
+ spinlock_t kdamond_lock;
+
+ struct rnd_state rndseed;
+
+ struct list_head tasks_list; /* 'damon_task' objects */
+
+ /* callbacks */
+ void (*sample_cb)(struct damon_ctx *context);
+ void (*aggregate_cb)(struct damon_ctx *context);
+};
+
+int damon_set_pids(struct damon_ctx *ctx,
+ unsigned long *pids, ssize_t nr_pids);
+int damon_set_recording(struct damon_ctx *ctx,
+ unsigned int rbuf_len, char *rfile_path);
+int damon_set_attrs(struct damon_ctx *ctx, unsigned long s, unsigned long a,
+ unsigned long r, unsigned long min, unsigned long max);
+int damon_start(struct damon_ctx *ctx);
+int damon_stop(struct damon_ctx *ctx);
+
+#endif
diff --git a/mm/damon.c b/mm/damon.c
index 3d46bf5e353a..45d82128e3ac 100644
--- a/mm/damon.c
+++ b/mm/damon.c
@@ -9,6 +9,7 @@
#define pr_fmt(fmt) "damon: " fmt
+#include <linux/damon.h>
#include <linux/delay.h>
#include <linux/kthread.h>
#include <linux/mm.h>
@@ -40,60 +41,6 @@
#define damon_for_each_task_safe(ctx, t, next) \
list_for_each_entry_safe(t, next, &(ctx)->tasks_list, list)
-/* Represents a monitoring target region on the virtual address space */
-struct damon_region {
- unsigned long vm_start;
- unsigned long vm_end;
- unsigned long sampling_addr;
- unsigned int nr_accesses;
- struct list_head list;
-};
-
-/* Represents a monitoring target task */
-struct damon_task {
- unsigned long pid;
- struct list_head regions_list;
- struct list_head list;
-};
-
-/*
- * 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 each 'aggr_interval' time. And for each
- * 'regions_update_interval', damon checks whether the memory mapping of the
- * target tasks has changed (e.g., by mmap() calls from the applications) and
- * applies the changes.
- *
- * All time intervals are in micro-seconds.
- */
-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;
-
- unsigned char *rbuf;
- unsigned int rbuf_len;
- unsigned int rbuf_offset;
- char *rfile_path;
-
- struct task_struct *kdamond;
- bool kdamond_stop;
- spinlock_t kdamond_lock;
-
- struct rnd_state rndseed;
-
- struct list_head tasks_list; /* 'damon_task' objects */
-
- /* callbacks */
- void (*sample_cb)(struct damon_ctx *context);
- void (*aggregate_cb)(struct damon_ctx *context);
-};
-
#define MAX_RFILE_PATH_LEN 256
/* Get a random number in [l, r) */
@@ -961,10 +908,20 @@ static int damon_turn_kdamond(struct damon_ctx *ctx, bool on)
return 0;
}
+int damon_start(struct damon_ctx *ctx)
+{
+ return damon_turn_kdamond(ctx, true);
+}
+
+int damon_stop(struct damon_ctx *ctx)
+{
+ return damon_turn_kdamond(ctx, false);
+}
+
/*
* This function should not be called while the kdamond is running.
*/
-static int damon_set_pids(struct damon_ctx *ctx,
+int damon_set_pids(struct damon_ctx *ctx,
unsigned long *pids, ssize_t nr_pids)
{
ssize_t i;
@@ -998,7 +955,7 @@ static int damon_set_pids(struct damon_ctx *ctx,
*
* Returns 0 on success, negative error code otherwise.
*/
-static int damon_set_recording(struct damon_ctx *ctx,
+int damon_set_recording(struct damon_ctx *ctx,
unsigned int rbuf_len, char *rfile_path)
{
size_t rfile_path_len;
@@ -1044,7 +1001,7 @@ static int damon_set_recording(struct damon_ctx *ctx,
*
* Returns 0 on success, negative error code otherwise.
*/
-static int damon_set_attrs(struct damon_ctx *ctx, unsigned long sample_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)
{
--
2.17.1
next prev parent reply other threads:[~2020-02-17 10:27 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-02-17 10:25 [PATCH v5 00/14] Introduce Data Access MONitor (DAMON) SeongJae Park
2020-02-17 10:25 ` [PATCH v5 01/14] mm: " SeongJae Park
2020-02-17 10:25 ` [PATCH v5 02/14] mm/damon: Implement region based sampling SeongJae Park
2020-02-21 13:51 ` SeongJae Park
2020-02-17 10:25 ` [PATCH v5 03/14] mm/damon: Adaptively adjust regions SeongJae Park
2020-02-17 10:25 ` [PATCH v5 04/14] mm/damon: Apply dynamic memory mapping changes SeongJae Park
2020-02-17 10:25 ` [PATCH v5 05/14] mm/damon: Implement callbacks SeongJae Park
2020-02-17 10:25 ` [PATCH v5 06/14] mm/damon: Implement access pattern recording SeongJae Park
2020-02-17 10:25 ` SeongJae Park [this message]
2020-02-17 10:25 ` [PATCH v5 08/14] mm/damon: Add debugfs interface SeongJae Park
2020-02-17 10:25 ` [PATCH v5 09/14] mm/damon: Add a tracepoint for result writing SeongJae Park
2020-02-17 10:28 ` [PATCH v5 10/14] tools: Add a minimal user-space tool for DAMON SeongJae Park
2020-02-17 10:29 ` [PATCH v5 11/14] Documentation/admin-guide/mm: Add a document " SeongJae Park
2020-02-17 10:30 ` [PATCH v5 12/14] mm/damon: Add kunit tests SeongJae Park
2020-02-17 10:30 ` [PATCH v5 13/14] mm/damon: Add user selftests SeongJae Park
2020-02-17 10:31 ` [PATCH v5 14/14] MAINTAINERS: Update for DAMON SeongJae Park
2020-02-20 8:17 ` [PATCH v5 00/14] Introduce Data Access MONitor (DAMON) SeongJae Park
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20200217102544.29012-8-sjpark@amazon.com \
--to=sjpark@amazon.com \
--cc=acme@kernel.org \
--cc=akpm@linux-foundation.org \
--cc=alexander.shishkin@linux.intel.com \
--cc=amit@kernel.org \
--cc=brendan.d.gregg@gmail.com \
--cc=brendanhiggins@google.com \
--cc=cai@lca.pw \
--cc=colin.king@canonical.com \
--cc=corbet@lwn.net \
--cc=dwmw@amazon.com \
--cc=jolsa@redhat.com \
--cc=kirill@shutemov.name \
--cc=linux-doc@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=mark.rutland@arm.com \
--cc=mgorman@suse.de \
--cc=minchan@kernel.org \
--cc=mingo@redhat.com \
--cc=namhyung@kernel.org \
--cc=peterz@infradead.org \
--cc=rdunlap@infradead.org \
--cc=rostedt@goodmis.org \
--cc=shuah@kernel.org \
--cc=sj38.park@gmail.com \
--cc=sjpark@amazon.de \
--cc=vdavydov.dev@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).