diff mbox series

[5/9] mm: memcontrol: convert NR_FILE_THPS account to pages

Message ID 20201205130224.81607-6-songmuchun@bytedance.com (mailing list archive)
State New, archived
Headers show
Series Convert all THP vmstat counters to pages | expand

Commit Message

Muchun Song Dec. 5, 2020, 1:02 p.m. UTC
Converrt NR_FILE_THPS account to pages.

Signed-off-by: Muchun Song <songmuchun@bytedance.com>
---
 drivers/base/node.c | 3 +--
 fs/proc/meminfo.c   | 2 +-
 mm/filemap.c        | 2 +-
 mm/huge_memory.c    | 3 ++-
 mm/khugepaged.c     | 2 +-
 mm/memcontrol.c     | 5 ++---
 6 files changed, 8 insertions(+), 9 deletions(-)

Comments

Greg KH Dec. 5, 2020, 2:10 p.m. UTC | #1
On Sat, Dec 05, 2020 at 09:02:20PM +0800, Muchun Song wrote:
> Converrt NR_FILE_THPS account to pages.
> 
> Signed-off-by: Muchun Song <songmuchun@bytedance.com>
> ---
>  drivers/base/node.c | 3 +--
>  fs/proc/meminfo.c   | 2 +-
>  mm/filemap.c        | 2 +-
>  mm/huge_memory.c    | 3 ++-
>  mm/khugepaged.c     | 2 +-
>  mm/memcontrol.c     | 5 ++---
>  6 files changed, 8 insertions(+), 9 deletions(-)
> 
> diff --git a/drivers/base/node.c b/drivers/base/node.c
> index 05c369e93e16..f6a9521bbcf8 100644
> --- a/drivers/base/node.c
> +++ b/drivers/base/node.c
> @@ -466,8 +466,7 @@ static ssize_t node_read_meminfo(struct device *dev,
>  				    HPAGE_PMD_NR),
>  			     nid, K(node_page_state(pgdat, NR_SHMEM_PMDMAPPED) *
>  				    HPAGE_PMD_NR),
> -			     nid, K(node_page_state(pgdat, NR_FILE_THPS) *
> -				    HPAGE_PMD_NR),
> +			     nid, K(node_page_state(pgdat, NR_FILE_THPS)),

Again, is this changing a user-visable value?
Muchun Song Dec. 5, 2020, 3:29 p.m. UTC | #2
On Sat, Dec 5, 2020 at 10:09 PM Greg KH <gregkh@linuxfoundation.org> wrote:
>
> On Sat, Dec 05, 2020 at 09:02:20PM +0800, Muchun Song wrote:
> > Converrt NR_FILE_THPS account to pages.
> >
> > Signed-off-by: Muchun Song <songmuchun@bytedance.com>
> > ---
> >  drivers/base/node.c | 3 +--
> >  fs/proc/meminfo.c   | 2 +-
> >  mm/filemap.c        | 2 +-
> >  mm/huge_memory.c    | 3 ++-
> >  mm/khugepaged.c     | 2 +-
> >  mm/memcontrol.c     | 5 ++---
> >  6 files changed, 8 insertions(+), 9 deletions(-)
> >
> > diff --git a/drivers/base/node.c b/drivers/base/node.c
> > index 05c369e93e16..f6a9521bbcf8 100644
> > --- a/drivers/base/node.c
> > +++ b/drivers/base/node.c
> > @@ -466,8 +466,7 @@ static ssize_t node_read_meminfo(struct device *dev,
> >                                   HPAGE_PMD_NR),
> >                            nid, K(node_page_state(pgdat, NR_SHMEM_PMDMAPPED) *
> >                                   HPAGE_PMD_NR),
> > -                          nid, K(node_page_state(pgdat, NR_FILE_THPS) *
> > -                                 HPAGE_PMD_NR),
> > +                          nid, K(node_page_state(pgdat, NR_FILE_THPS)),
>
> Again, is this changing a user-visable value?
>

Of course not.

In the previous, the NR_FILE_THPS account is like below:

    __mod_lruvec_page_state(page, NR_FILE_THPS, 1);

With this patch, it is:

    __mod_lruvec_page_state(page, NR_FILE_THPS, HPAGE_PMD_NR);

So the result is not changed from the view of user space.

Thanks.

