| From: SeongJae Park <sj@kernel.org> |
| Subject: mm/damon/modules: deduplicate init steps for DAMON context setup |
| Date: Wed, 26 Oct 2022 22:59:42 +0000 |
| |
| DAMON_RECLAIM and DAMON_LRU_SORT has duplicated code for DAMON context and |
| target initializations. Deduplicate the part by implementing a function |
| for the initialization in 'modules-common.c' and using it. |
| |
| Link: https://lkml.kernel.org/r/20221026225943.100429-12-sj@kernel.org |
| Signed-off-by: SeongJae Park <sj@kernel.org> |
| Signed-off-by: Andrew Morton <akpm@linux-foundation.org> |
| --- |
| |
| mm/damon/Makefile | 4 +-- |
| mm/damon/lru_sort.c | 17 ++------------ |
| mm/damon/modules-common.c | 42 ++++++++++++++++++++++++++++++++++++ |
| mm/damon/modules-common.h | 3 ++ |
| mm/damon/reclaim.c | 17 ++------------ |
| 5 files changed, 53 insertions(+), 30 deletions(-) |
| |
| --- a/mm/damon/lru_sort.c~mm-damon-modules-deduplicate-init-steps-for-damon-context-setup |
| +++ a/mm/damon/lru_sort.c |
| @@ -314,25 +314,14 @@ static int damon_lru_sort_after_wmarks_c |
| |
| static int __init damon_lru_sort_init(void) |
| { |
| - ctx = damon_new_ctx(); |
| - if (!ctx) |
| - return -ENOMEM; |
| + int err = damon_modules_new_paddr_ctx_target(&ctx, &target); |
| |
| - if (damon_select_ops(ctx, DAMON_OPS_PADDR)) { |
| - damon_destroy_ctx(ctx); |
| - return -EINVAL; |
| - } |
| + if (err) |
| + return err; |
| |
| ctx->callback.after_wmarks_check = damon_lru_sort_after_wmarks_check; |
| ctx->callback.after_aggregation = damon_lru_sort_after_aggregation; |
| |
| - target = damon_new_target(); |
| - if (!target) { |
| - damon_destroy_ctx(ctx); |
| - return -ENOMEM; |
| - } |
| - damon_add_target(ctx, target); |
| - |
| schedule_delayed_work(&damon_lru_sort_timer, 0); |
| |
| damon_lru_sort_initialized = true; |
| --- a/mm/damon/Makefile~mm-damon-modules-deduplicate-init-steps-for-damon-context-setup |
| +++ a/mm/damon/Makefile |
| @@ -5,5 +5,5 @@ obj-$(CONFIG_DAMON_VADDR) += ops-common. |
| obj-$(CONFIG_DAMON_PADDR) += ops-common.o paddr.o |
| obj-$(CONFIG_DAMON_SYSFS) += sysfs-common.o sysfs-schemes.o sysfs.o |
| obj-$(CONFIG_DAMON_DBGFS) += dbgfs.o |
| -obj-$(CONFIG_DAMON_RECLAIM) += reclaim.o |
| -obj-$(CONFIG_DAMON_LRU_SORT) += lru_sort.o |
| +obj-$(CONFIG_DAMON_RECLAIM) += modules-common.o reclaim.o |
| +obj-$(CONFIG_DAMON_LRU_SORT) += modules-common.o lru_sort.o |
| --- /dev/null |
| +++ a/mm/damon/modules-common.c |
| @@ -0,0 +1,42 @@ |
| +// SPDX-License-Identifier: GPL-2.0 |
| +/* |
| + * Common Primitives for DAMON Modules |
| + * |
| + * Author: SeongJae Park <sjpark@amazon.de> |
| + */ |
| + |
| +#include <linux/damon.h> |
| + |
| +#include "modules-common.h" |
| + |
| +/* |
| + * Allocate, set, and return a DAMON context for the physical address space. |
| + * @ctxp: Pointer to save the point to the newly created context |
| + * @targetp: Pointer to save the point to the newly created target |
| + */ |
| +int damon_modules_new_paddr_ctx_target(struct damon_ctx **ctxp, |
| + struct damon_target **targetp) |
| +{ |
| + struct damon_ctx *ctx; |
| + struct damon_target *target; |
| + |
| + ctx = damon_new_ctx(); |
| + if (!ctx) |
| + return -ENOMEM; |
| + |
| + if (damon_select_ops(ctx, DAMON_OPS_PADDR)) { |
| + damon_destroy_ctx(ctx); |
| + return -EINVAL; |
| + } |
| + |
| + target = damon_new_target(); |
| + if (!target) { |
| + damon_destroy_ctx(ctx); |
| + return -ENOMEM; |
| + } |
| + damon_add_target(ctx, target); |
| + |
| + *ctxp = ctx; |
| + *targetp = target; |
| + return 0; |
| +} |
| --- a/mm/damon/modules-common.h~mm-damon-modules-deduplicate-init-steps-for-damon-context-setup |
| +++ a/mm/damon/modules-common.h |
| @@ -44,3 +44,6 @@ |
| 0400); \ |
| module_param_named(nr_##qt_exceed_name, stat.qt_exceeds, ulong, \ |
| 0400); |
| + |
| +int damon_modules_new_paddr_ctx_target(struct damon_ctx **ctxp, |
| + struct damon_target **targetp); |
| --- a/mm/damon/reclaim.c~mm-damon-modules-deduplicate-init-steps-for-damon-context-setup |
| +++ a/mm/damon/reclaim.c |
| @@ -256,25 +256,14 @@ static int damon_reclaim_after_wmarks_ch |
| |
| static int __init damon_reclaim_init(void) |
| { |
| - ctx = damon_new_ctx(); |
| - if (!ctx) |
| - return -ENOMEM; |
| + int err = damon_modules_new_paddr_ctx_target(&ctx, &target); |
| |
| - if (damon_select_ops(ctx, DAMON_OPS_PADDR)) { |
| - damon_destroy_ctx(ctx); |
| - return -EINVAL; |
| - } |
| + if (err) |
| + return err; |
| |
| ctx->callback.after_wmarks_check = damon_reclaim_after_wmarks_check; |
| ctx->callback.after_aggregation = damon_reclaim_after_aggregation; |
| |
| - target = damon_new_target(); |
| - if (!target) { |
| - damon_destroy_ctx(ctx); |
| - return -ENOMEM; |
| - } |
| - damon_add_target(ctx, target); |
| - |
| schedule_delayed_work(&damon_reclaim_timer, 0); |
| |
| damon_reclaim_initialized = true; |
| _ |