linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/2] Simplify the damon regions access check
@ 2022-08-26  8:31 xiakaixu1987
  2022-08-26  8:31 ` [PATCH 1/2] mm/damon: simplify the parameter passing for 'check_accesses' xiakaixu1987
  2022-08-26  8:31 ` [PATCH 2/2] mm/damon/vaddr: remove comparison between mm and last_mm when checking region accesses xiakaixu1987
  0 siblings, 2 replies; 7+ messages in thread
From: xiakaixu1987 @ 2022-08-26  8:31 UTC (permalink / raw)
  To: sj, akpm; +Cc: damon, linux-mm, linux-kernel, Kaixu Xia

From: Kaixu Xia <kaixuxia@tencent.com>

This patchset simplify the operations when checking the damon
regions accesses.

Kaixu Xia (2):
  mm/damon: simplify the parameter passing for 'check_accesses'
  mm/damon/vaddr: remove comparison between mm and last_mm when checking
    region accesses

 mm/damon/paddr.c |  5 ++---
 mm/damon/vaddr.c | 11 ++++-------
 2 files changed, 6 insertions(+), 10 deletions(-)

-- 
2.27.0


^ permalink raw reply	[flat|nested] 7+ messages in thread

* [PATCH 1/2] mm/damon: simplify the parameter passing for 'check_accesses'
  2022-08-26  8:31 [PATCH 0/2] Simplify the damon regions access check xiakaixu1987
@ 2022-08-26  8:31 ` xiakaixu1987
  2022-08-26 17:08   ` SeongJae Park
  2022-08-26  8:31 ` [PATCH 2/2] mm/damon/vaddr: remove comparison between mm and last_mm when checking region accesses xiakaixu1987
  1 sibling, 1 reply; 7+ messages in thread
From: xiakaixu1987 @ 2022-08-26  8:31 UTC (permalink / raw)
  To: sj, akpm; +Cc: damon, linux-mm, linux-kernel, Kaixu Xia

From: Kaixu Xia <kaixuxia@tencent.com>

The parameter 'struct damon_ctx *ctx' is unnecessary in damon
'check_accesses' callback operation, so we can remove it.

Signed-off-by: Kaixu Xia <kaixuxia@tencent.com>
---
 mm/damon/paddr.c | 5 ++---
 mm/damon/vaddr.c | 5 ++---
 2 files changed, 4 insertions(+), 6 deletions(-)

diff --git a/mm/damon/paddr.c b/mm/damon/paddr.c
index dc131c6a5403..6b0d9e6aa677 100644
--- a/mm/damon/paddr.c
+++ b/mm/damon/paddr.c
@@ -166,8 +166,7 @@ static bool damon_pa_young(unsigned long paddr, unsigned long *page_sz)
 	return result.accessed;
 }
 
-static void __damon_pa_check_access(struct damon_ctx *ctx,
-				    struct damon_region *r)
+static void __damon_pa_check_access(struct damon_region *r)
 {
 	static unsigned long last_addr;
 	static unsigned long last_page_sz = PAGE_SIZE;
@@ -196,7 +195,7 @@ static unsigned int damon_pa_check_accesses(struct damon_ctx *ctx)
 
 	damon_for_each_target(t, ctx) {
 		damon_for_each_region(r, t) {
-			__damon_pa_check_access(ctx, r);
+			__damon_pa_check_access(r);
 			max_nr_accesses = max(r->nr_accesses, max_nr_accesses);
 		}
 	}
diff --git a/mm/damon/vaddr.c b/mm/damon/vaddr.c
index 3c7b9d6dca95..c8c2f306bb6d 100644
--- a/mm/damon/vaddr.c
+++ b/mm/damon/vaddr.c
@@ -532,8 +532,7 @@ static bool damon_va_young(struct mm_struct *mm, unsigned long addr,
  * mm	'mm_struct' for the given virtual address space
  * r	the region to be checked
  */
-static void __damon_va_check_access(struct damon_ctx *ctx,
-			       struct mm_struct *mm, struct damon_region *r)
+static void __damon_va_check_access(struct mm_struct *mm, struct damon_region *r)
 {
 	static struct mm_struct *last_mm;
 	static unsigned long last_addr;
@@ -568,7 +567,7 @@ static unsigned int damon_va_check_accesses(struct damon_ctx *ctx)
 		if (!mm)
 			continue;
 		damon_for_each_region(r, t) {
-			__damon_va_check_access(ctx, mm, r);
+			__damon_va_check_access(mm, r);
 			max_nr_accesses = max(r->nr_accesses, max_nr_accesses);
 		}
 		mmput(mm);
-- 
2.27.0


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH 2/2] mm/damon/vaddr: remove comparison between mm and last_mm when checking region accesses
  2022-08-26  8:31 [PATCH 0/2] Simplify the damon regions access check xiakaixu1987
  2022-08-26  8:31 ` [PATCH 1/2] mm/damon: simplify the parameter passing for 'check_accesses' xiakaixu1987