--
Yours,
Muchun
Greg KH Dec. 5, 2020, 3:32 p.m. UTC | #3
On Sat, Dec 05, 2020 at 11:29:26PM +0800, Muchun Song wrote:
> On Sat, Dec 5, 2020 at 10:09 PM Greg KH <gregkh@linuxfoundation.org> wrote:
> >
> > On Sat, Dec 05, 2020 at 09:02:20PM +0800, Muchun Song wrote:
> > > Converrt NR_FILE_THPS account to pages.
> > >
> > > Signed-off-by: Muchun Song <songmuchun@bytedance.com>
> > > ---
> > >  drivers/base/node.c | 3 +--
> > >  fs/proc/meminfo.c   | 2 +-
> > >  mm/filemap.c        | 2 +-
> > >  mm/huge_memory.c    | 3 ++-
> > >  mm/khugepaged.c     | 2 +-
> > >  mm/memcontrol.c     | 5 ++---
> > >  6 files changed, 8 insertions(+), 9 deletions(-)
> > >
> > > diff --git a/drivers/base/node.c b/drivers/base/node.c
> > > index 05c369e93e16..f6a9521bbcf8 100644
> > > --- a/drivers/base/node.c
> > > +++ b/drivers/base/node.c
> > > @@ -466,8 +466,7 @@ static ssize_t node_read_meminfo(struct device *dev,
> > >                                   HPAGE_PMD_NR),
> > >                            nid, K(node_page_state(pgdat, NR_SHMEM_PMDMAPPED) *
> > >                                   HPAGE_PMD_NR),
> > > -                          nid, K(node_page_state(pgdat, NR_FILE_THPS) *
> > > -                                 HPAGE_PMD_NR),
> > > +                          nid, K(node_page_state(pgdat, NR_FILE_THPS)),
> >
> > Again, is this changing a user-visable value?
> >
> 
> Of course not.
> 
> In the previous, the NR_FILE_THPS account is like below:
> 
>     __mod_lruvec_page_state(page, NR_FILE_THPS, 1);
> 
> With this patch, it is:
> 
>     __mod_lruvec_page_state(page, NR_FILE_THPS, HPAGE_PMD_NR);
> 
> So the result is not changed from the view of user space.

So you "broke" it on the previous patch and "fixed" it on this one?  Why
not just do it all in one patch?

Confused,

greg k-h
Muchun Song Dec. 5, 2020, 3:39 p.m. UTC | #4
On Sat, Dec 5, 2020 at 11:32 PM Greg KH <gregkh@linuxfoundation.org> wrote:
>
> On Sat, Dec 05, 2020 at 11:29:26PM +0800, Muchun Song wrote:
> > On Sat, Dec 5, 2020 at 10:09 PM Greg KH <gregkh@linuxfoundation.org> wrote:
> > >
> > > On Sat, Dec 05, 2020 at 09:02:20PM +0800, Muchun Song wrote:
> > > > Converrt NR_FILE_THPS account to pages.
> > > >
> > > > Signed-off-by: Muchun Song <songmuchun@bytedance.com>
> > > > ---
> > > >  drivers/base/node.c | 3 +--
> > > >  fs/proc/meminfo.c   | 2 +-
> > > >  mm/filemap.c        | 2 +-
> > > >  mm/huge_memory.c    | 3 ++-
> > > >  mm/khugepaged.c     | 2 +-
> > > >  mm/memcontrol.c     | 5 ++---
> > > >  6 files changed, 8 insertions(+), 9 deletions(-)
> > > >
> > > > diff --git a/drivers/base/node.c b/drivers/base/node.c
> > > > index 05c369e93e16..f6a9521bbcf8 100644
> > > > --- a/drivers/base/node.c
> > > > +++ b/drivers/base/node.c
> > > > @@ -466,8 +466,7 @@ static ssize_t node_read_meminfo(struct device *dev,
> > > >                                   HPAGE_PMD_NR),
> > > >                            nid, K(node_page_state(pgdat, NR_SHMEM_PMDMAPPED) *
> > > >                                   HPAGE_PMD_NR),
> > > > -                          nid, K(node_page_state(pgdat, NR_FILE_THPS) *
> > > > -                                 HPAGE_PMD_NR),
> > > > +                          nid, K(node_page_state(pgdat, NR_FILE_THPS)),
> > >
> > > Again, is this changing a user-visable value?
> > >
> >
> > Of course not.
> >
> > In the previous, the NR_FILE_THPS account is like below:
> >
> >     __mod_lruvec_page_state(page, NR_FILE_THPS, 1);
> >
> > With this patch, it is:
> >
> >     __mod_lruvec_page_state(page, NR_FILE_THPS, HPAGE_PMD_NR);
> >
> > So the result is not changed from the view of user space.
>
> So you "broke" it on the previous patch and "fixed" it on this one?  Why
> not just do it all in one patch?

