All of lore.kernel.org
 help / color / mirror / Atom feed
From: alexs@kernel.org
Cc: Alex Shi <alexs@kernel.org>, SeongJae Park <sj@kernel.org>,
	Andrew Morton <akpm@linux-foundation.org>,
	linux-mm@kvack.org, linux-kernel@vger.kernel.org
Subject: [RFC PATCH] mm/damon: remove damon_lock
Date: Wed, 10 Nov 2021 19:47:21 +0800	[thread overview]
Message-ID: <20211110114721.133808-1-alexs@kernel.org> (raw)

From: Alex Shi <alexs@kernel.org>

Variable nr_running_ctxs guards by damon_lock, but a lock for a int
variable seems a bit heavy, a atomic_t is enough.

Signed-off-by: Alex Shi <alexs@kernel.org>
Cc: SeongJae Park <sj@kernel.org> 
Cc: Andrew Morton <akpm@linux-foundation.org> 
Cc: linux-mm@kvack.org 
Cc: linux-kernel@vger.kernel.org 
---
 include/linux/damon.h |  1 -
 mm/damon/core.c       | 31 +++++--------------------------
 mm/damon/dbgfs.c      |  8 +++++---
 3 files changed, 10 insertions(+), 30 deletions(-)

diff --git a/include/linux/damon.h b/include/linux/damon.h
index b4d4be3cc987..e5dcc6336ef2 100644
--- a/include/linux/damon.h
+++ b/include/linux/damon.h
@@ -453,7 +453,6 @@ int damon_set_attrs(struct damon_ctx *ctx, unsigned long sample_int,
 		unsigned long min_nr_reg, unsigned long max_nr_reg);
 int damon_set_schemes(struct damon_ctx *ctx,
 			struct damos **schemes, ssize_t nr_schemes);
-int damon_nr_running_ctxs(void);
 
 int damon_start(struct damon_ctx **ctxs, int nr_ctxs);
 int damon_stop(struct damon_ctx **ctxs, int nr_ctxs);
diff --git a/mm/damon/core.c b/mm/damon/core.c
index c381b3c525d0..e821e36d5c10 100644
--- a/mm/damon/core.c
+++ b/mm/damon/core.c
@@ -26,8 +26,7 @@
 /* Get a random number in [l, r) */
 #define damon_rand(l, r) (l + prandom_u32_max(r - l))
 
-static DEFINE_MUTEX(damon_lock);
-static int nr_running_ctxs;
+atomic_t nr_running_ctxs;
 
 /*
  * Construct a damon_region struct
@@ -356,20 +355,6 @@ int damon_set_schemes(struct damon_ctx *ctx, struct damos **schemes,
 	return 0;
 }
 
-/**
- * damon_nr_running_ctxs() - Return number of currently running contexts.
- */
-int damon_nr_running_ctxs(void)
-{
-	int nr_ctxs;
-
-	mutex_lock(&damon_lock);
-	nr_ctxs = nr_running_ctxs;
-	mutex_unlock(&damon_lock);
-
-	return nr_ctxs;
-}
-
 /* Returns the size upper limit for each monitoring region */
 static unsigned long damon_region_sz_limit(struct damon_ctx *ctx)
 {
@@ -408,7 +393,7 @@ static int __damon_start(struct damon_ctx *ctx)
 	if (!ctx->kdamond) {
 		err = 0;
 		ctx->kdamond = kthread_run(kdamond_fn, ctx, "kdamond.%d",
-				nr_running_ctxs);
+				atomic_read(&nr_running_ctxs));
 		if (IS_ERR(ctx->kdamond)) {
 			err = PTR_ERR(ctx->kdamond);
 			ctx->kdamond = NULL;
@@ -437,19 +422,15 @@ int damon_start(struct damon_ctx **ctxs, int nr_ctxs)
 	int i;
 	int err = 0;
 
-	mutex_lock(&damon_lock);
-	if (nr_running_ctxs) {
-		mutex_unlock(&damon_lock);
+	if (atomic_read(&nr_running_ctxs))
 		return -EBUSY;
-	}
 
 	for (i = 0; i < nr_ctxs; i++) {
 		err = __damon_start(ctxs[i]);
 		if (err)
 			break;
-		nr_running_ctxs++;
+		atomic_inc(&nr_running_ctxs);
 	}
-	mutex_unlock(&damon_lock);
 
 	return err;
 }
@@ -1078,9 +1059,7 @@ static int kdamond_fn(void *data)
 	ctx->kdamond = NULL;
 	mutex_unlock(&ctx->kdamond_lock);
 
-	mutex_lock(&damon_lock);
-	nr_running_ctxs--;
-	mutex_unlock(&damon_lock);
+	atomic_dec(&nr_running_ctxs);
 
 	return 0;
 }
