diff options
Diffstat (limited to 'mm/damon')
| -rw-r--r-- | mm/damon/stat.c | 7 | ||||
| -rw-r--r-- | mm/damon/sysfs.c | 3 |
2 files changed, 9 insertions, 1 deletions
diff --git a/mm/damon/stat.c b/mm/damon/stat.c index 217bde3c53b9f..723bdd673c105 100644 --- a/mm/damon/stat.c +++ b/mm/damon/stat.c @@ -253,6 +253,12 @@ static int damon_stat_start(void) { int err; + if (damon_stat_context) { + if (damon_is_running(damon_stat_context)) + return -EAGAIN; + damon_destroy_ctx(damon_stat_context); + } + damon_stat_context = damon_stat_build_ctx(); if (!damon_stat_context) return -ENOMEM; @@ -269,6 +275,7 @@ static void damon_stat_stop(void) { damon_stop(&damon_stat_context, 1); damon_destroy_ctx(damon_stat_context); + damon_stat_context = NULL; } static int damon_stat_enabled_store( diff --git a/mm/damon/sysfs.c b/mm/damon/sysfs.c index 21d0196a3bace..fc50edf3c42c8 100644 --- a/mm/damon/sysfs.c +++ b/mm/damon/sysfs.c @@ -1673,7 +1673,8 @@ static int damon_sysfs_turn_damon_on(struct damon_sysfs_kdamond *kdamond) repeat_call_control->data = kdamond; repeat_call_control->repeat = true; repeat_call_control->dealloc_on_cancel = true; - damon_call(ctx, repeat_call_control); + if (damon_call(ctx, repeat_call_control)) + kfree(repeat_call_control); return err; } |