Sorry for the confusion. I mean that the "previous" is without all of this patch
series. So this series is aimed to convert the unit of all different THP vmstat
counters from HPAGE_PMD_NR to pages. Thanks.

>
> Confused,
>
> greg k-h
Greg KH Dec. 5, 2020, 4:33 p.m. UTC | #5
On Sat, Dec 05, 2020 at 11:39:24PM +0800, Muchun Song wrote:
> On Sat, Dec 5, 2020 at 11:32 PM Greg KH <gregkh@linuxfoundation.org> wrote:
> >
> > On Sat, Dec 05, 2020 at 11:29:26PM +0800, Muchun Song wrote:
> > > On Sat, Dec 5, 2020 at 10:09 PM Greg KH <gregkh@linuxfoundation.org> wrote:
> > > >
> > > > On Sat, Dec 05, 2020 at 09:02:20PM +0800, Muchun Song wrote:
> > > > > Converrt NR_FILE_THPS account to pages.
> > > > >
> > > > > Signed-off-by: Muchun Song <songmuchun@bytedance.com>
> > > > > ---
> > > > >  drivers/base/node.c | 3 +--
> > > > >  fs/proc/meminfo.c   | 2 +-
> > > > >  mm/filemap.c        | 2 +-
> > > > >  mm/huge_memory.c    | 3 ++-
> > > > >  mm/khugepaged.c     | 2 +-
> > > > >  mm/memcontrol.c     | 5 ++---
> > > > >  6 files changed, 8 insertions(+), 9 deletions(-)
> > > > >
> > > > > diff --git a/drivers/base/node.c b/drivers/base/node.c
> > > > > index 05c369e93e16..f6a9521bbcf8 100644
> > > > > --- a/drivers/base/node.c
> > > > > +++ b/drivers/base/node.c
> > > > > @@ -466,8 +466,7 @@ static ssize_t node_read_meminfo(struct device *dev,
> > > > >                                   HPAGE_PMD_NR),
> > > > >                            nid, K(node_page_state(pgdat, NR_SHMEM_PMDMAPPED) *
> > > > >                                   HPAGE_PMD_NR),
> > > > > -                          nid, K(node_page_state(pgdat, NR_FILE_THPS) *
> > > > > -                                 HPAGE_PMD_NR),
> > > > > +                          nid, K(node_page_state(pgdat, NR_FILE_THPS)),
> > > >
> > > > Again, is this changing a user-visable value?
> > > >
> > >
> > > Of course not.
> > >
> > > In the previous, the NR_FILE_THPS account is like below:
> > >
> > >     __mod_lruvec_page_state(page, NR_FILE_THPS, 1);
> > >
> > > With this patch, it is:
> > >
> > >     __mod_lruvec_page_state(page, NR_FILE_THPS, HPAGE_PMD_NR);
> > >
> > > So the result is not changed from the view of user space.
> >
> > So you "broke" it on the previous patch and "fixed" it on this one?  Why
> > not just do it all in one patch?
> 
> Sorry for the confusion. I mean that the "previous" is without all of this patch
> series. So this series is aimed to convert the unit of all different THP vmstat
> counters from HPAGE_PMD_NR to pages. Thanks.

I'm sorry, I still do not understand.  It looks to me that you are
changing the number printed to userspace here.  Where is the
corrisponding change that changed the units for this function?  Is it in
this patch?  If so, sorry, I did not see that at all...

thanks,