diff --git a/mm/damon/dbgfs.c b/mm/damon/dbgfs.c
index eccc14b34901..7182a46f6a2a 100644
--- a/mm/damon/dbgfs.c
+++ b/mm/damon/dbgfs.c
@@ -20,6 +20,8 @@ static int dbgfs_nr_ctxs;
 static struct dentry **dbgfs_dirs;
 static DEFINE_MUTEX(damon_dbgfs_lock);
 
+extern atomic_t nr_running_ctxs;
+
 /*
  * Returns non-empty string on success, negative error code otherwise.
  */
@@ -688,7 +690,7 @@ static int dbgfs_mk_context(char *name)
 	struct dentry *root, **new_dirs, *new_dir;
 	struct damon_ctx **new_ctxs, *new_ctx;
 
-	if (damon_nr_running_ctxs())
+	if (atomic_read(&nr_running_ctxs))
 		return -EBUSY;
 
 	new_ctxs = krealloc(dbgfs_ctxs, sizeof(*dbgfs_ctxs) *
@@ -772,7 +774,7 @@ static int dbgfs_rm_context(char *name)
 	struct damon_ctx **new_ctxs;
 	int i, j;
 
-	if (damon_nr_running_ctxs())
+	if (atomic_read(&nr_running_ctxs))
 		return -EBUSY;
 
 	root = dbgfs_dirs[0];
@@ -853,7 +855,7 @@ static ssize_t dbgfs_monitor_on_read(struct file *file,
 		char __user *buf, size_t count, loff_t *ppos)
 {
 	char monitor_on_buf[5];
-	bool monitor_on = damon_nr_running_ctxs() != 0;
+	bool monitor_on = atomic_read(&nr_running_ctxs) != 0;
 	int len;
 
 	len = scnprintf(monitor_on_buf, 5, monitor_on ? "on\n" : "off\n");
-- 
2.25.1



WARNING: multiple messages have this Message-ID (diff)
From: alexs@kernel.org
To: unlisted-recipients:; (no To-header on input)
Cc: Alex Shi <alexs@kernel.org>, SeongJae Park <sj@kernel.org>,
	Andrew Morton <akpm@linux-foundation.org>,
	linux-mm@kvack.org, linux-kernel@vger.kernel.org
Subject: [RFC PATCH] mm/damon: remove damon_lock
Date: Wed, 10 Nov 2021 19:47:21 +0800	[thread overview]
Message-ID: <20211110114721.133808-1-alexs@kernel.org> (raw)

From: Alex Shi <alexs@kernel.org>

Variable nr_running_ctxs guards by damon_lock, but a lock for a int
variable seems a bit heavy, a atomic_t is enough.

Signed-off-by: Alex Shi <alexs@kernel.org>
Cc: SeongJae Park <sj@kernel.org> 
Cc: Andrew Morton <akpm@linux-foundation.org> 
Cc: linux-mm@kvack.org 
Cc: linux-kernel@vger.kernel.org 
---
 include/linux/damon.h |  1 -
 mm/damon/core.c       | 31 +++++--------------------------
 mm/damon/dbgfs.c      |  8 +++++---
 3 files changed, 10 insertions(+), 30 deletions(-)

diff --git a/include/linux/damon.h b/include/linux/damon.h
index b4d4be3cc987..e5dcc6336ef2 100644
--- a/include/linux/damon.h
+++ b/include/linux/damon.h
@@ -453,7 +453,6 @@ int damon_set_attrs(struct damon_ctx *ctx, unsigned long sample_int,
 		unsigned long min_nr_reg, unsigned long max_nr_reg);
 int damon_set_schemes(struct damon_ctx *ctx,
 			struct damos **schemes, ssize_t nr_schemes);
-int damon_nr_running_ctxs(void);
 
 int damon_start(struct damon_ctx **ctxs, int nr_ctxs);
 int damon_stop(struct damon_ctx **ctxs, int nr_ctxs);
diff --git a/mm/damon/core.c b/mm/damon/core.c
index c381b3c525d0..e821e36d5c10 100644
--- a/mm/damon/core.c
+++ b/mm/damon/core.c
@@ -26,8 +26,7 @@
 /* Get a random number in [l, r) */
 #define damon_rand(l, r) (l + prandom_u32_max(r - l))
 
-static DEFINE_MUTEX(damon_lock);
-static int nr_running_ctxs;
+atomic_t nr_running_ctxs;
 
 /*
  * Construct a damon_region struct
@@ -356,20 +355,6 @@ int damon_set_schemes(struct damon_ctx *ctx, struct damos **schemes,
 	return 0;
 }
 
-/**
- * damon_nr_running_ctxs() - Return number of currently running contexts.
- */
-int damon_nr_running_ctxs(void)
-{
-	int nr_ctxs;
-
-	mutex_lock(&damon_lock);
-	nr_ctxs = nr_running_ctxs;
-	mutex_unlock(&damon_lock);
-
-	return nr_ctxs;
-}
-
 /* Returns the size upper limit for each monitoring region */
 static unsigned long damon_region_sz_limit(struct damon_ctx *ctx)
 {
@@ -408,7 +393,7 @@ static int __damon_start(struct damon_ctx *ctx)
 	if (!ctx->kdamond) {
 		err = 0;
 		ctx->kdamond = kthread_run(kdamond_fn, ctx, "kdamond.%d",
-				nr_running_ctxs);
+				atomic_read(&nr_running_ctxs));
 		if (IS_ERR(ctx->kdamond)) {
 			err = PTR_ERR(ctx->kdamond);
 			ctx->kdamond = NULL;
@@ -437,19 +422,15 @@ int damon_start(struct damon_ctx **ctxs, int nr_ctxs)
 	int i;
 	int err = 0;
 
-	mutex_lock(&damon_lock);
-	if (nr_running_ctxs) {
-		mutex_unlock(&damon_lock);
+	if (atomic_read(&nr_running_ctxs))
 		return -EBUSY;
-	}
 
 	for (i = 0; i < nr_ctxs; i++) {
 		err = __damon_start(ctxs[i]);
 		if (err)
 			break;
-		nr_running_ctxs++;
+		atomic_inc(&nr_running_ctxs);
 	}
-	mutex_unlock(&damon_lock);
 
 	return err;
 }
@@ -1078,9 +1059,7 @@ static int kdamond_fn(void *data)
 	ctx->kdamond = NULL;
 	mutex_unlock(&ctx->kdamond_lock);
 
-	mutex_lock(&damon_lock);
-	nr_running_ctxs--;
-	mutex_unlock(&damon_lock);
+	atomic_dec(&nr_running_ctxs);
 
 	return 0;
 }
diff --git a/mm/damon/dbgfs.c b/mm/damon/dbgfs.c
index eccc14b34901..7182a46f6a2a 100644
--- a/mm/damon/dbgfs.c
+++ b/mm/damon/dbgfs.c
@@ -20,6 +20,8 @@ static int dbgfs_nr_ctxs;
 static struct dentry **dbgfs_dirs;
 static DEFINE_MUTEX(damon_dbgfs_lock);
 
+extern atomic_t nr_running_ctxs;
+
 /*
  * Returns non-empty string on success, negative error code otherwise.
  */
@@ -688,7 +690,7 @@ static int dbgfs_mk_context(char *name)
 	struct dentry *root, **new_dirs, *new_dir;
 	struct damon_ctx **new_ctxs, *new_ctx;
 
-	if (damon_nr_running_ctxs())
+	if (atomic_read(&nr_running_ctxs))
 		return -EBUSY;
 
 	new_ctxs = krealloc(dbgfs_ctxs, sizeof(*dbgfs_ctxs) *
@@ -772,7 +774,7 @@ static int dbgfs_rm_context(char *name)
 	struct damon_ctx **new_ctxs;
 	int i, j;
 
-	if (damon_nr_running_ctxs())
+	if (atomic_read(&nr_running_ctxs))
 		return -EBUSY;
 
 	root = dbgfs_dirs[0];
@@ -853,7 +855,7 @@ static ssize_t dbgfs_monitor_on_read(struct file *file,
 		char __user *buf, size_t count, loff_t *ppos)
 {
 	char monitor_on_buf[5];
-	bool monitor_on = damon_nr_running_ctxs() != 0;
+	bool monitor_on = atomic_read(&nr_running_ctxs) != 0;
 	int len;
 
 	len = scnprintf(monitor_on_buf, 5, monitor_on ? "on\n" : "off\n");
-- 
2.25.1


             reply	other threads:[~2021-11-10 11:48 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-11-10 11:47 alexs [this message]
2021-11-10 11:47 ` [RFC PATCH] mm/damon: remove damon_lock alexs
2021-11-10 12:40 ` SeongJae Park
2021-11-10 13:41   ` Alex Shi
2021-11-10 14:04     ` Alex Shi
2021-11-10 14:35       ` SeongJae Park
2021-11-10 15:35         ` Alex Shi

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=20211110114721.133808-1-alexs@kernel.org \
    --to=alexs@kernel.org \
    --cc=akpm@linux-foundation.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=sj@kernel.org \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.