2022-09-09 03:13:34

by haoxin

[permalink] [raw]
Subject: [PATCH V4] mm/damon: Remove duplicate get_monitoring_region() definitions

In lru_sort.c and reclaim.c, they are all defining get_monitoring_region()
function, there is no need to define it separately.

As 'get_monitoring_region()' is not a 'static' function anymore, we try
to use a prefix to distinguish with other functions, so there rename it
to 'damon_find_biggest_system_ram'.

Suggested-by: SeongJae Park <[email protected]>
Signed-off-by: Xin Hao <[email protected]>
---
include/linux/damon.h | 11 +++++++++++
mm/damon/core.c | 29 +++++++++++++++++++++++++++++
mm/damon/lru_sort.c | 37 ++-----------------------------------
mm/damon/reclaim.c | 37 ++-----------------------------------
4 files changed, 44 insertions(+), 70 deletions(-)

diff --git a/include/linux/damon.h b/include/linux/damon.h
index 7b1f4a488230..6c863b281fb2 100644
--- a/include/linux/damon.h
+++ b/include/linux/damon.h
@@ -448,6 +448,16 @@ struct damon_ctx {
struct list_head schemes;
};

+/**
+ * struct damon_system_ram_region - System RAM resource address region of [@start, @end).
+ * @start: Start address of the (inclusive).
+ * @end: End address of the region (exclusive).
+ */
+struct damon_system_ram_region {
+ unsigned long start;
+ unsigned long end;
+};
+
static inline struct damon_region *damon_next_region(struct damon_region *r)
{
return container_of(r->list.next, struct damon_region, list);
@@ -500,6 +510,7 @@ void damon_add_region(struct damon_region *r, struct damon_target *t);
void damon_destroy_region(struct damon_region *r, struct damon_target *t);
int damon_set_regions(struct damon_target *t, struct damon_addr_range *ranges,
unsigned int nr_ranges);
+bool damon_find_biggest_system_ram(unsigned long *start, unsigned long *end);

struct damos *damon_new_scheme(
unsigned long min_sz_region, unsigned long max_sz_region,
diff --git a/mm/damon/core.c b/mm/damon/core.c
index 7d25dc582fe3..d07181e1473b 100644
--- a/mm/damon/core.c
+++ b/mm/damon/core.c
@@ -276,6 +276,35 @@ struct damos *damon_new_scheme(
return scheme;
}

+static int walk_system_ram(struct resource *res, void *arg)
+{
+ struct damon_system_ram_region *a = arg;
+
+ if (a->end - a->start < resource_size(res)) {
+ a->start = res->start;
+ a->end = res->end;
+ }
+ return 0;
+}
+
+/*
+ * Find biggest 'System RAM' resource and store its start and end address in
+ * @start and @end, respectively. If no System RAM is found, returns false.
+ */
+bool damon_find_biggest_system_ram(unsigned long *start, unsigned long *end)
+
+{
+ struct damon_system_ram_region arg = {};
+
+ walk_system_ram_res(0, ULONG_MAX, &arg, walk_system_ram);
+ if (arg.end <= arg.start)
+ return false;
+
+ *start = arg.start;
+ *end = arg.end;
+ return true;
+}
+
void damon_add_scheme(struct damon_ctx *ctx, struct damos *s)
{
list_add_tail(&s->list, &ctx->schemes);
diff --git a/mm/damon/lru_sort.c b/mm/damon/lru_sort.c
index 9de6f00a71c5..b8ec52739e0f 100644
--- a/mm/damon/lru_sort.c
+++ b/mm/damon/lru_sort.c
@@ -257,39 +257,6 @@ module_param(nr_cold_quota_exceeds, ulong, 0400);
static struct damon_ctx *ctx;
static struct damon_target *target;

-struct damon_lru_sort_ram_walk_arg {
- unsigned long start;
- unsigned long end;
-};
-
-static int walk_system_ram(struct resource *res, void *arg)
-{
- struct damon_lru_sort_ram_walk_arg *a = arg;
-
- if (a->end - a->start < resource_size(res)) {
- a->start = res->start;
- a->end = res->end;
- }
- return 0;
-}
-
-/*
- * Find biggest 'System RAM' resource and store its start and end address in
- * @start and @end, respectively. If no System RAM is found, returns false.
- */
-static bool get_monitoring_region(unsigned long *start, unsigned long *end)
-{
- struct damon_lru_sort_ram_walk_arg arg = {};
-
- walk_system_ram_res(0, ULONG_MAX, &arg, walk_system_ram);
- if (arg.end <= arg.start)
- return false;
-
- *start = arg.start;
- *end = arg.end;
- return true;
-}
-
/* Create a DAMON-based operation scheme for hot memory regions */
static struct damos *damon_lru_sort_new_hot_scheme(unsigned int hot_thres)
{
@@ -404,8 +371,8 @@ static int damon_lru_sort_apply_parameters(void)
if (monitor_region_start > monitor_region_end)
return -EINVAL;
if (!monitor_region_start && !monitor_region_end &&
- !get_monitoring_region(&monitor_region_start,
- &monitor_region_end))
+ !damon_find_biggest_system_ram(&monitor_region_start,
+ &monitor_region_end))
return -EINVAL;
addr_range.start = monitor_region_start;
addr_range.end = monitor_region_end;
diff --git a/mm/damon/reclaim.c b/mm/damon/reclaim.c
index a7faf51b4bd4..7d41913cb0e1 100644
--- a/mm/damon/reclaim.c
+++ b/mm/damon/reclaim.c
@@ -229,39 +229,6 @@ module_param(nr_quota_exceeds, ulong, 0400);
static struct damon_ctx *ctx;
static struct damon_target *target;

-struct damon_reclaim_ram_walk_arg {
- unsigned long start;
- unsigned long end;
-};
-
-static int walk_system_ram(struct resource *res, void *arg)
-{
- struct damon_reclaim_ram_walk_arg *a = arg;
-
- if (a->end - a->start < resource_size(res)) {
- a->start = res->start;
- a->end = res->end;
- }
- return 0;
-}
-
-/*
- * Find biggest 'System RAM' resource and store its start and end address in
- * @start and @end, respectively. If no System RAM is found, returns false.
- */
-static bool get_monitoring_region(unsigned long *start, unsigned long *end)
-{
- struct damon_reclaim_ram_walk_arg arg = {};
-
- walk_system_ram_res(0, ULONG_MAX, &arg, walk_system_ram);
- if (arg.end <= arg.start)
- return false;
-
- *start = arg.start;
- *end = arg.end;
- return true;
-}
-
static struct damos *damon_reclaim_new_scheme(void)
{
struct damos_watermarks wmarks = {
@@ -323,8 +290,8 @@ static int damon_reclaim_apply_parameters(void)
if (monitor_region_start > monitor_region_end)
return -EINVAL;
if (!monitor_region_start && !monitor_region_end &&
- !get_monitoring_region(&monitor_region_start,
- &monitor_region_end))
+ !damon_find_biggest_system_ram(&monitor_region_start,
+ &monitor_region_end))
return -EINVAL;
addr_range.start = monitor_region_start;
addr_range.end = monitor_region_end;
--
2.31.0


2022-09-09 20:48:18

by SeongJae Park

[permalink] [raw]
Subject: Re: [PATCH V4] mm/damon: Remove duplicate get_monitoring_region() definitions

On Fri, 9 Sep 2022 10:41:05 +0800 Xin Hao <[email protected]> wrote:

> In lru_sort.c and reclaim.c, they are all defining get_monitoring_region()
> function, there is no need to define it separately.
>
> As 'get_monitoring_region()' is not a 'static' function anymore, we try
> to use a prefix to distinguish with other functions, so there rename it
> to 'damon_find_biggest_system_ram'.
>
> Suggested-by: SeongJae Park <[email protected]>
> Signed-off-by: Xin Hao <[email protected]>
> ---
> include/linux/damon.h | 11 +++++++++++
> mm/damon/core.c | 29 +++++++++++++++++++++++++++++
> mm/damon/lru_sort.c | 37 ++-----------------------------------
> mm/damon/reclaim.c | 37 ++-----------------------------------
> 4 files changed, 44 insertions(+), 70 deletions(-)
>
> diff --git a/include/linux/damon.h b/include/linux/damon.h
> index 7b1f4a488230..6c863b281fb2 100644
> --- a/include/linux/damon.h
> +++ b/include/linux/damon.h
> @@ -448,6 +448,16 @@ struct damon_ctx {
> struct list_head schemes;
> };
>
> +/**
> + * struct damon_system_ram_region - System RAM resource address region of [@start, @end).

I prefer 80 columns, let's break down this line.
https://docs.kernel.org/process/coding-style.html#breaking-long-lines-and-strings

Also this struct is gonna be used by only damon_find_biggest_system_ram(), so I
think it might make more sense to move this into core.c.

And, as this is not aimed to directly be used by external API users, I think it
would make more sense to hide from kernel doc (/* instead of /**).

> + * @start: Start address of the (inclusive).

of the 'region'?

> + * @end: End address of the region (exclusive).

I like the nice explanation: whether its inclusive or exclusive.

> + */
> +struct damon_system_ram_region {
> + unsigned long start;
> + unsigned long end;
> +};
> +

As this struct is only used by damon_find_biggest_system_ram(), I think it
might make more sense to move this into core.c?

Below parts all look good.

Also, this patch seems cannot cleanly applied on top of the latest
mm/mm-unstable branch. Would need rebase.


Thanks,
SJ

[...]

2022-09-09 21:49:31

by SeongJae Park

[permalink] [raw]
Subject: Re: [PATCH V4] mm/damon: Remove duplicate get_monitoring_region() definitions

As my previous comments are almost only cosmetic trivial nits and I don't want
to make this unnecessarily delayed long, I made the changes on my own and
posted it:
https://lore.kernel.org/damon/[email protected]/

Xin, if there was anything I missed or there is anything you disagree about my
changes, please let me know.


Thanks,
SJ

On Fri, 9 Sep 2022 20:45:20 +0000 SeongJae Park <[email protected]> wrote:

> On Fri, 9 Sep 2022 10:41:05 +0800 Xin Hao <[email protected]> wrote:
>
> > In lru_sort.c and reclaim.c, they are all defining get_monitoring_region()
> > function, there is no need to define it separately.
> >
> > As 'get_monitoring_region()' is not a 'static' function anymore, we try
> > to use a prefix to distinguish with other functions, so there rename it
> > to 'damon_find_biggest_system_ram'.
> >
> > Suggested-by: SeongJae Park <[email protected]>
> > Signed-off-by: Xin Hao <[email protected]>
> > ---
> > include/linux/damon.h | 11 +++++++++++
> > mm/damon/core.c | 29 +++++++++++++++++++++++++++++
> > mm/damon/lru_sort.c | 37 ++-----------------------------------
> > mm/damon/reclaim.c | 37 ++-----------------------------------
> > 4 files changed, 44 insertions(+), 70 deletions(-)
> >
> > diff --git a/include/linux/damon.h b/include/linux/damon.h
> > index 7b1f4a488230..6c863b281fb2 100644
> > --- a/include/linux/damon.h
> > +++ b/include/linux/damon.h
> > @@ -448,6 +448,16 @@ struct damon_ctx {
> > struct list_head schemes;
> > };
> >
> > +/**
> > + * struct damon_system_ram_region - System RAM resource address region of [@start, @end).
>
> I prefer 80 columns, let's break down this line.
> https://docs.kernel.org/process/coding-style.html#breaking-long-lines-and-strings
>
> Also this struct is gonna be used by only damon_find_biggest_system_ram(), so I
> think it might make more sense to move this into core.c.
>
> And, as this is not aimed to directly be used by external API users, I think it
> would make more sense to hide from kernel doc (/* instead of /**).
>
> > + * @start: Start address of the (inclusive).
>
> of the 'region'?
>
> > + * @end: End address of the region (exclusive).
>
> I like the nice explanation: whether its inclusive or exclusive.
>
> > + */
> > +struct damon_system_ram_region {
> > + unsigned long start;
> > + unsigned long end;
> > +};
> > +
>
> As this struct is only used by damon_find_biggest_system_ram(), I think it
> might make more sense to move this into core.c?
>
> Below parts all look good.
>
> Also, this patch seems cannot cleanly applied on top of the latest
> mm/mm-unstable branch. Would need rebase.
>
>
> Thanks,
> SJ
>
> [...]
>

2022-09-10 01:29:40

by haoxin

[permalink] [raw]
Subject: Re: [PATCH V4] mm/damon: Remove duplicate get_monitoring_region() definitions


在 2022/9/10 上午5:39, SeongJae Park 写道:
> As my previous comments are almost only cosmetic trivial nits and I don't want
> to make this unnecessarily delayed long, I made the changes on my own and
> posted it:
> https://lore.kernel.org/damon/[email protected]/
Thanks a lot for your modification,your suggestion is reasonable too.
>
> Xin, if there was anything I missed or there is anything you disagree about my
> changes, please let me know.
>
>
> Thanks,
> SJ
>
> On Fri, 9 Sep 2022 20:45:20 +0000 SeongJae Park <[email protected]> wrote:
>
>> On Fri, 9 Sep 2022 10:41:05 +0800 Xin Hao <[email protected]> wrote:
>>
>>> In lru_sort.c and reclaim.c, they are all defining get_monitoring_region()
>>> function, there is no need to define it separately.
>>>
>>> As 'get_monitoring_region()' is not a 'static' function anymore, we try
>>> to use a prefix to distinguish with other functions, so there rename it
>>> to 'damon_find_biggest_system_ram'.
>>>
>>> Suggested-by: SeongJae Park <[email protected]>
>>> Signed-off-by: Xin Hao <[email protected]>
>>> ---
>>> include/linux/damon.h | 11 +++++++++++
>>> mm/damon/core.c | 29 +++++++++++++++++++++++++++++
>>> mm/damon/lru_sort.c | 37 ++-----------------------------------
>>> mm/damon/reclaim.c | 37 ++-----------------------------------
>>> 4 files changed, 44 insertions(+), 70 deletions(-)
>>>
>>> diff --git a/include/linux/damon.h b/include/linux/damon.h
>>> index 7b1f4a488230..6c863b281fb2 100644
>>> --- a/include/linux/damon.h
>>> +++ b/include/linux/damon.h
>>> @@ -448,6 +448,16 @@ struct damon_ctx {
>>> struct list_head schemes;
>>> };
>>>
>>> +/**
>>> + * struct damon_system_ram_region - System RAM resource address region of [@start, @end).
>> I prefer 80 columns, let's break down this line.
>> https://docs.kernel.org/process/coding-style.html#breaking-long-lines-and-strings
>>
>> Also this struct is gonna be used by only damon_find_biggest_system_ram(), so I
>> think it might make more sense to move this into core.c.
>>
>> And, as this is not aimed to directly be used by external API users, I think it
>> would make more sense to hide from kernel doc (/* instead of /**).
>>
>>> + * @start: Start address of the (inclusive).
>> of the 'region'?
>>
>>> + * @end: End address of the region (exclusive).
>> I like the nice explanation: whether its inclusive or exclusive.
>>
>>> + */
>>> +struct damon_system_ram_region {
>>> + unsigned long start;
>>> + unsigned long end;
>>> +};
>>> +
>> As this struct is only used by damon_find_biggest_system_ram(), I think it
>> might make more sense to move this into core.c?
>>
>> Below parts all look good.
>>
>> Also, this patch seems cannot cleanly applied on top of the latest
>> mm/mm-unstable branch. Would need rebase.
>>
>>
>> Thanks,
>> SJ
>>
>> [...]
>>