greg k-h
Muchun Song Dec. 5, 2020, 4:52 p.m. UTC | #6
On Sun, Dec 6, 2020 at 12:32 AM Greg KH <gregkh@linuxfoundation.org> wrote:
>
> On Sat, Dec 05, 2020 at 11:39:24PM +0800, Muchun Song wrote:
> > On Sat, Dec 5, 2020 at 11:32 PM Greg KH <gregkh@linuxfoundation.org> wrote:
> > >
> > > On Sat, Dec 05, 2020 at 11:29:26PM +0800, Muchun Song wrote:
> > > > On Sat, Dec 5, 2020 at 10:09 PM Greg KH <gregkh@linuxfoundation.org> wrote:
> > > > >
> > > > > On Sat, Dec 05, 2020 at 09:02:20PM +0800, Muchun Song wrote:
> > > > > > Converrt NR_FILE_THPS account to pages.
> > > > > >
> > > > > > Signed-off-by: Muchun Song <songmuchun@bytedance.com>
> > > > > > ---
> > > > > >  drivers/base/node.c | 3 +--
> > > > > >  fs/proc/meminfo.c   | 2 +-
> > > > > >  mm/filemap.c        | 2 +-
> > > > > >  mm/huge_memory.c    | 3 ++-
> > > > > >  mm/khugepaged.c     | 2 +-
> > > > > >  mm/memcontrol.c     | 5 ++---
> > > > > >  6 files changed, 8 insertions(+), 9 deletions(-)
> > > > > >
> > > > > > diff --git a/drivers/base/node.c b/drivers/base/node.c
> > > > > > index 05c369e93e16..f6a9521bbcf8 100644
> > > > > > --- a/drivers/base/node.c
> > > > > > +++ b/drivers/base/node.c
> > > > > > @@ -466,8 +466,7 @@ static ssize_t node_read_meminfo(struct device *dev,
> > > > > >                                   HPAGE_PMD_NR),
> > > > > >                            nid, K(node_page_state(pgdat, NR_SHMEM_PMDMAPPED) *
> > > > > >                                   HPAGE_PMD_NR),
> > > > > > -                          nid, K(node_page_state(pgdat, NR_FILE_THPS) *
> > > > > > -                                 HPAGE_PMD_NR),
> > > > > > +                          nid, K(node_page_state(pgdat, NR_FILE_THPS)),
> > > > >
> > > > > Again, is this changing a user-visable value?
> > > > >
> > > >
> > > > Of course not.
> > > >
> > > > In the previous, the NR_FILE_THPS account is like below:
> > > >
> > > >     __mod_lruvec_page_state(page, NR_FILE_THPS, 1);
> > > >
> > > > With this patch, it is:
> > > >
> > > >     __mod_lruvec_page_state(page, NR_FILE_THPS, HPAGE_PMD_NR);
> > > >
> > > > So the result is not changed from the view of user space.
> > >
> > > So you "broke" it on the previous patch and "fixed" it on this one?  Why
> > > not just do it all in one patch?
> >
> > Sorry for the confusion. I mean that the "previous" is without all of this patch
> > series. So this series is aimed to convert the unit of all different THP vmstat
> > counters from HPAGE_PMD_NR to pages. Thanks.
>
> I'm sorry, I still do not understand.  It looks to me that you are
> changing the number printed to userspace here.  Where is the
> corrisponding change that changed the units for this function?  Is it in
> this patch?  If so, sorry, I did not see that at all...

Sorry, actually, this patch does not change the number printed to
userspace. It only changes the unit of the vmstat counter.

Without this patch, every counter of NR_FILE_THPS represents
NR_FILE_THPS pages. However, with this patch, every counter
represents only one page. And why do I want to do this? Can
reference to the cover letter. Thanks very much.