@ 2022-08-26  8:31 ` xiakaixu1987
  2022-08-26 17:16   ` SeongJae Park
  1 sibling, 1 reply; 7+ messages in thread
From: xiakaixu1987 @ 2022-08-26  8:31 UTC (permalink / raw)
  To: sj, akpm; +Cc: damon, linux-mm, linux-kernel, Kaixu Xia

From: Kaixu Xia <kaixuxia@tencent.com>

The damon regions that belong to the same damon target have the same
'struct mm_struct *mm', so it's unnecessary to compare the mm and last_mm
objects among the damon regions in one damon target when checking accesses.

Signed-off-by: Kaixu Xia <kaixuxia@tencent.com>
---
 mm/damon/vaddr.c | 6 ++----
 1 file changed, 2 insertions(+), 4 deletions(-)

diff --git a/mm/damon/vaddr.c b/mm/damon/vaddr.c
index c8c2f306bb6d..db9d0ab37a52 100644
--- a/mm/damon/vaddr.c
+++ b/mm/damon/vaddr.c
@@ -534,14 +534,13 @@ static bool damon_va_young(struct mm_struct *mm, unsigned long addr,
  */
 static void __damon_va_check_access(struct mm_struct *mm, struct damon_region *r)
 {
-	static struct mm_struct *last_mm;
 	static unsigned long last_addr;
 	static unsigned long last_page_sz = PAGE_SIZE;
 	static bool last_accessed;
 
 	/* If the region is in the last checked page, reuse the result */
-	if (mm == last_mm && (ALIGN_DOWN(last_addr, last_page_sz) ==
-				ALIGN_DOWN(r->sampling_addr, last_page_sz))) {
+	if (ALIGN_DOWN(last_addr, last_page_sz) ==
+				ALIGN_DOWN(r->sampling_addr, last_page_sz)) {
 		if (last_accessed)
 			r->nr_accesses++;
 		return;
@@ -551,7 +550,6 @@ static void __damon_va_check_access(struct mm_struct *mm, struct damon_region *r
 	if (last_accessed)
 		r->nr_accesses++;
 
-	last_mm = mm;
 	last_addr = r->sampling_addr;
 }
 
-- 
2.27.0


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* Re: [PATCH 1/2] mm/damon: simplify the parameter passing for 'check_accesses'
  2022-08-26  8:31 ` [PATCH 1/2] mm/damon: simplify the parameter passing for 'check_accesses' xiakaixu1987
@ 2022-08-26 17:08   ` SeongJae Park
  2022-08-26 20:32     ` Kaixu Xia
  0 siblings, 1 reply; 7+ messages in thread
From: SeongJae Park @ 2022-08-26 17:08 UTC (permalink / raw)
  To: xiakaixu1987; +Cc: sj, akpm, damon, linux-mm, linux-kernel, Kaixu Xia

Hi Kaixu,

On Fri, 26 Aug 2022 16:31:17 +0800 xiakaixu1987@gmail.com wrote:

> From: Kaixu Xia <kaixuxia@tencent.com>
> 
> The parameter 'struct damon_ctx *ctx' is unnecessary in damon
> 'check_accesses' callback operation, so we can remove it.

Thank you for the finding, but this wording is not 100% perfect, strictly
speaking.  The callback operations indeed use the parameter, but the internal
functions called by the callbacks (__damon_{p,v}a_check_access()) aren't.

Could you please update the message?

> 
> Signed-off-by: Kaixu Xia <kaixuxia@tencent.com>
> ---
>  mm/damon/paddr.c | 5 ++---
>  mm/damon/vaddr.c | 5 ++---
>  2 files changed, 4 insertions(+), 6 deletions(-)
> 
> diff --git a/mm/damon/paddr.c b/mm/damon/paddr.c
> index dc131c6a5403..6b0d9e6aa677 100644
> --- a/mm/damon/paddr.c
> +++ b/mm/damon/paddr.c
> @@ -166,8 +166,7 @@ static bool damon_pa_young(unsigned long paddr, unsigned long *page_sz)
>  	return result.accessed;
>  }
>  
> -static void __damon_pa_check_access(struct damon_ctx *ctx,
> -				    struct damon_region *r)
> +static void __damon_pa_check_access(struct damon_region *r)
>  {
>  	static unsigned long last_addr;
>  	static unsigned long last_page_sz = PAGE_SIZE;
> @@ -196,7 +195,7 @@ static unsigned int damon_pa_check_accesses(struct damon_ctx *ctx)
>  
>  	damon_for_each_target(t, ctx) {
>  		damon_for_each_region(r, t) {
> -			__damon_pa_check_access(ctx, r);
> +			__damon_pa_check_access(r);
>  			max_nr_accesses = max(r->nr_accesses, max_nr_accesses);
>  		}
>  	}
> diff --git a/mm/damon/vaddr.c b/mm/damon/vaddr.c
> index 3c7b9d6dca95..c8c2f306bb6d 100644
> --- a/mm/damon/vaddr.c
> +++ b/mm/damon/vaddr.c
> @@ -532,8 +532,7 @@ static bool damon_va_young(struct mm_struct *mm, unsigned long addr,
>   * mm	'mm_struct' for the given virtual address space
>   * r	the region to be checked
>   */
> -static void __damon_va_check_access(struct damon_ctx *ctx,
> -			       struct mm_struct *mm, struct damon_region *r)
> +static void __damon_va_check_access(struct mm_struct *mm, struct damon_region *r)

I still prefer 80 columns rule[1].  Could you please break this line?


[1] https://docs.kernel.org/process/coding-style.html#breaking-long-lines-and-strings

>  {
>  	static struct mm_struct *last_mm;
>  	static unsigned long last_addr;
> @@ -568,7 +567,7 @@ static unsigned int damon_va_check_accesses(struct damon_ctx *ctx)
>  		if (!mm)
>  			continue;
>  		damon_for_each_region(r, t) {
> -			__damon_va_check_access(ctx, mm, r);
> +			__damon_va_check_access(mm, r);
>  			max_nr_accesses = max(r->nr_accesses, max_nr_accesses);
>  		}
>  		mmput(mm);
> -- 
> 2.27.0


Thanks,
SJ

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH 2/2] mm/damon/vaddr: remove comparison between mm and last_mm when checking region accesses
  2022-08-26  8:31 ` [PATCH 2/2] mm/damon/vaddr: remove comparison between mm and last_mm when checking region accesses xiakaixu1987
@ 2022-08-26 17:16   ` SeongJae Park
  2022-08-26 21:06     ` Kaixu Xia
  0 siblings, 1 reply; 7+ messages in thread
From: SeongJae Park @ 2022-08-26 17:16 UTC (permalink / raw)
  To: xiakaixu1987; +Cc: sj, akpm, damon, linux-mm, linux-kernel, Kaixu Xia

Hi Kaixu,

On Fri, 26 Aug 2022 16:31:18 +0800 xiakaixu1987@gmail.com wrote:

> From: Kaixu Xia <kaixuxia@tencent.com>
> 
> The damon regions that belong to the same damon target have the same
> 'struct mm_struct *mm', so it's unnecessary to compare the mm and last_mm
> objects among the damon regions in one damon target when checking accesses.

There could be multiple targets, and 'damon_va_check_accesses()' calls
'__damon_va_check_accesses()' for all the targets.  However,
'damon_va_check_accesses()' doesn't note if '__damon_va_check_accesses()' is
called with a target that same to the target it was called with for the last
time.  Hence the check is necessary.

If I'm missing something, please let me know.


Thanks,
SJ

[...]

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH 1/2] mm/damon: simplify the parameter passing for 'check_accesses'
  2022-08-26 17:08   ` SeongJae Park
@ 2022-08-26 20:32     ` Kaixu Xia
  0 siblings, 0 replies; 7+ messages in thread
From: Kaixu Xia @ 2022-08-26 20:32 UTC (permalink / raw)
  To: SeongJae Park; +Cc: akpm, damon, linux-mm, LKML, Kaixu Xia

On Sat, Aug 27, 2022 at 1:08 AM SeongJae Park <sj@kernel.org> wrote:
>
> Hi Kaixu,
>
> On Fri, 26 Aug 2022 16:31:17 +0800 xiakaixu1987@gmail.com wrote:
>
> > From: Kaixu Xia <kaixuxia@tencent.com>
> >
> > The parameter 'struct damon_ctx *ctx' is unnecessary in damon
> > 'check_accesses' callback operation, so we can remove it.
>
> Thank you for the finding, but this wording is not 100% perfect, strictly
> speaking.  The callback operations indeed use the parameter, but the internal
> functions called by the callbacks (__damon_{p,v}a_check_access()) aren't.
>
> Could you please update the message?

Thanks for your comments. I will update it in the next version.
>
> >
> > Signed-off-by: Kaixu Xia <kaixuxia@tencent.com>
> > ---
> >  mm/damon/paddr.c | 5 ++---
> >  mm/damon/vaddr.c | 5 ++---
> >  2 files changed, 4 insertions(+), 6 deletions(-)
> >
> > diff --git a/mm/damon/paddr.c b/mm/damon/paddr.c
> > index dc131c6a5403..6b0d9e6aa677 100644
> > --- a/mm/damon/paddr.c
> > +++ b/mm/damon/paddr.c
> > @@ -166,8 +166,7 @@ static bool damon_pa_young(unsigned long paddr, unsigned long *page_sz)
> >       return result.accessed;
> >  }
> >
> > -static void __damon_pa_check_access(struct damon_ctx *ctx,
> > -                                 struct damon_region *r)
> > +static void __damon_pa_check_access(struct damon_region *r)
> >  {
> >       static unsigned long last_addr;
> >       static unsigned long last_page_sz = PAGE_SIZE;
> > @@ -196,7 +195,7 @@ static unsigned int damon_pa_check_accesses(struct damon_ctx *ctx)
> >
> >       damon_for_each_target(t, ctx) {
> >               damon_for_each_region(r, t) {
> > -                     __damon_pa_check_access(ctx, r);
> > +                     __damon_pa_check_access(r);
> >                       max_nr_accesses = max(r->nr_accesses, max_nr_accesses);
> >               }
> >       }
> > diff --git a/mm/damon/vaddr.c b/mm/damon/vaddr.c
> > index 3c7b9d6dca95..c8c2f306bb6d 100644
> > --- a/mm/damon/vaddr.c
> > +++ b/mm/damon/vaddr.c
> > @@ -532,8 +532,7 @@ static bool damon_va_young(struct mm_struct *mm, unsigned long addr,
> >   * mm        'mm_struct' for the given virtual address space
> >   * r the region to be checked
> >   */
> > -static void __damon_va_check_access(struct damon_ctx *ctx,
> > -                            struct mm_struct *mm, struct damon_region *r)
> > +static void __damon_va_check_access(struct mm_struct *mm, struct damon_region *r)
>
> I still prefer 80 columns rule[1].  Could you please break this line?
>
>
> [1] https://docs.kernel.org/process/coding-style.html#breaking-long-lines-and-strings

Sorry, I missed the warning in the new 100 characters rules :)  Will fix it.
>
> >  {
> >       static struct mm_struct *last_mm;
> >       static unsigned long last_addr;
> > @@ -568,7 +567,7 @@ static unsigned int damon_va_check_accesses(struct damon_ctx *ctx)
> >               if (!mm)
> >                       continue;
> >               damon_for_each_region(r, t) {
> > -                     __damon_va_check_access(ctx, mm, r);
> > +                     __damon_va_check_access(mm, r);
> >                       max_nr_accesses = max(r->nr_accesses, max_nr_accesses);
> >               }
> >               mmput(mm);
> > --
> > 2.27.0
>
>
> Thanks,
> SJ

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH 2/2] mm/damon/vaddr: remove comparison between mm and last_mm when checking region accesses
  2022-08-26 17:16   ` SeongJae Park
@ 2022-08-26 21:06     ` Kaixu Xia
  0 siblings, 0 replies; 7+ messages in thread
From: Kaixu Xia @ 2022-08-26 21:06 UTC (permalink / raw)
  To: SeongJae Park; +Cc: akpm, damon, linux-mm, LKML, Kaixu Xia

On Sat, Aug 27, 2022 at 1:16 AM SeongJae Park <sj@kernel.org> wrote:
>
> Hi Kaixu,
>
> On Fri, 26 Aug 2022 16:31:18 +0800 xiakaixu1987@gmail.com wrote:
>
> > From: Kaixu Xia <kaixuxia@tencent.com>
> >
> > The damon regions that belong to the same damon target have the same
> > 'struct mm_struct *mm', so it's unnecessary to compare the mm and last_mm
> > objects among the damon regions in one damon target when checking accesses.
>
> There could be multiple targets, and 'damon_va_check_accesses()' calls
> '__damon_va_check_accesses()' for all the targets.  However,
> 'damon_va_check_accesses()' doesn't note if '__damon_va_check_accesses()' is
> called with a target that same to the target it was called with for the last
> time.  Hence the check is necessary.

There could be many regions(1000 max limit) in one target and the mm
is same within
the target, maybe we don't need to maintain the 'last_mm' and do the
check every time
when the target is same.
But yes, the check is necessary when the target changed in
'__damon_va_check_accesses()',
this RFC patch missed this case :)  will fix it.

>
> If I'm missing something, please let me know.
>
>
> Thanks,
> SJ
>
> [...]

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2022-08-26 21:06 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-08-26  8:31 [PATCH 0/2] Simplify the damon regions access check xiakaixu1987
2022-08-26  8:31 ` [PATCH 1/2] mm/damon: simplify the parameter passing for 'check_accesses' xiakaixu1987
2022-08-26 17:08   ` SeongJae Park
2022-08-26 20:32     ` Kaixu Xia
2022-08-26  8:31 ` [PATCH 2/2] mm/damon/vaddr: remove comparison between mm and last_mm when checking region accesses xiakaixu1987
2022-08-26 17:16   ` SeongJae Park
2022-08-26 21:06     ` Kaixu Xia

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).