Message ID | 4fd9e467d49ae4a747e428bcd821c7d13125ae67.1718090413.git.baolin.wang@linux.alibaba.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | add mTHP support for anonymous shmem | expand |
Hi Baolin, On Tue, Jun 11, 2024 at 6:11 PM Baolin Wang <baolin.wang@linux.alibaba.com> wrote: > > Add mTHP counters for anonymous shmem. > > Signed-off-by: Baolin Wang <baolin.wang@linux.alibaba.com> > --- > include/linux/huge_mm.h | 3 +++ > mm/huge_memory.c | 6 ++++++ > mm/shmem.c | 18 +++++++++++++++--- > 3 files changed, 24 insertions(+), 3 deletions(-) > > diff --git a/include/linux/huge_mm.h b/include/linux/huge_mm.h > index 909cfc67521d..212cca384d7e 100644 > --- a/include/linux/huge_mm.h > +++ b/include/linux/huge_mm.h > @@ -281,6 +281,9 @@ enum mthp_stat_item { > MTHP_STAT_ANON_FAULT_FALLBACK_CHARGE, > MTHP_STAT_SWPOUT, > MTHP_STAT_SWPOUT_FALLBACK, > + MTHP_STAT_FILE_ALLOC, > + MTHP_STAT_FILE_FALLBACK, > + MTHP_STAT_FILE_FALLBACK_CHARGE, > __MTHP_STAT_COUNT > }; > > diff --git a/mm/huge_memory.c b/mm/huge_memory.c > index 1360a1903b66..3fbcd77f5957 100644 > --- a/mm/huge_memory.c > +++ b/mm/huge_memory.c > @@ -555,6 +555,9 @@ DEFINE_MTHP_STAT_ATTR(anon_fault_fallback, MTHP_STAT_ANON_FAULT_FALLBACK); > DEFINE_MTHP_STAT_ATTR(anon_fault_fallback_charge, MTHP_STAT_ANON_FAULT_FALLBACK_CHARGE); > DEFINE_MTHP_STAT_ATTR(swpout, MTHP_STAT_SWPOUT); > DEFINE_MTHP_STAT_ATTR(swpout_fallback, MTHP_STAT_SWPOUT_FALLBACK); > +DEFINE_MTHP_STAT_ATTR(file_alloc, MTHP_STAT_FILE_ALLOC); > +DEFINE_MTHP_STAT_ATTR(file_fallback, MTHP_STAT_FILE_FALLBACK); > +DEFINE_MTHP_STAT_ATTR(file_fallback_charge, MTHP_STAT_FILE_FALLBACK_CHARGE); > > static struct attribute *stats_attrs[] = { > &anon_fault_alloc_attr.attr, > @@ -562,6 +565,9 @@ static struct attribute *stats_attrs[] = { > &anon_fault_fallback_charge_attr.attr, > &swpout_attr.attr, > &swpout_fallback_attr.attr, > + &file_alloc_attr.attr, > + &file_fallback_attr.attr, > + &file_fallback_charge_attr.attr, > NULL, > }; > > diff --git a/mm/shmem.c b/mm/shmem.c > index f5469c357be6..99bd3c34f0fb 100644 > --- a/mm/shmem.c > +++ b/mm/shmem.c > @@ -1773,6 +1773,9 @@ static struct folio *shmem_alloc_and_add_folio(struct vm_fault *vmf, > > if (pages == HPAGE_PMD_NR) > count_vm_event(THP_FILE_FALLBACK); > +#ifdef CONFIG_TRANSPARENT_HUGEPAGE > + count_mthp_stat(order, MTHP_STAT_FILE_FALLBACK); > +#endif Using the conditional compilation directives here is a bit weird :) Would there be any issues if we were to drop them? Since THP_FILE_FALLBACK is working as expected, MTHP_STAT_FILE_FALLBACK should work as well without the conditional compilation directives, IIUC. Thanks, Lance > order = next_order(&suitable_orders, order); > } > } else { > @@ -1792,9 +1795,15 @@ static struct folio *shmem_alloc_and_add_folio(struct vm_fault *vmf, > if (xa_find(&mapping->i_pages, &index, > index + pages - 1, XA_PRESENT)) { > error = -EEXIST; > - } else if (pages == HPAGE_PMD_NR) { > - count_vm_event(THP_FILE_FALLBACK); > - count_vm_event(THP_FILE_FALLBACK_CHARGE); > + } else if (pages > 1) { > + if (pages == HPAGE_PMD_NR) { > + count_vm_event(THP_FILE_FALLBACK); > + count_vm_event(THP_FILE_FALLBACK_CHARGE); > + } > +#ifdef CONFIG_TRANSPARENT_HUGEPAGE > + count_mthp_stat(folio_order(folio), MTHP_STAT_FILE_FALLBACK); > + count_mthp_stat(folio_order(folio), MTHP_STAT_FILE_FALLBACK_CHARGE); > +#endif > } > goto unlock; > } > @@ -2168,6 +2177,9 @@ static int shmem_get_folio_gfp(struct inode *inode, pgoff_t index, > if (!IS_ERR(folio)) { > if (folio_test_pmd_mappable(folio)) > count_vm_event(THP_FILE_ALLOC); > +#ifdef CONFIG_TRANSPARENT_HUGEPAGE > + count_mthp_stat(folio_order(folio), MTHP_STAT_FILE_ALLOC); > +#endif > goto alloced; > } > if (PTR_ERR(folio) == -EEXIST) > -- > 2.39.3 >
On 2024/6/12 16:04, Lance Yang wrote: > Hi Baolin, > > On Tue, Jun 11, 2024 at 6:11 PM Baolin Wang > <baolin.wang@linux.alibaba.com> wrote: >> >> Add mTHP counters for anonymous shmem. >> >> Signed-off-by: Baolin Wang <baolin.wang@linux.alibaba.com> >> --- >> include/linux/huge_mm.h | 3 +++ >> mm/huge_memory.c | 6 ++++++ >> mm/shmem.c | 18 +++++++++++++++--- >> 3 files changed, 24 insertions(+), 3 deletions(-) >> >> diff --git a/include/linux/huge_mm.h b/include/linux/huge_mm.h >> index 909cfc67521d..212cca384d7e 100644 >> --- a/include/linux/huge_mm.h >> +++ b/include/linux/huge_mm.h >> @@ -281,6 +281,9 @@ enum mthp_stat_item { >> MTHP_STAT_ANON_FAULT_FALLBACK_CHARGE, >> MTHP_STAT_SWPOUT, >> MTHP_STAT_SWPOUT_FALLBACK, >> + MTHP_STAT_FILE_ALLOC, >> + MTHP_STAT_FILE_FALLBACK, >> + MTHP_STAT_FILE_FALLBACK_CHARGE, >> __MTHP_STAT_COUNT >> }; >> >> diff --git a/mm/huge_memory.c b/mm/huge_memory.c >> index 1360a1903b66..3fbcd77f5957 100644 >> --- a/mm/huge_memory.c >> +++ b/mm/huge_memory.c >> @@ -555,6 +555,9 @@ DEFINE_MTHP_STAT_ATTR(anon_fault_fallback, MTHP_STAT_ANON_FAULT_FALLBACK); >> DEFINE_MTHP_STAT_ATTR(anon_fault_fallback_charge, MTHP_STAT_ANON_FAULT_FALLBACK_CHARGE); >> DEFINE_MTHP_STAT_ATTR(swpout, MTHP_STAT_SWPOUT); >> DEFINE_MTHP_STAT_ATTR(swpout_fallback, MTHP_STAT_SWPOUT_FALLBACK); >> +DEFINE_MTHP_STAT_ATTR(file_alloc, MTHP_STAT_FILE_ALLOC); >> +DEFINE_MTHP_STAT_ATTR(file_fallback, MTHP_STAT_FILE_FALLBACK); >> +DEFINE_MTHP_STAT_ATTR(file_fallback_charge, MTHP_STAT_FILE_FALLBACK_CHARGE); >> >> static struct attribute *stats_attrs[] = { >> &anon_fault_alloc_attr.attr, >> @@ -562,6 +565,9 @@ static struct attribute *stats_attrs[] = { >> &anon_fault_fallback_charge_attr.attr, >> &swpout_attr.attr, >> &swpout_fallback_attr.attr, >> + &file_alloc_attr.attr, >> + &file_fallback_attr.attr, >> + &file_fallback_charge_attr.attr, >> NULL, >> }; >> >> diff --git a/mm/shmem.c b/mm/shmem.c >> index f5469c357be6..99bd3c34f0fb 100644 >> --- a/mm/shmem.c >> +++ b/mm/shmem.c >> @@ -1773,6 +1773,9 @@ static struct folio *shmem_alloc_and_add_folio(struct vm_fault *vmf, >> >> if (pages == HPAGE_PMD_NR) >> count_vm_event(THP_FILE_FALLBACK); >> +#ifdef CONFIG_TRANSPARENT_HUGEPAGE >> + count_mthp_stat(order, MTHP_STAT_FILE_FALLBACK); >> +#endif > > Using the conditional compilation directives here is a bit weird :) > Would there be any issues if we were to drop them? Will cause building errors if CONFIG_TRANSPARENT_HUGEPAGE is not enabled. > > Since THP_FILE_FALLBACK is working as expected, MTHP_STAT_FILE_FALLBACK > should work as well without the conditional compilation directives, IIUC. No, you should take a look at how count_mthp_stat() is defined :)
On 2024/6/11 18:11, Baolin Wang wrote: > Add mTHP counters for anonymous shmem. > > Signed-off-by: Baolin Wang <baolin.wang@linux.alibaba.com> > --- > include/linux/huge_mm.h | 3 +++ > mm/huge_memory.c | 6 ++++++ > mm/shmem.c | 18 +++++++++++++++--- > 3 files changed, 24 insertions(+), 3 deletions(-) > > diff --git a/include/linux/huge_mm.h b/include/linux/huge_mm.h > index 909cfc67521d..212cca384d7e 100644 > --- a/include/linux/huge_mm.h > +++ b/include/linux/huge_mm.h > @@ -281,6 +281,9 @@ enum mthp_stat_item { > MTHP_STAT_ANON_FAULT_FALLBACK_CHARGE, > MTHP_STAT_SWPOUT, > MTHP_STAT_SWPOUT_FALLBACK, > + MTHP_STAT_FILE_ALLOC, > + MTHP_STAT_FILE_FALLBACK, > + MTHP_STAT_FILE_FALLBACK_CHARGE, > __MTHP_STAT_COUNT > }; > > diff --git a/mm/huge_memory.c b/mm/huge_memory.c > index 1360a1903b66..3fbcd77f5957 100644 > --- a/mm/huge_memory.c > +++ b/mm/huge_memory.c > @@ -555,6 +555,9 @@ DEFINE_MTHP_STAT_ATTR(anon_fault_fallback, MTHP_STAT_ANON_FAULT_FALLBACK); > DEFINE_MTHP_STAT_ATTR(anon_fault_fallback_charge, MTHP_STAT_ANON_FAULT_FALLBACK_CHARGE); > DEFINE_MTHP_STAT_ATTR(swpout, MTHP_STAT_SWPOUT); > DEFINE_MTHP_STAT_ATTR(swpout_fallback, MTHP_STAT_SWPOUT_FALLBACK); > +DEFINE_MTHP_STAT_ATTR(file_alloc, MTHP_STAT_FILE_ALLOC); > +DEFINE_MTHP_STAT_ATTR(file_fallback, MTHP_STAT_FILE_FALLBACK); > +DEFINE_MTHP_STAT_ATTR(file_fallback_charge, MTHP_STAT_FILE_FALLBACK_CHARGE); > > static struct attribute *stats_attrs[] = { > &anon_fault_alloc_attr.attr, > @@ -562,6 +565,9 @@ static struct attribute *stats_attrs[] = { > &anon_fault_fallback_charge_attr.attr, > &swpout_attr.attr, > &swpout_fallback_attr.attr, > + &file_alloc_attr.attr, > + &file_fallback_attr.attr, > + &file_fallback_charge_attr.attr, > NULL, > }; > > diff --git a/mm/shmem.c b/mm/shmem.c > index f5469c357be6..99bd3c34f0fb 100644 > --- a/mm/shmem.c > +++ b/mm/shmem.c > @@ -1773,6 +1773,9 @@ static struct folio *shmem_alloc_and_add_folio(struct vm_fault *vmf, > > if (pages == HPAGE_PMD_NR) > count_vm_event(THP_FILE_FALLBACK); > +#ifdef CONFIG_TRANSPARENT_HUGEPAGE > + count_mthp_stat(order, MTHP_STAT_FILE_FALLBACK); > +#endif > order = next_order(&suitable_orders, order); > } > } else { > @@ -1792,9 +1795,15 @@ static struct folio *shmem_alloc_and_add_folio(struct vm_fault *vmf, > if (xa_find(&mapping->i_pages, &index, > index + pages - 1, XA_PRESENT)) { > error = -EEXIST; > - } else if (pages == HPAGE_PMD_NR) { > - count_vm_event(THP_FILE_FALLBACK); > - count_vm_event(THP_FILE_FALLBACK_CHARGE); > + } else if (pages > 1) { > + if (pages == HPAGE_PMD_NR) { > + count_vm_event(THP_FILE_FALLBACK); > + count_vm_event(THP_FILE_FALLBACK_CHARGE); > + } > +#ifdef CONFIG_TRANSPARENT_HUGEPAGE > + count_mthp_stat(folio_order(folio), MTHP_STAT_FILE_FALLBACK); > + count_mthp_stat(folio_order(folio), MTHP_STAT_FILE_FALLBACK_CHARGE); pages > 1, we have correct order, count_mthp_stat(order, MTHP_XXX) ? > +#endif > } > goto unlock; > } > @@ -2168,6 +2177,9 @@ static int shmem_get_folio_gfp(struct inode *inode, pgoff_t index, > if (!IS_ERR(folio)) { > if (folio_test_pmd_mappable(folio)) > count_vm_event(THP_FILE_ALLOC); > +#ifdef CONFIG_TRANSPARENT_HUGEPAGE > + count_mthp_stat(folio_order(folio), MTHP_STAT_FILE_ALLOC); > +#endif > goto alloced; > } > if (PTR_ERR(folio) == -EEXIST)
On Wed, Jun 12, 2024 at 5:28 PM Baolin Wang <baolin.wang@linux.alibaba.com> wrote: > > > > On 2024/6/12 16:04, Lance Yang wrote: > > Hi Baolin, > > > > On Tue, Jun 11, 2024 at 6:11 PM Baolin Wang > > <baolin.wang@linux.alibaba.com> wrote: > >> > >> Add mTHP counters for anonymous shmem. > >> > >> Signed-off-by: Baolin Wang <baolin.wang@linux.alibaba.com> > >> --- > >> include/linux/huge_mm.h | 3 +++ > >> mm/huge_memory.c | 6 ++++++ > >> mm/shmem.c | 18 +++++++++++++++--- > >> 3 files changed, 24 insertions(+), 3 deletions(-) > >> > >> diff --git a/include/linux/huge_mm.h b/include/linux/huge_mm.h > >> index 909cfc67521d..212cca384d7e 100644 > >> --- a/include/linux/huge_mm.h > >> +++ b/include/linux/huge_mm.h > >> @@ -281,6 +281,9 @@ enum mthp_stat_item { > >> MTHP_STAT_ANON_FAULT_FALLBACK_CHARGE, > >> MTHP_STAT_SWPOUT, > >> MTHP_STAT_SWPOUT_FALLBACK, > >> + MTHP_STAT_FILE_ALLOC, > >> + MTHP_STAT_FILE_FALLBACK, > >> + MTHP_STAT_FILE_FALLBACK_CHARGE, > >> __MTHP_STAT_COUNT > >> }; > >> > >> diff --git a/mm/huge_memory.c b/mm/huge_memory.c > >> index 1360a1903b66..3fbcd77f5957 100644 > >> --- a/mm/huge_memory.c > >> +++ b/mm/huge_memory.c > >> @@ -555,6 +555,9 @@ DEFINE_MTHP_STAT_ATTR(anon_fault_fallback, MTHP_STAT_ANON_FAULT_FALLBACK); > >> DEFINE_MTHP_STAT_ATTR(anon_fault_fallback_charge, MTHP_STAT_ANON_FAULT_FALLBACK_CHARGE); > >> DEFINE_MTHP_STAT_ATTR(swpout, MTHP_STAT_SWPOUT); > >> DEFINE_MTHP_STAT_ATTR(swpout_fallback, MTHP_STAT_SWPOUT_FALLBACK); > >> +DEFINE_MTHP_STAT_ATTR(file_alloc, MTHP_STAT_FILE_ALLOC); > >> +DEFINE_MTHP_STAT_ATTR(file_fallback, MTHP_STAT_FILE_FALLBACK); > >> +DEFINE_MTHP_STAT_ATTR(file_fallback_charge, MTHP_STAT_FILE_FALLBACK_CHARGE); > >> > >> static struct attribute *stats_attrs[] = { > >> &anon_fault_alloc_attr.attr, > >> @@ -562,6 +565,9 @@ static struct attribute *stats_attrs[] = { > >> &anon_fault_fallback_charge_attr.attr, > >> &swpout_attr.attr, > >> &swpout_fallback_attr.attr, > >> + &file_alloc_attr.attr, > >> + &file_fallback_attr.attr, > >> + &file_fallback_charge_attr.attr, > >> NULL, > >> }; > >> > >> diff --git a/mm/shmem.c b/mm/shmem.c > >> index f5469c357be6..99bd3c34f0fb 100644 > >> --- a/mm/shmem.c > >> +++ b/mm/shmem.c > >> @@ -1773,6 +1773,9 @@ static struct folio *shmem_alloc_and_add_folio(struct vm_fault *vmf, > >> > >> if (pages == HPAGE_PMD_NR) > >> count_vm_event(THP_FILE_FALLBACK); > >> +#ifdef CONFIG_TRANSPARENT_HUGEPAGE > >> + count_mthp_stat(order, MTHP_STAT_FILE_FALLBACK); > >> +#endif > > > > Using the conditional compilation directives here is a bit weird :) > > Would there be any issues if we were to drop them? > > Will cause building errors if CONFIG_TRANSPARENT_HUGEPAGE is not enabled. Sorry, I got it wrong :p > > > > > Since THP_FILE_FALLBACK is working as expected, MTHP_STAT_FILE_FALLBACK > > should work as well without the conditional compilation directives, IIUC. > > No, you should take a look at how count_mthp_stat() is defined :) You're correct. count_mthp_stat() does cause a compilation error without them when CONFIG_TRANSPARENT_HUGEPAGE is not defined. Thanks, Lance
On Tue, Jun 11, 2024 at 6:11 PM Baolin Wang <baolin.wang@linux.alibaba.com> wrote: > > Add mTHP counters for anonymous shmem. > > Signed-off-by: Baolin Wang <baolin.wang@linux.alibaba.com> LGTM. Feel free to add: Reviewed-by: Lance Yang <ioworker0@gmail.com> Just a friendly reminder: We also need to update the documentation for the counters in transhuge.rst. Thanks, Lance > --- > include/linux/huge_mm.h | 3 +++ > mm/huge_memory.c | 6 ++++++ > mm/shmem.c | 18 +++++++++++++++--- > 3 files changed, 24 insertions(+), 3 deletions(-) > > diff --git a/include/linux/huge_mm.h b/include/linux/huge_mm.h > index 909cfc67521d..212cca384d7e 100644 > --- a/include/linux/huge_mm.h > +++ b/include/linux/huge_mm.h > @@ -281,6 +281,9 @@ enum mthp_stat_item { > MTHP_STAT_ANON_FAULT_FALLBACK_CHARGE, > MTHP_STAT_SWPOUT, > MTHP_STAT_SWPOUT_FALLBACK, > + MTHP_STAT_FILE_ALLOC, > + MTHP_STAT_FILE_FALLBACK, > + MTHP_STAT_FILE_FALLBACK_CHARGE, > __MTHP_STAT_COUNT > }; > > diff --git a/mm/huge_memory.c b/mm/huge_memory.c > index 1360a1903b66..3fbcd77f5957 100644 > --- a/mm/huge_memory.c > +++ b/mm/huge_memory.c > @@ -555,6 +555,9 @@ DEFINE_MTHP_STAT_ATTR(anon_fault_fallback, MTHP_STAT_ANON_FAULT_FALLBACK); > DEFINE_MTHP_STAT_ATTR(anon_fault_fallback_charge, MTHP_STAT_ANON_FAULT_FALLBACK_CHARGE); > DEFINE_MTHP_STAT_ATTR(swpout, MTHP_STAT_SWPOUT); > DEFINE_MTHP_STAT_ATTR(swpout_fallback, MTHP_STAT_SWPOUT_FALLBACK); > +DEFINE_MTHP_STAT_ATTR(file_alloc, MTHP_STAT_FILE_ALLOC); > +DEFINE_MTHP_STAT_ATTR(file_fallback, MTHP_STAT_FILE_FALLBACK); > +DEFINE_MTHP_STAT_ATTR(file_fallback_charge, MTHP_STAT_FILE_FALLBACK_CHARGE); > > static struct attribute *stats_attrs[] = { > &anon_fault_alloc_attr.attr, > @@ -562,6 +565,9 @@ static struct attribute *stats_attrs[] = { > &anon_fault_fallback_charge_attr.attr, > &swpout_attr.attr, > &swpout_fallback_attr.attr, > + &file_alloc_attr.attr, > + &file_fallback_attr.attr, > + &file_fallback_charge_attr.attr, > NULL, > }; > > diff --git a/mm/shmem.c b/mm/shmem.c > index f5469c357be6..99bd3c34f0fb 100644 > --- a/mm/shmem.c > +++ b/mm/shmem.c > @@ -1773,6 +1773,9 @@ static struct folio *shmem_alloc_and_add_folio(struct vm_fault *vmf, > > if (pages == HPAGE_PMD_NR) > count_vm_event(THP_FILE_FALLBACK); > +#ifdef CONFIG_TRANSPARENT_HUGEPAGE > + count_mthp_stat(order, MTHP_STAT_FILE_FALLBACK); > +#endif > order = next_order(&suitable_orders, order); > } > } else { > @@ -1792,9 +1795,15 @@ static struct folio *shmem_alloc_and_add_folio(struct vm_fault *vmf, > if (xa_find(&mapping->i_pages, &index, > index + pages - 1, XA_PRESENT)) { > error = -EEXIST; > - } else if (pages == HPAGE_PMD_NR) { > - count_vm_event(THP_FILE_FALLBACK); > - count_vm_event(THP_FILE_FALLBACK_CHARGE); > + } else if (pages > 1) { > + if (pages == HPAGE_PMD_NR) { > + count_vm_event(THP_FILE_FALLBACK); > + count_vm_event(THP_FILE_FALLBACK_CHARGE); > + } > +#ifdef CONFIG_TRANSPARENT_HUGEPAGE > + count_mthp_stat(folio_order(folio), MTHP_STAT_FILE_FALLBACK); > + count_mthp_stat(folio_order(folio), MTHP_STAT_FILE_FALLBACK_CHARGE); > +#endif > } > goto unlock; > } > @@ -2168,6 +2177,9 @@ static int shmem_get_folio_gfp(struct inode *inode, pgoff_t index, > if (!IS_ERR(folio)) { > if (folio_test_pmd_mappable(folio)) > count_vm_event(THP_FILE_ALLOC); > +#ifdef CONFIG_TRANSPARENT_HUGEPAGE > + count_mthp_stat(folio_order(folio), MTHP_STAT_FILE_ALLOC); > +#endif > goto alloced; > } > if (PTR_ERR(folio) == -EEXIST) > -- > 2.39.3 >
On 2024/6/12 21:46, Kefeng Wang wrote: > > > On 2024/6/11 18:11, Baolin Wang wrote: >> Add mTHP counters for anonymous shmem. >> >> Signed-off-by: Baolin Wang <baolin.wang@linux.alibaba.com> >> --- >> include/linux/huge_mm.h | 3 +++ >> mm/huge_memory.c | 6 ++++++ >> mm/shmem.c | 18 +++++++++++++++--- >> 3 files changed, 24 insertions(+), 3 deletions(-) >> >> diff --git a/include/linux/huge_mm.h b/include/linux/huge_mm.h >> index 909cfc67521d..212cca384d7e 100644 >> --- a/include/linux/huge_mm.h >> +++ b/include/linux/huge_mm.h >> @@ -281,6 +281,9 @@ enum mthp_stat_item { >> MTHP_STAT_ANON_FAULT_FALLBACK_CHARGE, >> MTHP_STAT_SWPOUT, >> MTHP_STAT_SWPOUT_FALLBACK, >> + MTHP_STAT_FILE_ALLOC, >> + MTHP_STAT_FILE_FALLBACK, >> + MTHP_STAT_FILE_FALLBACK_CHARGE, >> __MTHP_STAT_COUNT >> }; >> diff --git a/mm/huge_memory.c b/mm/huge_memory.c >> index 1360a1903b66..3fbcd77f5957 100644 >> --- a/mm/huge_memory.c >> +++ b/mm/huge_memory.c >> @@ -555,6 +555,9 @@ DEFINE_MTHP_STAT_ATTR(anon_fault_fallback, >> MTHP_STAT_ANON_FAULT_FALLBACK); >> DEFINE_MTHP_STAT_ATTR(anon_fault_fallback_charge, >> MTHP_STAT_ANON_FAULT_FALLBACK_CHARGE); >> DEFINE_MTHP_STAT_ATTR(swpout, MTHP_STAT_SWPOUT); >> DEFINE_MTHP_STAT_ATTR(swpout_fallback, MTHP_STAT_SWPOUT_FALLBACK); >> +DEFINE_MTHP_STAT_ATTR(file_alloc, MTHP_STAT_FILE_ALLOC); >> +DEFINE_MTHP_STAT_ATTR(file_fallback, MTHP_STAT_FILE_FALLBACK); >> +DEFINE_MTHP_STAT_ATTR(file_fallback_charge, >> MTHP_STAT_FILE_FALLBACK_CHARGE); >> static struct attribute *stats_attrs[] = { >> &anon_fault_alloc_attr.attr, >> @@ -562,6 +565,9 @@ static struct attribute *stats_attrs[] = { >> &anon_fault_fallback_charge_attr.attr, >> &swpout_attr.attr, >> &swpout_fallback_attr.attr, >> + &file_alloc_attr.attr, >> + &file_fallback_attr.attr, >> + &file_fallback_charge_attr.attr, >> NULL, >> }; >> diff --git a/mm/shmem.c b/mm/shmem.c >> index f5469c357be6..99bd3c34f0fb 100644 >> --- a/mm/shmem.c >> +++ b/mm/shmem.c >> @@ -1773,6 +1773,9 @@ static struct folio >> *shmem_alloc_and_add_folio(struct vm_fault *vmf, >> if (pages == HPAGE_PMD_NR) >> count_vm_event(THP_FILE_FALLBACK); >> +#ifdef CONFIG_TRANSPARENT_HUGEPAGE >> + count_mthp_stat(order, MTHP_STAT_FILE_FALLBACK); >> +#endif >> order = next_order(&suitable_orders, order); >> } >> } else { >> @@ -1792,9 +1795,15 @@ static struct folio >> *shmem_alloc_and_add_folio(struct vm_fault *vmf, >> if (xa_find(&mapping->i_pages, &index, >> index + pages - 1, XA_PRESENT)) { >> error = -EEXIST; >> - } else if (pages == HPAGE_PMD_NR) { >> - count_vm_event(THP_FILE_FALLBACK); >> - count_vm_event(THP_FILE_FALLBACK_CHARGE); >> + } else if (pages > 1) { >> + if (pages == HPAGE_PMD_NR) { >> + count_vm_event(THP_FILE_FALLBACK); >> + count_vm_event(THP_FILE_FALLBACK_CHARGE); >> + } >> +#ifdef CONFIG_TRANSPARENT_HUGEPAGE >> + count_mthp_stat(folio_order(folio), >> MTHP_STAT_FILE_FALLBACK); >> + count_mthp_stat(folio_order(folio), >> MTHP_STAT_FILE_FALLBACK_CHARGE); > > pages > 1, we have correct order, count_mthp_stat(order, MTHP_XXX) ? Yes, I can use 'order' instead if a new version is needed.
On 2024/6/12 22:18, Lance Yang wrote: > On Tue, Jun 11, 2024 at 6:11 PM Baolin Wang > <baolin.wang@linux.alibaba.com> wrote: >> >> Add mTHP counters for anonymous shmem. >> >> Signed-off-by: Baolin Wang <baolin.wang@linux.alibaba.com> > > LGTM. Feel free to add: > Reviewed-by: Lance Yang <ioworker0@gmail.com> Thanks. > > Just a friendly reminder: We also need to update the documentation > for the counters in transhuge.rst. Indeed. Andrew, could you help to fold following changes into this patch? Thanks. diff --git a/Documentation/admin-guide/mm/transhuge.rst b/Documentation/admin-guide/mm/transhuge.rst index e7232b46fe14..8f6ffbfc4b16 100644 --- a/Documentation/admin-guide/mm/transhuge.rst +++ b/Documentation/admin-guide/mm/transhuge.rst @@ -501,6 +501,19 @@ swpout_fallback Usually because failed to allocate some continuous swap space for the huge page. +file_alloc + is incremented every time a file huge page is successfully + allocated. + +file_fallback + is incremented if a file huge page is attempted to be allocated + but fails and instead falls back to using small pages. + +file_fallback_charge + is incremented if a file huge page cannot be charged and instead + falls back to using small pages even though the allocation was + successful. + As the system ages, allocating huge pages may be expensive as the system uses memory compaction to copy data around memory to free a huge page for use. There are some counters in ``/proc/vmstat`` to help
diff --git a/include/linux/huge_mm.h b/include/linux/huge_mm.h index 909cfc67521d..212cca384d7e 100644 --- a/include/linux/huge_mm.h +++ b/include/linux/huge_mm.h @@ -281,6 +281,9 @@ enum mthp_stat_item { MTHP_STAT_ANON_FAULT_FALLBACK_CHARGE, MTHP_STAT_SWPOUT, MTHP_STAT_SWPOUT_FALLBACK, + MTHP_STAT_FILE_ALLOC, + MTHP_STAT_FILE_FALLBACK, + MTHP_STAT_FILE_FALLBACK_CHARGE, __MTHP_STAT_COUNT }; diff --git a/mm/huge_memory.c b/mm/huge_memory.c index 1360a1903b66..3fbcd77f5957 100644 --- a/mm/huge_memory.c +++ b/mm/huge_memory.c @@ -555,6 +555,9 @@ DEFINE_MTHP_STAT_ATTR(anon_fault_fallback, MTHP_STAT_ANON_FAULT_FALLBACK); DEFINE_MTHP_STAT_ATTR(anon_fault_fallback_charge, MTHP_STAT_ANON_FAULT_FALLBACK_CHARGE); DEFINE_MTHP_STAT_ATTR(swpout, MTHP_STAT_SWPOUT); DEFINE_MTHP_STAT_ATTR(swpout_fallback, MTHP_STAT_SWPOUT_FALLBACK); +DEFINE_MTHP_STAT_ATTR(file_alloc, MTHP_STAT_FILE_ALLOC); +DEFINE_MTHP_STAT_ATTR(file_fallback, MTHP_STAT_FILE_FALLBACK); +DEFINE_MTHP_STAT_ATTR(file_fallback_charge, MTHP_STAT_FILE_FALLBACK_CHARGE); static struct attribute *stats_attrs[] = { &anon_fault_alloc_attr.attr, @@ -562,6 +565,9 @@ static struct attribute *stats_attrs[] = { &anon_fault_fallback_charge_attr.attr, &swpout_attr.attr, &swpout_fallback_attr.attr, + &file_alloc_attr.attr, + &file_fallback_attr.attr, + &file_fallback_charge_attr.attr, NULL, }; diff --git a/mm/shmem.c b/mm/shmem.c index f5469c357be6..99bd3c34f0fb 100644 --- a/mm/shmem.c +++ b/mm/shmem.c @@ -1773,6 +1773,9 @@ static struct folio *shmem_alloc_and_add_folio(struct vm_fault *vmf, if (pages == HPAGE_PMD_NR) count_vm_event(THP_FILE_FALLBACK); +#ifdef CONFIG_TRANSPARENT_HUGEPAGE + count_mthp_stat(order, MTHP_STAT_FILE_FALLBACK); +#endif order = next_order(&suitable_orders, order); } } else { @@ -1792,9 +1795,15 @@ static struct folio *shmem_alloc_and_add_folio(struct vm_fault *vmf, if (xa_find(&mapping->i_pages, &index, index + pages - 1, XA_PRESENT)) { error = -EEXIST; - } else if (pages == HPAGE_PMD_NR) { - count_vm_event(THP_FILE_FALLBACK); - count_vm_event(THP_FILE_FALLBACK_CHARGE); + } else if (pages > 1) { + if (pages == HPAGE_PMD_NR) { + count_vm_event(THP_FILE_FALLBACK); + count_vm_event(THP_FILE_FALLBACK_CHARGE); + } +#ifdef CONFIG_TRANSPARENT_HUGEPAGE + count_mthp_stat(folio_order(folio), MTHP_STAT_FILE_FALLBACK); + count_mthp_stat(folio_order(folio), MTHP_STAT_FILE_FALLBACK_CHARGE); +#endif } goto unlock; } @@ -2168,6 +2177,9 @@ static int shmem_get_folio_gfp(struct inode *inode, pgoff_t index, if (!IS_ERR(folio)) { if (folio_test_pmd_mappable(folio)) count_vm_event(THP_FILE_ALLOC); +#ifdef CONFIG_TRANSPARENT_HUGEPAGE + count_mthp_stat(folio_order(folio), MTHP_STAT_FILE_ALLOC); +#endif goto alloced; } if (PTR_ERR(folio) == -EEXIST)
Add mTHP counters for anonymous shmem. Signed-off-by: Baolin Wang <baolin.wang@linux.alibaba.com> --- include/linux/huge_mm.h | 3 +++ mm/huge_memory.c | 6 ++++++ mm/shmem.c | 18 +++++++++++++++--- 3 files changed, 24 insertions(+), 3 deletions(-)