>
> thanks,
>
> greg k-h
Greg KH Dec. 5, 2020, 5:06 p.m. UTC | #7
On Sun, Dec 06, 2020 at 12:52:34AM +0800, Muchun Song wrote:
> On Sun, Dec 6, 2020 at 12:32 AM Greg KH <gregkh@linuxfoundation.org> wrote:
> >
> > On Sat, Dec 05, 2020 at 11:39:24PM +0800, Muchun Song wrote:
> > > On Sat, Dec 5, 2020 at 11:32 PM Greg KH <gregkh@linuxfoundation.org> wrote:
> > > >
> > > > On Sat, Dec 05, 2020 at 11:29:26PM +0800, Muchun Song wrote:
> > > > > On Sat, Dec 5, 2020 at 10:09 PM Greg KH <gregkh@linuxfoundation.org> wrote:
> > > > > >
> > > > > > On Sat, Dec 05, 2020 at 09:02:20PM +0800, Muchun Song wrote:
> > > > > > > Converrt NR_FILE_THPS account to pages.
> > > > > > >
> > > > > > > Signed-off-by: Muchun Song <songmuchun@bytedance.com>
> > > > > > > ---
> > > > > > >  drivers/base/node.c | 3 +--
> > > > > > >  fs/proc/meminfo.c   | 2 +-
> > > > > > >  mm/filemap.c        | 2 +-
> > > > > > >  mm/huge_memory.c    | 3 ++-
> > > > > > >  mm/khugepaged.c     | 2 +-
> > > > > > >  mm/memcontrol.c     | 5 ++---
> > > > > > >  6 files changed, 8 insertions(+), 9 deletions(-)
> > > > > > >
> > > > > > > diff --git a/drivers/base/node.c b/drivers/base/node.c
> > > > > > > index 05c369e93e16..f6a9521bbcf8 100644
> > > > > > > --- a/drivers/base/node.c
> > > > > > > +++ b/drivers/base/node.c
> > > > > > > @@ -466,8 +466,7 @@ static ssize_t node_read_meminfo(struct device *dev,
> > > > > > >                                   HPAGE_PMD_NR),
> > > > > > >                            nid, K(node_page_state(pgdat, NR_SHMEM_PMDMAPPED) *
> > > > > > >                                   HPAGE_PMD_NR),
> > > > > > > -                          nid, K(node_page_state(pgdat, NR_FILE_THPS) *
> > > > > > > -                                 HPAGE_PMD_NR),
> > > > > > > +                          nid, K(node_page_state(pgdat, NR_FILE_THPS)),
> > > > > >
> > > > > > Again, is this changing a user-visable value?
> > > > > >
> > > > >
> > > > > Of course not.
> > > > >
> > > > > In the previous, the NR_FILE_THPS account is like below:
> > > > >
> > > > >     __mod_lruvec_page_state(page, NR_FILE_THPS, 1);
> > > > >
> > > > > With this patch, it is:
> > > > >
> > > > >     __mod_lruvec_page_state(page, NR_FILE_THPS, HPAGE_PMD_NR);
> > > > >
> > > > > So the result is not changed from the view of user space.
> > > >
> > > > So you "broke" it on the previous patch and "fixed" it on this one?  Why
> > > > not just do it all in one patch?
> > >
> > > Sorry for the confusion. I mean that the "previous" is without all of this patch
> > > series. So this series is aimed to convert the unit of all different THP vmstat
> > > counters from HPAGE_PMD_NR to pages. Thanks.
> >
> > I'm sorry, I still do not understand.  It looks to me that you are
> > changing the number printed to userspace here.  Where is the
> > corrisponding change that changed the units for this function?  Is it in
> > this patch?  If so, sorry, I did not see that at all...
> 
> Sorry, actually, this patch does not change the number printed to
> userspace. It only changes the unit of the vmstat counter.
> 
> Without this patch, every counter of NR_FILE_THPS represents
> NR_FILE_THPS pages. However, with this patch, every counter
> represents only one page. And why do I want to do this? Can
> reference to the cover letter. Thanks very much.

Ah, I missed the change of the "ratio" value in the memory_stats[]
array.  That wasn't obvious at all, ugh.  Sorry for the noise,

greg k-h
diff mbox series

Patch

diff --git a/drivers/base/node.c b/drivers/base/node.c
index 05c369e93e16..f6a9521bbcf8 100644
--- a/drivers/base/node.c
+++ b/drivers/base/node.c
@@ -466,8 +466,7 @@  static ssize_t node_read_meminfo(struct device *dev,
 				    HPAGE_PMD_NR),
 			     nid, K(node_page_state(pgdat, NR_SHMEM_PMDMAPPED) *
 				    HPAGE_PMD_NR),
-			     nid, K(node_page_state(pgdat, NR_FILE_THPS) *
-				    HPAGE_PMD_NR),
+			     nid, K(node_page_state(pgdat, NR_FILE_THPS)),
 			     nid, K(node_page_state(pgdat, NR_FILE_PMDMAPPED) *
 				    HPAGE_PMD_NR)
 #endif
