* [PATCH v2 1/2] mm/damon: have damon_get_folio return folio even for tail pages
@ 2025-01-20 10:16 Usama Arif
2025-01-20 10:16 ` [PATCH v2 2/2] mm/damon: introduce DAMOS filter type hugepage Usama Arif
0 siblings, 1 reply; 4+ messages in thread
From: Usama Arif @ 2025-01-20 10:16 UTC (permalink / raw)
To: sj, akpm; +Cc: damon, linux-mm, Usama Arif
This effectively adds support for large folios in damon for paddr,
as damon_pa_mkold/young won't get a null folio from this function
and won't ignore it, hence access will be checked and reported.
This also means that larger folios will be considered for
different DAMOS actions like pageout, prioritization and migration.
As these DAMOS actions will consider larger folios, iterate through
the region at folio_size and not PAGE_SIZE intervals.
This should not have an affect on vaddr, as damon_young_pmd_entry
considers pmd entries.
Signed-off-by: Usama Arif <usamaarif642@gmail.com>
Reviewed-by: SeongJae Park <sj@kernel.org>
---
mm/damon/ops-common.c | 2 +-
mm/damon/paddr.c | 24 ++++++++++++++++++------
2 files changed, 19 insertions(+), 7 deletions(-)
diff --git a/mm/damon/ops-common.c b/mm/damon/ops-common.c
index d25d99cb5f2b..d511be201c4c 100644
--- a/mm/damon/ops-common.c
+++ b/mm/damon/ops-common.c
@@ -24,7 +24,7 @@ struct folio *damon_get_folio(unsigned long pfn)
struct page *page = pfn_to_online_page(pfn);
struct folio *folio;
- if (!page || PageTail(page))
+ if (!page)
return NULL;
folio = page_folio(page);
diff --git a/mm/damon/paddr.c b/mm/damon/paddr.c
index bd8cfe10121b..c0ccf4fade24 100644
--- a/mm/damon/paddr.c
+++ b/mm/damon/paddr.c
@@ -266,11 +266,14 @@ static unsigned long damon_pa_pageout(struct damon_region *r, struct damos *s,
damos_add_filter(s, filter);
}
- for (addr = r->ar.start; addr < r->ar.end; addr += PAGE_SIZE) {
+ addr = r->ar.start;
+ while (addr < r->ar.end) {
struct folio *folio = damon_get_folio(PHYS_PFN(addr));
- if (!folio)
+ if (!folio) {
+ addr += PAGE_SIZE;
continue;
+ }
if (damos_pa_filter_out(s, folio))
goto put_folio;
@@ -286,6 +289,7 @@ static unsigned long damon_pa_pageout(struct damon_region *r, struct damos *s,
else
list_add(&folio->lru, &folio_list);
put_folio:
+ addr += folio_size(folio);
folio_put(folio);
}
if (install_young_filter)
@@ -301,11 +305,14 @@ static inline unsigned long damon_pa_mark_accessed_or_deactivate(
{
unsigned long addr, applied = 0;
- for (addr = r->ar.start; addr < r->ar.end; addr += PAGE_SIZE) {
+ addr = r->ar.start;
+ while (addr < r->ar.end) {
struct folio *folio = damon_get_folio(PHYS_PFN(addr));
- if (!folio)
+ if (!folio) {
+ addr += PAGE_SIZE;
continue;
+ }
if (damos_pa_filter_out(s, folio))
goto put_folio;
@@ -318,6 +325,7 @@ static inline unsigned long damon_pa_mark_accessed_or_deactivate(
folio_deactivate(folio);
applied += folio_nr_pages(folio);
put_folio:
+ addr += folio_size(folio);
folio_put(folio);
}
return applied * PAGE_SIZE;
@@ -464,11 +472,14 @@ static unsigned long damon_pa_migrate(struct damon_region *r, struct damos *s,
unsigned long addr, applied;
LIST_HEAD(folio_list);
- for (addr = r->ar.start; addr < r->ar.end; addr += PAGE_SIZE) {
+ addr = r->ar.start;
+ while (addr < r->ar.end) {
struct folio *folio = damon_get_folio(PHYS_PFN(addr));
- if (!folio)
+ if (!folio) {
+ addr += PAGE_SIZE;
continue;
+ }
if (damos_pa_filter_out(s, folio))
goto put_folio;
@@ -479,6 +490,7 @@ static unsigned long damon_pa_migrate(struct damon_region *r, struct damos *s,
goto put_folio;
list_add(&folio->lru, &folio_list);
put_folio:
+ addr += folio_size(folio);
folio_put(folio);
}
applied = damon_pa_migrate_pages(&folio_list, s->target_nid);
--
2.43.5
^ permalink raw reply [flat|nested] 4+ messages in thread* [PATCH v2 2/2] mm/damon: introduce DAMOS filter type hugepage
2025-01-20 10:16 [PATCH v2 1/2] mm/damon: have damon_get_folio return folio even for tail pages Usama Arif
@ 2025-01-20 10:16 ` Usama Arif
2025-01-20 18:08 ` SeongJae Park
0 siblings, 1 reply; 4+ messages in thread
From: Usama Arif @ 2025-01-20 10:16 UTC (permalink / raw)
To: sj, akpm; +Cc: damon, linux-mm, Usama Arif
This is to gather statistics to check if memory regions of specific
access tempratures are backed by hugepages. This includes both THPs
and hugetlbfs.
This filter can help to observe and prove the effectivenes of
different schemes for shrinking/collapsing hugepages.
Signed-off-by: Usama Arif <usamaarif642@gmail.com>
---
v1 -> v2:
- Wrap DAMOS_FILTER_TYPE_HUGEPAGE case with
CONFIG_PGTABLE_HAS_HUGE_LEAVES (SJ Park)
---
include/linux/damon.h | 4 ++++
mm/damon/paddr.c | 5 +++++
mm/damon/sysfs-schemes.c | 3 +++
3 files changed, 12 insertions(+)
diff --git a/include/linux/damon.h b/include/linux/damon.h
index af525252b853..b0dbf380ab76 100644
--- a/include/linux/damon.h
+++ b/include/linux/damon.h
@@ -326,6 +326,7 @@ struct damos_stat {
* @DAMOS_FILTER_TYPE_ANON: Anonymous pages.
* @DAMOS_FILTER_TYPE_MEMCG: Specific memcg's pages.
* @DAMOS_FILTER_TYPE_YOUNG: Recently accessed pages.
+ * @DAMOS_FILTER_TYPE_HUGEPAGE: Page is part of a hugepage.
* @DAMOS_FILTER_TYPE_ADDR: Address range.
* @DAMOS_FILTER_TYPE_TARGET: Data Access Monitoring target.
* @NR_DAMOS_FILTER_TYPES: Number of filter types.
@@ -345,6 +346,9 @@ enum damos_filter_type {
DAMOS_FILTER_TYPE_ANON,
DAMOS_FILTER_TYPE_MEMCG,
DAMOS_FILTER_TYPE_YOUNG,
+#if defined(CONFIG_PGTABLE_HAS_HUGE_LEAVES)
+ DAMOS_FILTER_TYPE_HUGEPAGE,
+#endif
DAMOS_FILTER_TYPE_ADDR,
DAMOS_FILTER_TYPE_TARGET,
NR_DAMOS_FILTER_TYPES,
diff --git a/mm/damon/paddr.c b/mm/damon/paddr.c
index c0ccf4fade24..224308140441 100644
--- a/mm/damon/paddr.c
+++ b/mm/damon/paddr.c
@@ -222,6 +222,11 @@ static bool damos_pa_filter_match(struct damos_filter *filter,
if (matched)
damon_folio_mkold(folio);
break;
+#if defined(CONFIG_PGTABLE_HAS_HUGE_LEAVES)
+ case DAMOS_FILTER_TYPE_HUGEPAGE:
+ matched = folio_size(folio) == HPAGE_PMD_SIZE;
+ break;
+#endif
default:
break;
}
diff --git a/mm/damon/sysfs-schemes.c b/mm/damon/sysfs-schemes.c
index 98f93ae9f59e..3eb3ec464591 100644
--- a/mm/damon/sysfs-schemes.c
+++ b/mm/damon/sysfs-schemes.c
@@ -329,6 +329,9 @@ static const char * const damon_sysfs_scheme_filter_type_strs[] = {
"anon",
"memcg",
"young",
+#if defined(CONFIG_PGTABLE_HAS_HUGE_LEAVES)
+ "hugepage",
+#endif
"addr",
"target",
};
--
2.43.5
^ permalink raw reply [flat|nested] 4+ messages in thread* Re: [PATCH v2 2/2] mm/damon: introduce DAMOS filter type hugepage
2025-01-20 10:16 ` [PATCH v2 2/2] mm/damon: introduce DAMOS filter type hugepage Usama Arif
@ 2025-01-20 18:08 ` SeongJae Park
2025-01-20 18:15 ` Usama Arif
0 siblings, 1 reply; 4+ messages in thread
From: SeongJae Park @ 2025-01-20 18:08 UTC (permalink / raw)
To: Usama Arif; +Cc: SeongJae Park, akpm, damon, linux-mm
On Mon, 20 Jan 2025 10:16:50 +0000 Usama Arif <usamaarif642@gmail.com> wrote:
> This is to gather statistics to check if memory regions of specific
> access tempratures are backed by hugepages. This includes both THPs
> and hugetlbfs.
> This filter can help to observe and prove the effectivenes of
> different schemes for shrinking/collapsing hugepages.
>
> Signed-off-by: Usama Arif <usamaarif642@gmail.com>
> ---
> v1 -> v2:
> - Wrap DAMOS_FILTER_TYPE_HUGEPAGE case with
> CONFIG_PGTABLE_HAS_HUGE_LEAVES (SJ Park)
> ---
> include/linux/damon.h | 4 ++++
> mm/damon/paddr.c | 5 +++++
> mm/damon/sysfs-schemes.c | 3 +++
> 3 files changed, 12 insertions(+)
>
> diff --git a/include/linux/damon.h b/include/linux/damon.h
> index af525252b853..b0dbf380ab76 100644
> --- a/include/linux/damon.h
> +++ b/include/linux/damon.h
> @@ -326,6 +326,7 @@ struct damos_stat {
> * @DAMOS_FILTER_TYPE_ANON: Anonymous pages.
> * @DAMOS_FILTER_TYPE_MEMCG: Specific memcg's pages.
> * @DAMOS_FILTER_TYPE_YOUNG: Recently accessed pages.
> + * @DAMOS_FILTER_TYPE_HUGEPAGE: Page is part of a hugepage.
> * @DAMOS_FILTER_TYPE_ADDR: Address range.
> * @DAMOS_FILTER_TYPE_TARGET: Data Access Monitoring target.
> * @NR_DAMOS_FILTER_TYPES: Number of filter types.
> @@ -345,6 +346,9 @@ enum damos_filter_type {
> DAMOS_FILTER_TYPE_ANON,
> DAMOS_FILTER_TYPE_MEMCG,
> DAMOS_FILTER_TYPE_YOUNG,
> +#if defined(CONFIG_PGTABLE_HAS_HUGE_LEAVES)
> + DAMOS_FILTER_TYPE_HUGEPAGE,
> +#endif
I'd prefer not enclosing this part with CONFIG_PGTABLE_HAS_HUGE_LEAVES, so that
users can simply use it. If the config is not set, damos_pa_filter_match()
will just say nothing is hugepage, and hence will work sanely, in my opinion.
> DAMOS_FILTER_TYPE_ADDR,
> DAMOS_FILTER_TYPE_TARGET,
> NR_DAMOS_FILTER_TYPES,
> diff --git a/mm/damon/paddr.c b/mm/damon/paddr.c
> index c0ccf4fade24..224308140441 100644
> --- a/mm/damon/paddr.c
> +++ b/mm/damon/paddr.c
> @@ -222,6 +222,11 @@ static bool damos_pa_filter_match(struct damos_filter *filter,
> if (matched)
> damon_folio_mkold(folio);
> break;
> +#if defined(CONFIG_PGTABLE_HAS_HUGE_LEAVES)
> + case DAMOS_FILTER_TYPE_HUGEPAGE:
> + matched = folio_size(folio) == HPAGE_PMD_SIZE;
> + break;
> +#endif
This part looks good to me.
> default:
> break;
> }
> diff --git a/mm/damon/sysfs-schemes.c b/mm/damon/sysfs-schemes.c
> index 98f93ae9f59e..3eb3ec464591 100644
> --- a/mm/damon/sysfs-schemes.c
> +++ b/mm/damon/sysfs-schemes.c
> @@ -329,6 +329,9 @@ static const char * const damon_sysfs_scheme_filter_type_strs[] = {
> "anon",
> "memcg",
> "young",
> +#if defined(CONFIG_PGTABLE_HAS_HUGE_LEAVES)
> + "hugepage",
> +#endif
Again, I'd prefer not enclosing this part.
> "addr",
> "target",
> };
> --
> 2.43.5
Thanks,
SJ
^ permalink raw reply [flat|nested] 4+ messages in thread* Re: [PATCH v2 2/2] mm/damon: introduce DAMOS filter type hugepage
2025-01-20 18:08 ` SeongJae Park
@ 2025-01-20 18:15 ` Usama Arif
0 siblings, 0 replies; 4+ messages in thread
From: Usama Arif @ 2025-01-20 18:15 UTC (permalink / raw)
To: SeongJae Park; +Cc: akpm, damon, linux-mm
On 20/01/2025 18:08, SeongJae Park wrote:
> On Mon, 20 Jan 2025 10:16:50 +0000 Usama Arif <usamaarif642@gmail.com> wrote:
>
>> This is to gather statistics to check if memory regions of specific
>> access tempratures are backed by hugepages. This includes both THPs
>> and hugetlbfs.
>> This filter can help to observe and prove the effectivenes of
>> different schemes for shrinking/collapsing hugepages.
>>
>> Signed-off-by: Usama Arif <usamaarif642@gmail.com>
>> ---
>> v1 -> v2:
>> - Wrap DAMOS_FILTER_TYPE_HUGEPAGE case with
>> CONFIG_PGTABLE_HAS_HUGE_LEAVES (SJ Park)
>> ---
>> include/linux/damon.h | 4 ++++
>> mm/damon/paddr.c | 5 +++++
>> mm/damon/sysfs-schemes.c | 3 +++
>> 3 files changed, 12 insertions(+)
>>
>> diff --git a/include/linux/damon.h b/include/linux/damon.h
>> index af525252b853..b0dbf380ab76 100644
>> --- a/include/linux/damon.h
>> +++ b/include/linux/damon.h
>> @@ -326,6 +326,7 @@ struct damos_stat {
>> * @DAMOS_FILTER_TYPE_ANON: Anonymous pages.
>> * @DAMOS_FILTER_TYPE_MEMCG: Specific memcg's pages.
>> * @DAMOS_FILTER_TYPE_YOUNG: Recently accessed pages.
>> + * @DAMOS_FILTER_TYPE_HUGEPAGE: Page is part of a hugepage.
>> * @DAMOS_FILTER_TYPE_ADDR: Address range.
>> * @DAMOS_FILTER_TYPE_TARGET: Data Access Monitoring target.
>> * @NR_DAMOS_FILTER_TYPES: Number of filter types.
>> @@ -345,6 +346,9 @@ enum damos_filter_type {
>> DAMOS_FILTER_TYPE_ANON,
>> DAMOS_FILTER_TYPE_MEMCG,
>> DAMOS_FILTER_TYPE_YOUNG,
>> +#if defined(CONFIG_PGTABLE_HAS_HUGE_LEAVES)
>> + DAMOS_FILTER_TYPE_HUGEPAGE,
>> +#endif
>
> I'd prefer not enclosing this part with CONFIG_PGTABLE_HAS_HUGE_LEAVES, so that
> users can simply use it. If the config is not set, damos_pa_filter_match()
> will just say nothing is hugepage, and hence will work sanely, in my opinion.
>
I was going along the path of not even exposing it to the userspace in sysfs,
so that the user might not get confused about hugepages. But I agree the alternate
is good a well, with just 0 being returned. I will send v3 without it.
>> DAMOS_FILTER_TYPE_ADDR,
>> DAMOS_FILTER_TYPE_TARGET,
>> NR_DAMOS_FILTER_TYPES,
>> diff --git a/mm/damon/paddr.c b/mm/damon/paddr.c
>> index c0ccf4fade24..224308140441 100644
>> --- a/mm/damon/paddr.c
>> +++ b/mm/damon/paddr.c
>> @@ -222,6 +222,11 @@ static bool damos_pa_filter_match(struct damos_filter *filter,
>> if (matched)
>> damon_folio_mkold(folio);
>> break;
>> +#if defined(CONFIG_PGTABLE_HAS_HUGE_LEAVES)
>> + case DAMOS_FILTER_TYPE_HUGEPAGE:
>> + matched = folio_size(folio) == HPAGE_PMD_SIZE;
>> + break;
>> +#endif
>
> This part looks good to me.
>
>> default:
>> break;
>> }
>> diff --git a/mm/damon/sysfs-schemes.c b/mm/damon/sysfs-schemes.c
>> index 98f93ae9f59e..3eb3ec464591 100644
>> --- a/mm/damon/sysfs-schemes.c
>> +++ b/mm/damon/sysfs-schemes.c
>> @@ -329,6 +329,9 @@ static const char * const damon_sysfs_scheme_filter_type_strs[] = {
>> "anon",
>> "memcg",
>> "young",
>> +#if defined(CONFIG_PGTABLE_HAS_HUGE_LEAVES)
>> + "hugepage",
>> +#endif
>
> Again, I'd prefer not enclosing this part.
>
>> "addr",
>> "target",
>> };
>> --
>> 2.43.5
>
>
> Thanks,
> SJ
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2025-01-20 18:16 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2025-01-20 10:16 [PATCH v2 1/2] mm/damon: have damon_get_folio return folio even for tail pages Usama Arif
2025-01-20 10:16 ` [PATCH v2 2/2] mm/damon: introduce DAMOS filter type hugepage Usama Arif
2025-01-20 18:08 ` SeongJae Park
2025-01-20 18:15 ` Usama Arif
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox