| From: SeongJae Park <sj@kernel.org> |
| Subject: mm/damon/reclaim: enable and disable synchronously |
| Date: Tue, 25 Oct 2022 17:36:47 +0000 |
| |
| Patch series "mm/damon/reclaim,lru_sort: enable/disable synchronously". |
| |
| Writing a value to DAMON_RECLAIM and DAMON_LRU_SORT's 'enabled' parameters |
| turns on or off DAMON in an ansychronous way. This means the parameter |
| cannot be used to read the current status of them. 'kdamond_pid' |
| parameter should be used instead for the purpose. The documentation is |
| easy to be read as it works in a synchronous way, so it is a little bit |
| confusing. It also makes the user space tooling dirty. |
| |
| There's no real reason to have the asynchronous behavior, though. Simply |
| make the parameter works synchronously, rather than updating the document. |
| |
| The first and second patches changes the behavior of the 'enabled' |
| parameter for DAMON_RECLAIM and adds a selftest for the changed behavior, |
| respectively. Following two patches make the same changes for |
| DAMON_LRU_SORT. |
| |
| |
| This patch (of 4): |
| |
| Writing a value to DAMON_RECLAIM's 'enabled' parameter turns on or off |
| DAMON in an ansychronous way. This means the parameter cannot be used to |
| read the current status of DAMON_RECLAIM. 'kdamond_pid' parameter should |
| be used instead for the purpose. The documentation is easy to be read as |
| it works in a synchronous way, so it is a little bit confusing. It also |
| makes the user space tooling dirty. |
| |
| There's no real reason to have the asynchronous behavior, though. Simply |
| make the parameter works synchronously, rather than updating the document. |
| |
| Link: https://lkml.kernel.org/r/20221025173650.90624-1-sj@kernel.org |
| Link: https://lkml.kernel.org/r/20221025173650.90624-2-sj@kernel.org |
| Signed-off-by: SeongJae Park <sj@kernel.org> |
| Cc: Shuah Khan <shuah@kernel.org> |
| Signed-off-by: Andrew Morton <akpm@linux-foundation.org> |
| --- |
| |
| mm/damon/reclaim.c | 53 ++++++++++++++++++------------------------- |
| 1 file changed, 23 insertions(+), 30 deletions(-) |
| |
| --- a/mm/damon/reclaim.c~mm-damon-reclaim-enable-and-disable-synchronously |
| +++ a/mm/damon/reclaim.c |
| @@ -9,7 +9,6 @@ |
| |
| #include <linux/damon.h> |
| #include <linux/module.h> |
| -#include <linux/workqueue.h> |
| |
| #include "modules-common.h" |
| |
| @@ -181,38 +180,31 @@ static int damon_reclaim_turn(bool on) |
| return 0; |
| } |
| |
| -static struct delayed_work damon_reclaim_timer; |
| -static void damon_reclaim_timer_fn(struct work_struct *work) |
| -{ |
| - static bool last_enabled; |
| - bool now_enabled; |
| - |
| - now_enabled = enabled; |
| - if (last_enabled != now_enabled) { |
| - if (!damon_reclaim_turn(now_enabled)) |
| - last_enabled = now_enabled; |
| - else |
| - enabled = last_enabled; |
| - } |
| -} |
| -static DECLARE_DELAYED_WORK(damon_reclaim_timer, damon_reclaim_timer_fn); |
| - |
| -static bool damon_reclaim_initialized; |
| - |
| static int damon_reclaim_enabled_store(const char *val, |
| const struct kernel_param *kp) |
| { |
| - int rc = param_set_bool(val, kp); |
| + bool is_enabled = enabled; |
| + bool enable; |
| + int err; |
| + |
| + err = strtobool(val, &enable); |
| + if (err) |
| + return err; |
| |
| - if (rc < 0) |
| - return rc; |
| + if (is_enabled == enable) |
| + return 0; |
| |
| - /* system_wq might not initialized yet */ |
| - if (!damon_reclaim_initialized) |
| - return rc; |
| + /* Called before init function. The function will handle this. */ |
| + if (!ctx) |
| + goto set_param_out; |
| |
| - schedule_delayed_work(&damon_reclaim_timer, 0); |
| - return 0; |
| + err = damon_reclaim_turn(enable); |
| + if (err) |
| + return err; |
| + |
| +set_param_out: |
| + enabled = enable; |
| + return err; |
| } |
| |
| static const struct kernel_param_ops enabled_param_ops = { |
| @@ -262,10 +254,11 @@ static int __init damon_reclaim_init(voi |
| ctx->callback.after_wmarks_check = damon_reclaim_after_wmarks_check; |
| ctx->callback.after_aggregation = damon_reclaim_after_aggregation; |
| |
| - schedule_delayed_work(&damon_reclaim_timer, 0); |
| + /* 'enabled' has set before this function, probably via command line */ |
| + if (enabled) |
| + err = damon_reclaim_turn(true); |
| |
| - damon_reclaim_initialized = true; |
| - return 0; |
| + return err; |
| } |
| |
| module_init(damon_reclaim_init); |
| _ |