From: SeongJae Park <sjpark@amazon.com>
To: <akpm@linux-foundation.org>
Cc: SeongJae Park <sjpark@amazon.de>, <Jonathan.Cameron@Huawei.com>,
<aarcange@redhat.com>, <acme@kernel.org>,
<alexander.shishkin@linux.intel.com>, <amit@kernel.org>,
<brendan.d.gregg@gmail.com>, <brendanhiggins@google.com>,
<cai@lca.pw>, <colin.king@canonical.com>, <corbet@lwn.net>,
<dwmw@amazon.com>, <irogers@google.com>, <jolsa@redhat.com>,
<kirill@shutemov.name>, <mark.rutland@arm.com>, <mgorman@suse.de>,
<minchan@kernel.org>, <mingo@redhat.com>, <namhyung@kernel.org>,
<peterz@infradead.org>, <rdunlap@infradead.org>,
<riel@surriel.com>, <rientjes@google.com>, <rostedt@goodmis.org>,
<shakeelb@google.com>, <shuah@kernel.org>, <sj38.park@gmail.com>,
<vbabka@suse.cz>, <vdavydov.dev@gmail.com>,
<yang.shi@linux.alibaba.com>, <ying.huang@intel.com>,
<linux-mm@kvack.org>, <linux-doc@vger.kernel.org>,
<linux-kernel@vger.kernel.org>
Subject: [RFC PATCH 2/4] mm/damon: Clean up code using 'struct damon_addr_range'
Date: Thu, 9 Apr 2020 11:42:30 +0200 [thread overview]
Message-ID: <20200409094232.29680-3-sjpark@amazon.com> (raw)
In-Reply-To: <20200409094232.29680-1-sjpark@amazon.com>
From: SeongJae Park <sjpark@amazon.de>
There are unnecessarily duplicated code in DAMON, that can be eliminated
by using the new struct, 'damon_addr_range'. This commit cleans up the
DAMON code in the way.
Signed-off-by: SeongJae Park <sjpark@amazon.de>
---
mm/damon-test.h | 36 ++++++++++++++--------------
mm/damon.c | 64 +++++++++++++++++++------------------------------
2 files changed, 42 insertions(+), 58 deletions(-)
diff --git a/mm/damon-test.h b/mm/damon-test.h
index 7fd66df1e493..7b2c903f1357 100644
--- a/mm/damon-test.h
+++ b/mm/damon-test.h
@@ -165,7 +165,7 @@ static void damon_test_set_pids(struct kunit *test)
*/
static void damon_test_three_regions_in_vmas(struct kunit *test)
{
- struct region regions[3] = {0,};
+ struct damon_addr_range regions[3] = {0,};
/* 10-20-25, 200-210-220, 300-305, 307-330 */
struct vm_area_struct vmas[] = {
(struct vm_area_struct) {.vm_start = 10, .vm_end = 20},
@@ -306,7 +306,7 @@ static void damon_test_write_rbuf(struct kunit *test)
*/
static void damon_do_test_apply_three_regions(struct kunit *test,
unsigned long *regions, int nr_regions,
- struct region *three_regions,
+ struct damon_addr_range *three_regions,
unsigned long *expected, int nr_expected)
{
struct damon_task *t;
@@ -344,10 +344,10 @@ static void damon_test_apply_three_regions1(struct kunit *test)
unsigned long regions[] = {10, 20, 20, 30, 50, 55, 55, 57, 57, 59,
70, 80, 80, 90, 90, 100};
/* 5-27, 45-55, 73-104 */
- struct region new_three_regions[3] = {
- (struct region){.start = 5, .end = 27},
- (struct region){.start = 45, .end = 55},
- (struct region){.start = 73, .end = 104} };
+ struct damon_addr_range new_three_regions[3] = {
+ (struct damon_addr_range){.start = 5, .end = 27},
+ (struct damon_addr_range){.start = 45, .end = 55},
+ (struct damon_addr_range){.start = 73, .end = 104} };
/* 5-20-27, 45-55, 73-80-90-104 */
unsigned long expected[] = {5, 20, 20, 27, 45, 55,
73, 80, 80, 90, 90, 104};
@@ -366,10 +366,10 @@ static void damon_test_apply_three_regions2(struct kunit *test)
unsigned long regions[] = {10, 20, 20, 30, 50, 55, 55, 57, 57, 59,
70, 80, 80, 90, 90, 100};
/* 5-27, 56-57, 65-104 */
- struct region new_three_regions[3] = {
- (struct region){.start = 5, .end = 27},
- (struct region){.start = 56, .end = 57},
- (struct region){.start = 65, .end = 104} };
+ struct damon_addr_range new_three_regions[3] = {
+ (struct damon_addr_range){.start = 5, .end = 27},
+ (struct damon_addr_range){.start = 56, .end = 57},
+ (struct damon_addr_range){.start = 65, .end = 104} };
/* 5-20-27, 56-57, 65-80-90-104 */
unsigned long expected[] = {5, 20, 20, 27, 56, 57,
65, 80, 80, 90, 90, 104};
@@ -390,10 +390,10 @@ static void damon_test_apply_three_regions3(struct kunit *test)
unsigned long regions[] = {10, 20, 20, 30, 50, 55, 55, 57, 57, 59,
70, 80, 80, 90, 90, 100};
/* 5-27, 61-63, 65-104 */
- struct region new_three_regions[3] = {
- (struct region){.start = 5, .end = 27},
- (struct region){.start = 61, .end = 63},
- (struct region){.start = 65, .end = 104} };
+ struct damon_addr_range new_three_regions[3] = {
+ (struct damon_addr_range){.start = 5, .end = 27},
+ (struct damon_addr_range){.start = 61, .end = 63},
+ (struct damon_addr_range){.start = 65, .end = 104} };
/* 5-20-27, 61-63, 65-80-90-104 */
unsigned long expected[] = {5, 20, 20, 27, 61, 63,
65, 80, 80, 90, 90, 104};
@@ -415,10 +415,10 @@ static void damon_test_apply_three_regions4(struct kunit *test)
unsigned long regions[] = {10, 20, 20, 30, 50, 55, 55, 57, 57, 59,
70, 80, 80, 90, 90, 100};
/* 5-7, 30-32, 65-68 */
- struct region new_three_regions[3] = {
- (struct region){.start = 5, .end = 7},
- (struct region){.start = 30, .end = 32},
- (struct region){.start = 65, .end = 68} };
+ struct damon_addr_range new_three_regions[3] = {
+ (struct damon_addr_range){.start = 5, .end = 7},
+ (struct damon_addr_range){.start = 30, .end = 32},
+ (struct damon_addr_range){.start = 65, .end = 68} };
/* expect 5-7, 30-32, 65-68 */
unsigned long expected[] = {5, 7, 30, 32, 65, 68};
diff --git a/mm/damon.c b/mm/damon.c
index f9958952d09e..80fa3cab7720 100644
--- a/mm/damon.c
+++ b/mm/damon.c
@@ -304,19 +304,15 @@ static int damon_split_region_evenly(struct damon_ctx *ctx,
return 0;
}
-struct region {
- unsigned long start;
- unsigned long end;
-};
-
-static unsigned long sz_region(struct region *r)
+static unsigned long sz_range(struct damon_addr_range *r)
{
return r->end - r->start;
}
-static void swap_regions(struct region *r1, struct region *r2)
+static void swap_ranges(struct damon_addr_range *r1,
+ struct damon_addr_range *r2)
{
- struct region tmp;
+ struct damon_addr_range tmp;
tmp = *r1;
*r1 = *r2;
@@ -327,7 +323,7 @@ static void swap_regions(struct region *r1, struct region *r2)
* Find the three regions in an address space
*
* vma the head vma of the target address space
- * regions an array of three 'struct region's that results will be saved
+ * regions an array of three address ranges that results will be saved
*
* This function receives an address space and finds three regions in it which
* separated by the two biggest unmapped regions in the space. Please refer to
@@ -337,9 +333,9 @@ static void swap_regions(struct region *r1, struct region *r2)
* Returns 0 if success, or negative error code otherwise.
*/
static int damon_three_regions_in_vmas(struct vm_area_struct *vma,
- struct region regions[3])
+ struct damon_addr_range regions[3])
{
- struct region gap = {0,}, first_gap = {0,}, second_gap = {0,};
+ struct damon_addr_range gap = {0,}, first_gap = {0,}, second_gap = {0,};
struct vm_area_struct *last_vma = NULL;
unsigned long start = 0;
@@ -352,20 +348,20 @@ static int damon_three_regions_in_vmas(struct vm_area_struct *vma,
}
gap.start = last_vma->vm_end;
gap.end = vma->vm_start;
- if (sz_region(&gap) > sz_region(&second_gap)) {
- swap_regions(&gap, &second_gap);
- if (sz_region(&second_gap) > sz_region(&first_gap))
- swap_regions(&second_gap, &first_gap);
+ if (sz_range(&gap) > sz_range(&second_gap)) {
+ swap_ranges(&gap, &second_gap);
+ if (sz_range(&second_gap) > sz_range(&first_gap))
+ swap_ranges(&second_gap, &first_gap);
}
last_vma = vma;
}
- if (!sz_region(&second_gap) || !sz_region(&first_gap))
+ if (!sz_range(&second_gap) || !sz_range(&first_gap))
return -EINVAL;
/* Sort the two biggest gaps by address */
if (first_gap.start > second_gap.start)
- swap_regions(&first_gap, &second_gap);
+ swap_ranges(&first_gap, &second_gap);
/* Store the result */
regions[0].start = start;
@@ -384,7 +380,7 @@ static int damon_three_regions_in_vmas(struct vm_area_struct *vma,
* Returns 0 on success, negative error code otherwise.
*/
static int damon_three_regions_of(struct damon_task *t,
- struct region regions[3])
+ struct damon_addr_range regions[3])
{
struct mm_struct *mm;
int rc;
@@ -446,7 +442,7 @@ static int damon_three_regions_of(struct damon_task *t,
static void damon_init_regions_of(struct damon_ctx *c, struct damon_task *t)
{
struct damon_region *r;
- struct region regions[3];
+ struct damon_addr_range regions[3];
int i;
if (damon_three_regions_of(t, regions)) {
@@ -864,18 +860,6 @@ static void damon_merge_two_regions(struct damon_region *l,
damon_destroy_region(r);
}
-static inline void set_last_area(struct damon_region *r, struct region *last)
-{
- r->last_ar.start = last->start;
- r->last_ar.end = last->end;
-}
-
-static inline void get_last_area(struct damon_region *r, struct region *last)
-{
- last->start = r->last_ar.start;
- last->end = r->last_ar.end;
-}
-
/*
* Merge adjacent regions having similar access frequencies
*
@@ -900,7 +884,7 @@ static inline void get_last_area(struct damon_region *r, struct region *last)
static void damon_merge_regions_of(struct damon_task *t, unsigned int thres)
{
struct damon_region *r, *prev = NULL, *next;
- struct region biggest_mergee; /* the biggest region being merged */
+ struct damon_addr_range biggest_mergee;
unsigned long sz_biggest = 0; /* size of the biggest_mergee */
unsigned long sz_mergee = 0; /* size of current mergee */
@@ -908,11 +892,11 @@ static void damon_merge_regions_of(struct damon_task *t, unsigned int thres)
if (!prev || prev->ar.end != r->ar.start ||
diff_of(prev->nr_accesses, r->nr_accesses) > thres) {
if (sz_biggest)
- set_last_area(prev, &biggest_mergee);
+ prev->last_ar = biggest_mergee;
prev = r;
sz_biggest = sz_damon_region(prev);
- get_last_area(prev, &biggest_mergee);
+ biggest_mergee = prev->ar;
continue;
}
@@ -921,7 +905,7 @@ static void damon_merge_regions_of(struct damon_task *t, unsigned int thres)
sz_mergee += sz_damon_region(r);
if (sz_mergee > sz_biggest) {
sz_biggest = sz_mergee;
- get_last_area(r, &biggest_mergee);
+ biggest_mergee = r->ar;
}
/*
@@ -934,7 +918,7 @@ static void damon_merge_regions_of(struct damon_task *t, unsigned int thres)
damon_merge_two_regions(prev, r);
}
if (sz_biggest)
- set_last_area(prev, &biggest_mergee);
+ prev->last_ar = biggest_mergee;
}
/*
@@ -1032,7 +1016,7 @@ static bool kdamond_need_update_regions(struct damon_ctx *ctx)
ctx->regions_update_interval);
}
-static bool damon_intersect(struct damon_region *r, struct region *re)
+static bool damon_intersect(struct damon_region *r, struct damon_addr_range *re)
{
return !(r->ar.end <= re->start || re->end <= r->ar.start);
}
@@ -1044,7 +1028,7 @@ static bool damon_intersect(struct damon_region *r, struct region *re)
* bregions the three big regions of the task
*/
static void damon_apply_three_regions(struct damon_ctx *ctx,
- struct damon_task *t, struct region bregions[3])
+ struct damon_task *t, struct damon_addr_range bregions[3])
{
struct damon_region *r, *next;
unsigned int i = 0;
@@ -1063,7 +1047,7 @@ static void damon_apply_three_regions(struct damon_ctx *ctx,
for (i = 0; i < 3; i++) {
struct damon_region *first = NULL, *last;
struct damon_region *newr;
- struct region *br;
+ struct damon_addr_range *br;
br = &bregions[i];
/* Get the first and last regions which intersects with br */
@@ -1092,7 +1076,7 @@ static void damon_apply_three_regions(struct damon_ctx *ctx,
*/
static void kdamond_update_regions(struct damon_ctx *ctx)
{
- struct region three_regions[3];
+ struct damon_addr_range three_regions[3];
struct damon_task *t;
damon_for_each_task(ctx, t) {
--
2.17.1
next prev parent reply other threads:[~2020-04-09 9:44 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-04-09 9:42 [RFC PATCH 0/4] DAMON: Make Configurable for Various Address Spaces Including Physical Memory SeongJae Park
2020-04-09 9:42 ` [RFC PATCH 1/4] mm/damon: Use vm-independent address range concept SeongJae Park
2020-04-09 9:42 ` SeongJae Park [this message]
2020-04-09 9:42 ` [RFC PATCH 3/4] mm/damon: Make monitoring target regions init/update configurable SeongJae Park
2020-04-09 9:42 ` [RFC PATCH 4/4] mm/damon: Make access check configurable SeongJae Park
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=20200409094232.29680-3-sjpark@amazon.com \
--to=sjpark@amazon.com \
--cc=Jonathan.Cameron@Huawei.com \
--cc=aarcange@redhat.com \
--cc=acme@kernel.org \
--cc=akpm@linux-foundation.org \
--cc=alexander.shishkin@linux.intel.com \
--cc=amit@kernel.org \
--cc=brendan.d.gregg@gmail.com \
--cc=brendanhiggins@google.com \
--cc=cai@lca.pw \
--cc=colin.king@canonical.com \
--cc=corbet@lwn.net \
--cc=dwmw@amazon.com \
--cc=irogers@google.com \
--cc=jolsa@redhat.com \
--cc=kirill@shutemov.name \
--cc=linux-doc@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=mark.rutland@arm.com \
--cc=mgorman@suse.de \
--cc=minchan@kernel.org \
--cc=mingo@redhat.com \
--cc=namhyung@kernel.org \
--cc=peterz@infradead.org \
--cc=rdunlap@infradead.org \
--cc=riel@surriel.com \
--cc=rientjes@google.com \
--cc=rostedt@goodmis.org \
--cc=shakeelb@google.com \
--cc=shuah@kernel.org \
--cc=sj38.park@gmail.com \
--cc=sjpark@amazon.de \
--cc=vbabka@suse.cz \
--cc=vdavydov.dev@gmail.com \
--cc=yang.shi@linux.alibaba.com \
--cc=ying.huang@intel.com \
/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.