diff --git a/fs/proc/meminfo.c b/fs/proc/meminfo.c
index f447ac191d24..9b2cb770326e 100644
--- a/fs/proc/meminfo.c
+++ b/fs/proc/meminfo.c
@@ -135,7 +135,7 @@  static int meminfo_proc_show(struct seq_file *m, void *v)
 	show_val_kb(m, "ShmemPmdMapped: ",
 		    global_node_page_state(NR_SHMEM_PMDMAPPED) * HPAGE_PMD_NR);
 	show_val_kb(m, "FileHugePages:  ",
-		    global_node_page_state(NR_FILE_THPS) * HPAGE_PMD_NR);
+		    global_node_page_state(NR_FILE_THPS));
 	show_val_kb(m, "FilePmdMapped:  ",
 		    global_node_page_state(NR_FILE_PMDMAPPED) * HPAGE_PMD_NR);
 #endif
diff --git a/mm/filemap.c b/mm/filemap.c
index 28e7309c29c8..c4dcb1144883 100644
--- a/mm/filemap.c
+++ b/mm/filemap.c
@@ -206,7 +206,7 @@  static void unaccount_page_cache_page(struct address_space *mapping,
 		if (PageTransHuge(page))
 			__dec_lruvec_page_state(page, NR_SHMEM_THPS);
 	} else if (PageTransHuge(page)) {
-		__dec_lruvec_page_state(page, NR_FILE_THPS);
+		__mod_lruvec_page_state(page, NR_FILE_THPS, -HPAGE_PMD_NR);
 		filemap_nr_thps_dec(mapping);
 	}
 
diff --git a/mm/huge_memory.c b/mm/huge_memory.c
index 1a13e1dab3ec..37840bdeaad0 100644
--- a/mm/huge_memory.c
+++ b/mm/huge_memory.c
@@ -2748,7 +2748,8 @@  int split_huge_page_to_list(struct page *page, struct list_head *list)
 			if (PageSwapBacked(head))
 				__dec_lruvec_page_state(head, NR_SHMEM_THPS);
 			else
-				__dec_lruvec_page_state(head, NR_FILE_THPS);
+				__mod_lruvec_page_state(head, NR_FILE_THPS,
+							-HPAGE_PMD_NR);
 		}
 
 		__split_huge_page(page, list, end);
diff --git a/mm/khugepaged.c b/mm/khugepaged.c
index ad316d2e1fee..1e1ced2208d0 100644
--- a/mm/khugepaged.c
+++ b/mm/khugepaged.c
@@ -1859,7 +1859,7 @@  static void collapse_file(struct mm_struct *mm,
 	if (is_shmem)
 		__inc_lruvec_page_state(new_page, NR_SHMEM_THPS);
 	else {
-		__inc_lruvec_page_state(new_page, NR_FILE_THPS);
+		__mod_lruvec_page_state(new_page, NR_FILE_THPS, HPAGE_PMD_NR);
 		filemap_nr_thps_inc(mapping);
 	}
 
diff --git a/mm/memcontrol.c b/mm/memcontrol.c
index 39cb7f1b00d3..dce76dddac61 100644
--- a/mm/memcontrol.c
+++ b/mm/memcontrol.c
@@ -1514,7 +1514,7 @@  static struct memory_stat memory_stats[] = {
 	 * constant(e.g. powerpc).
 	 */
 	{ "anon_thp", PAGE_SIZE, NR_ANON_THPS },
-	{ "file_thp", 0, NR_FILE_THPS },
+	{ "file_thp", PAGE_SIZE, NR_FILE_THPS },
 	{ "shmem_thp", 0, NR_SHMEM_THPS },
 #endif
 	{ "inactive_anon", PAGE_SIZE, NR_INACTIVE_ANON },
@@ -1546,8 +1546,7 @@  static int __init memory_stats_init(void)
 
 	for (i = 0; i < ARRAY_SIZE(memory_stats); i++) {
 #ifdef CONFIG_TRANSPARENT_HUGEPAGE
-		if (memory_stats[i].idx == NR_FILE_THPS ||
-		    memory_stats[i].idx == NR_SHMEM_THPS)
+		if (memory_stats[i].idx == NR_SHMEM_THPS)
 			memory_stats[i].ratio = HPAGE_PMD_SIZE;
 #endif
 		VM_BUG_ON(!memory_stats[i].ratio);