All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v4 1/2] mm/sparse.c: Use kvmalloc/kvfree to alloc/free memmap for the classic sparse
@ 2020-03-16 10:21 Baoquan He
  2020-03-16 10:21 ` [PATCH v4 2/2] mm/sparse.c: allocate memmap preferring the given node Baoquan He
                   ` (3 more replies)
  0 siblings, 4 replies; 15+ messages in thread
From: Baoquan He @ 2020-03-16 10:21 UTC (permalink / raw)
  To: linux-kernel
  Cc: linux-mm, mhocko, akpm, david, willy, richard.weiyang, vbabka, bhe

This change makes populate_section_memmap()/depopulate_section_memmap
much simpler.

Suggested-by: Michal Hocko <mhocko@kernel.org>
Signed-off-by: Baoquan He <bhe@redhat.com>
Reviewed-by: David Hildenbrand <david@redhat.com>
Acked-by: Michal Hocko <mhocko@suse.com>
---
v3->v4:
  Split the old v3 into two patches, to carve out the using 'nid'
  as preferred node to allocate memmap into a separate patch. This
  is suggested by Michal, and the carving out is put in patch 2.

v2->v3:
  Remove __GFP_NOWARN and use array_size when calling kvmalloc_node()
  per Matthew's comments.
http://lkml.kernel.org/r/20200312141749.GL27711@MiWiFi-R3L-srv

 mm/sparse.c | 27 +++------------------------
 1 file changed, 3 insertions(+), 24 deletions(-)

diff --git a/mm/sparse.c b/mm/sparse.c
index e747a238a860..d01d09cc7d99 100644
--- a/mm/sparse.c
+++ b/mm/sparse.c
@@ -719,35 +719,14 @@ static int fill_subsection_map(unsigned long pfn, unsigned long nr_pages)
 struct page * __meminit populate_section_memmap(unsigned long pfn,
 		unsigned long nr_pages, int nid, struct vmem_altmap *altmap)
 {
-	struct page *page, *ret;
-	unsigned long memmap_size = sizeof(struct page) * PAGES_PER_SECTION;
-
-	page = alloc_pages(GFP_KERNEL|__GFP_NOWARN, get_order(memmap_size));
-	if (page)
-		goto got_map_page;
-
-	ret = vmalloc(memmap_size);
-	if (ret)
-		goto got_map_ptr;
-
-	return NULL;
-got_map_page:
-	ret = (struct page *)pfn_to_kaddr(page_to_pfn(page));
-got_map_ptr:
-
-	return ret;
+	return kvmalloc(array_size(sizeof(struct page),
+			PAGES_PER_SECTION), GFP_KERNEL);
 }
 
 static void depopulate_section_memmap(unsigned long pfn, unsigned long nr_pages,
 		struct vmem_altmap *altmap)
 {
-	struct page *memmap = pfn_to_page(pfn);
-
-	if (is_vmalloc_addr(memmap))
-		vfree(memmap);
-	else
-		free_pages((unsigned long)memmap,
-			   get_order(sizeof(struct page) * PAGES_PER_SECTION));
+	kvfree(pfn_to_page(pfn));
 }
 
 static void free_map_bootmem(struct page *memmap)
-- 
2.17.2


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

* [PATCH v4 2/2] mm/sparse.c: allocate memmap preferring the given node
  2020-03-16 10:21 [PATCH v4 1/2] mm/sparse.c: Use kvmalloc/kvfree to alloc/free memmap for the classic sparse Baoquan He
@ 2020-03-16 10:21 ` Baoquan He
  2020-03-16 12:56   ` [PATCH v5 " Baoquan He
  2020-03-16 11:00 ` [PATCH v4 1/2] mm/sparse.c: Use kvmalloc/kvfree to alloc/free memmap for the classic sparse David Hildenbrand
                   ` (2 subsequent siblings)
  3 siblings, 1 reply; 15+ messages in thread
From: Baoquan He @ 2020-03-16 10:21 UTC (permalink / raw)
  To: linux-kernel
  Cc: linux-mm, mhocko, akpm, david, willy, richard.weiyang, vbabka, bhe

When allocating memmap for hot added memory with the classic sparse, the
specified 'nid' is ignored in populate_section_memmap().

While in allocating memmap for the classic sparse during boot, the node
given by 'nid' is preferred. And VMEMMAP prefers the node of 'nid' in
both boot stage and memory hot adding. So seems no reason to not respect
the node of 'nid' for the classic sparse when hot adding memory.

Use kvmalloc_node instead to use the passed in 'nid'.

Signed-off-by: Baoquan He <bhe@redhat.com>
Acked-by: Michal Hocko <mhocko@suse.com>
---
 mm/sparse.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/mm/sparse.c b/mm/sparse.c
index d01d09cc7d99..513d765e8c72 100644
--- a/mm/sparse.c
+++ b/mm/sparse.c
@@ -719,8 +719,8 @@ static int fill_subsection_map(unsigned long pfn, unsigned long nr_pages)
 struct page * __meminit populate_section_memmap(unsigned long pfn,
 		unsigned long nr_pages, int nid, struct vmem_altmap *altmap)
 {
-	return kvmalloc(array_size(sizeof(struct page),
-			PAGES_PER_SECTION), GFP_KERNEL);
+	return kvmalloc_node(array_size(sizeof(struct page),
+			     PAGES_PER_SECTION), GFP_KERNEL, nid);
 }
 
 static void depopulate_section_memmap(unsigned long pfn, unsigned long nr_pages,
-- 
2.17.2


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

* Re: [PATCH v4 1/2] mm/sparse.c: Use kvmalloc/kvfree to alloc/free memmap for the classic sparse
  2020-03-16 10:21 [PATCH v4 1/2] mm/sparse.c: Use kvmalloc/kvfree to alloc/free memmap for the classic sparse Baoquan He
  2020-03-16 10:21 ` [PATCH v4 2/2] mm/sparse.c: allocate memmap preferring the given node Baoquan He
@ 2020-03-16 11:00 ` David Hildenbrand
  2020-03-16 12:40   ` Baoquan He
  2020-03-16 11:17   ` Pankaj Gupta
  2020-03-16 12:54 ` [PATCH v5 " Baoquan He
  3 siblings, 1 reply; 15+ messages in thread
From: David Hildenbrand @ 2020-03-16 11:00 UTC (permalink / raw)
  To: Baoquan He, linux-kernel
  Cc: linux-mm, mhocko, akpm, willy, richard.weiyang, vbabka

On 16.03.20 11:21, Baoquan He wrote:
> This change makes populate_section_memmap()/depopulate_section_memmap
> much simpler.
> 
> Suggested-by: Michal Hocko <mhocko@kernel.org>
> Signed-off-by: Baoquan He <bhe@redhat.com>
> Reviewed-by: David Hildenbrand <david@redhat.com>
> Acked-by: Michal Hocko <mhocko@suse.com>
> ---
> v3->v4:
>   Split the old v3 into two patches, to carve out the using 'nid'
>   as preferred node to allocate memmap into a separate patch. This
>   is suggested by Michal, and the carving out is put in patch 2.
> 
> v2->v3:
>   Remove __GFP_NOWARN and use array_size when calling kvmalloc_node()
>   per Matthew's comments.
> http://lkml.kernel.org/r/20200312141749.GL27711@MiWiFi-R3L-srv
> 
>  mm/sparse.c | 27 +++------------------------
>  1 file changed, 3 insertions(+), 24 deletions(-)
> 
> diff --git a/mm/sparse.c b/mm/sparse.c
> index e747a238a860..d01d09cc7d99 100644
> --- a/mm/sparse.c
> +++ b/mm/sparse.c
> @@ -719,35 +719,14 @@ static int fill_subsection_map(unsigned long pfn, unsigned long nr_pages)
>  struct page * __meminit populate_section_memmap(unsigned long pfn,
>  		unsigned long nr_pages, int nid, struct vmem_altmap *altmap)
>  {
> -	struct page *page, *ret;
> -	unsigned long memmap_size = sizeof(struct page) * PAGES_PER_SECTION;
> -
> -	page = alloc_pages(GFP_KERNEL|__GFP_NOWARN, get_order(memmap_size));
> -	if (page)
> -		goto got_map_page;
> -
> -	ret = vmalloc(memmap_size);
> -	if (ret)
> -		goto got_map_ptr;
> -
> -	return NULL;
> -got_map_page:
> -	ret = (struct page *)pfn_to_kaddr(page_to_pfn(page));
> -got_map_ptr:
> -
> -	return ret;
> +	return kvmalloc(array_size(sizeof(struct page),
> +			PAGES_PER_SECTION), GFP_KERNEL);

FWIW, this is what I meant:

        return kvmalloc(array_size(sizeof(struct page),
                                   PAGES_PER_SECTION), GFP_KERNEL);



-- 
Thanks,

David / dhildenb


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

* Re: [PATCH v4 1/2] mm/sparse.c: Use kvmalloc/kvfree to alloc/free memmap for the classic sparse
  2020-03-16 10:21 [PATCH v4 1/2] mm/sparse.c: Use kvmalloc/kvfree to alloc/free memmap for the classic sparse Baoquan He
@ 2020-03-16 11:17   ` Pankaj Gupta
  2020-03-16 11:00 ` [PATCH v4 1/2] mm/sparse.c: Use kvmalloc/kvfree to alloc/free memmap for the classic sparse David Hildenbrand
                     ` (2 subsequent siblings)
  3 siblings, 0 replies; 15+ messages in thread
From: Pankaj Gupta @ 2020-03-16 11:17 UTC (permalink / raw)
  To: Baoquan He
  Cc: linux-kernel, linux-mm, mhocko, Andrew Morton, David Hildenbrand,
	willy, richard.weiyang, Vlastimil Babka

> This change makes populate_section_memmap()/depopulate_section_memmap
> much simpler.
>
> Suggested-by: Michal Hocko <mhocko@kernel.org>
> Signed-off-by: Baoquan He <bhe@redhat.com>
> Reviewed-by: David Hildenbrand <david@redhat.com>
> Acked-by: Michal Hocko <mhocko@suse.com>
> ---
> v3->v4:
>   Split the old v3 into two patches, to carve out the using 'nid'
>   as preferred node to allocate memmap into a separate patch. This
>   is suggested by Michal, and the carving out is put in patch 2.
>
> v2->v3:
>   Remove __GFP_NOWARN and use array_size when calling kvmalloc_node()
>   per Matthew's comments.
> http://lkml.kernel.org/r/20200312141749.GL27711@MiWiFi-R3L-srv
>
>  mm/sparse.c | 27 +++------------------------
>  1 file changed, 3 insertions(+), 24 deletions(-)
>
> diff --git a/mm/sparse.c b/mm/sparse.c
> index e747a238a860..d01d09cc7d99 100644
> --- a/mm/sparse.c
> +++ b/mm/sparse.c
> @@ -719,35 +719,14 @@ static int fill_subsection_map(unsigned long pfn, unsigned long nr_pages)
>  struct page * __meminit populate_section_memmap(unsigned long pfn,
>                 unsigned long nr_pages, int nid, struct vmem_altmap *altmap)
>  {
> -       struct page *page, *ret;
> -       unsigned long memmap_size = sizeof(struct page) * PAGES_PER_SECTION;
> -
> -       page = alloc_pages(GFP_KERNEL|__GFP_NOWARN, get_order(memmap_size));
> -       if (page)
> -               goto got_map_page;
> -
> -       ret = vmalloc(memmap_size);
> -       if (ret)
> -               goto got_map_ptr;
> -
> -       return NULL;
> -got_map_page:
> -       ret = (struct page *)pfn_to_kaddr(page_to_pfn(page));
> -got_map_ptr:
> -
> -       return ret;
> +       return kvmalloc(array_size(sizeof(struct page),
> +                       PAGES_PER_SECTION), GFP_KERNEL);
>  }
>
>  static void depopulate_section_memmap(unsigned long pfn, unsigned long nr_pages,
>                 struct vmem_altmap *altmap)
>  {
> -       struct page *memmap = pfn_to_page(pfn);
> -
> -       if (is_vmalloc_addr(memmap))
> -               vfree(memmap);
> -       else
> -               free_pages((unsigned long)memmap,
> -                          get_order(sizeof(struct page) * PAGES_PER_SECTION));
> +       kvfree(pfn_to_page(pfn));
>  }
>
>  static void free_map_bootmem(struct page *memmap)
> --
> 2.17.2

With David's indentation suggestion:
Reviewed-by: Pankaj Gupta <pankaj.gupta.linux@gmail.com>

>
>

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

* Re: [PATCH v4 1/2] mm/sparse.c: Use kvmalloc/kvfree to alloc/free memmap for the classic sparse
@ 2020-03-16 11:17   ` Pankaj Gupta
  0 siblings, 0 replies; 15+ messages in thread
From: Pankaj Gupta @ 2020-03-16 11:17 UTC (permalink / raw)
  To: Baoquan He
  Cc: linux-kernel, linux-mm, mhocko, Andrew Morton, David Hildenbrand,
	willy, richard.weiyang, Vlastimil Babka

> This change makes populate_section_memmap()/depopulate_section_memmap
> much simpler.
>
> Suggested-by: Michal Hocko <mhocko@kernel.org>
> Signed-off-by: Baoquan He <bhe@redhat.com>
> Reviewed-by: David Hildenbrand <david@redhat.com>
> Acked-by: Michal Hocko <mhocko@suse.com>
> ---
> v3->v4:
>   Split the old v3 into two patches, to carve out the using 'nid'
>   as preferred node to allocate memmap into a separate patch. This
>   is suggested by Michal, and the carving out is put in patch 2.
>
> v2->v3:
>   Remove __GFP_NOWARN and use array_size when calling kvmalloc_node()
>   per Matthew's comments.
> http://lkml.kernel.org/r/20200312141749.GL27711@MiWiFi-R3L-srv
>
>  mm/sparse.c | 27 +++------------------------
>  1 file changed, 3 insertions(+), 24 deletions(-)
>
> diff --git a/mm/sparse.c b/mm/sparse.c
> index e747a238a860..d01d09cc7d99 100644
> --- a/mm/sparse.c
> +++ b/mm/sparse.c
> @@ -719,35 +719,14 @@ static int fill_subsection_map(unsigned long pfn, unsigned long nr_pages)
>  struct page * __meminit populate_section_memmap(unsigned long pfn,
>                 unsigned long nr_pages, int nid, struct vmem_altmap *altmap)
>  {
> -       struct page *page, *ret;
> -       unsigned long memmap_size = sizeof(struct page) * PAGES_PER_SECTION;
> -
> -       page = alloc_pages(GFP_KERNEL|__GFP_NOWARN, get_order(memmap_size));
> -       if (page)
> -               goto got_map_page;
> -
> -       ret = vmalloc(memmap_size);
> -       if (ret)
> -               goto got_map_ptr;
> -
> -       return NULL;
> -got_map_page:
> -       ret = (struct page *)pfn_to_kaddr(page_to_pfn(page));
> -got_map_ptr:
> -
> -       return ret;
> +       return kvmalloc(array_size(sizeof(struct page),
> +                       PAGES_PER_SECTION), GFP_KERNEL);
>  }
>
>  static void depopulate_section_memmap(unsigned long pfn, unsigned long nr_pages,
>                 struct vmem_altmap *altmap)
>  {
> -       struct page *memmap = pfn_to_page(pfn);
> -
> -       if (is_vmalloc_addr(memmap))
> -               vfree(memmap);
> -       else
> -               free_pages((unsigned long)memmap,
> -                          get_order(sizeof(struct page) * PAGES_PER_SECTION));
> +       kvfree(pfn_to_page(pfn));
>  }
>
>  static void free_map_bootmem(struct page *memmap)
> --
> 2.17.2

With David's indentation suggestion:
Reviewed-by: Pankaj Gupta <pankaj.gupta.linux@gmail.com>

>
>


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

* Re: [PATCH v4 1/2] mm/sparse.c: Use kvmalloc/kvfree to alloc/free memmap for the classic sparse
  2020-03-16 11:17   ` Pankaj Gupta
  (?)
@ 2020-03-16 12:18   ` Matthew Wilcox
  -1 siblings, 0 replies; 15+ messages in thread
From: Matthew Wilcox @ 2020-03-16 12:18 UTC (permalink / raw)
  To: Pankaj Gupta
  Cc: Baoquan He, linux-kernel, linux-mm, mhocko, Andrew Morton,
	David Hildenbrand, richard.weiyang, Vlastimil Babka

On Mon, Mar 16, 2020 at 12:17:49PM +0100, Pankaj Gupta wrote:
> > This change makes populate_section_memmap()/depopulate_section_memmap
> > much simpler.
> >
> > Suggested-by: Michal Hocko <mhocko@kernel.org>
> > Signed-off-by: Baoquan He <bhe@redhat.com>
> > Reviewed-by: David Hildenbrand <david@redhat.com>
> > Acked-by: Michal Hocko <mhocko@suse.com>

> With David's indentation suggestion:
> Reviewed-by: Pankaj Gupta <pankaj.gupta.linux@gmail.com>

Reviewed-by: Matthew Wilcox (Oracle) <willy@infradead.org>
(for both patches)

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

* Re: [PATCH v4 1/2] mm/sparse.c: Use kvmalloc/kvfree to alloc/free memmap for the classic sparse
  2020-03-16 11:00 ` [PATCH v4 1/2] mm/sparse.c: Use kvmalloc/kvfree to alloc/free memmap for the classic sparse David Hildenbrand
@ 2020-03-16 12:40   ` Baoquan He
  0 siblings, 0 replies; 15+ messages in thread
From: Baoquan He @ 2020-03-16 12:40 UTC (permalink / raw)
  To: David Hildenbrand
  Cc: linux-kernel, linux-mm, mhocko, akpm, willy, richard.weiyang, vbabka

On 03/16/20 at 12:00pm, David Hildenbrand wrote:
> On 16.03.20 11:21, Baoquan He wrote:
> > This change makes populate_section_memmap()/depopulate_section_memmap
> > much simpler.
> > 
> > Suggested-by: Michal Hocko <mhocko@kernel.org>
> > Signed-off-by: Baoquan He <bhe@redhat.com>
> > Reviewed-by: David Hildenbrand <david@redhat.com>
> > Acked-by: Michal Hocko <mhocko@suse.com>
> > ---
> > v3->v4:
> >   Split the old v3 into two patches, to carve out the using 'nid'
> >   as preferred node to allocate memmap into a separate patch. This
> >   is suggested by Michal, and the carving out is put in patch 2.
> > 
> > v2->v3:
> >   Remove __GFP_NOWARN and use array_size when calling kvmalloc_node()
> >   per Matthew's comments.
> > http://lkml.kernel.org/r/20200312141749.GL27711@MiWiFi-R3L-srv
> > 
> >  mm/sparse.c | 27 +++------------------------
> >  1 file changed, 3 insertions(+), 24 deletions(-)
> > 
> > diff --git a/mm/sparse.c b/mm/sparse.c
> > index e747a238a860..d01d09cc7d99 100644
> > --- a/mm/sparse.c
> > +++ b/mm/sparse.c
> > @@ -719,35 +719,14 @@ static int fill_subsection_map(unsigned long pfn, unsigned long nr_pages)
> >  struct page * __meminit populate_section_memmap(unsigned long pfn,
> >  		unsigned long nr_pages, int nid, struct vmem_altmap *altmap)
> >  {
> > -	struct page *page, *ret;
> > -	unsigned long memmap_size = sizeof(struct page) * PAGES_PER_SECTION;
> > -
> > -	page = alloc_pages(GFP_KERNEL|__GFP_NOWARN, get_order(memmap_size));
> > -	if (page)
> > -		goto got_map_page;
> > -
> > -	ret = vmalloc(memmap_size);
> > -	if (ret)
> > -		goto got_map_ptr;
> > -
> > -	return NULL;
> > -got_map_page:
> > -	ret = (struct page *)pfn_to_kaddr(page_to_pfn(page));
> > -got_map_ptr:
> > -
> > -	return ret;
> > +	return kvmalloc(array_size(sizeof(struct page),
> > +			PAGES_PER_SECTION), GFP_KERNEL);
> 
> FWIW, this is what I meant:
> 
>         return kvmalloc(array_size(sizeof(struct page),
>                                    PAGES_PER_SECTION), GFP_KERNEL);
Since there's another parameter, I didn't indent it with sizeof. But
Pankaj and Matthew have added other two votes on this, I will change it,
thanks.


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

* [PATCH v5 1/2] mm/sparse.c: Use kvmalloc/kvfree to alloc/free memmap for the classic sparse
  2020-03-16 10:21 [PATCH v4 1/2] mm/sparse.c: Use kvmalloc/kvfree to alloc/free memmap for the classic sparse Baoquan He
                   ` (2 preceding siblings ...)
  2020-03-16 11:17   ` Pankaj Gupta
@ 2020-03-16 12:54 ` Baoquan He
  2020-03-16 22:16   ` Wei Yang
  3 siblings, 1 reply; 15+ messages in thread
From: Baoquan He @ 2020-03-16 12:54 UTC (permalink / raw)
  To: linux-kernel
  Cc: linux-mm, mhocko, akpm, david, willy, richard.weiyang, vbabka

This change makes populate_section_memmap()/depopulate_section_memmap
much simpler.

Suggested-by: Michal Hocko <mhocko@kernel.org>
Signed-off-by: Baoquan He <bhe@redhat.com>
Reviewed-by: David Hildenbrand <david@redhat.com>
Acked-by: Michal Hocko <mhocko@suse.com>
Reviewed-by: Pankaj Gupta <pankaj.gupta.linux@gmail.com>
Reviewed-by: Matthew Wilcox (Oracle) <willy@infradead.org>
---
 mm/sparse.c | 27 +++------------------------
 1 file changed, 3 insertions(+), 24 deletions(-)

diff --git a/mm/sparse.c b/mm/sparse.c
index e747a238a860..3fa407d7f70a 100644
--- a/mm/sparse.c
+++ b/mm/sparse.c
@@ -719,35 +719,14 @@ static int fill_subsection_map(unsigned long pfn, unsigned long nr_pages)
 struct page * __meminit populate_section_memmap(unsigned long pfn,
 		unsigned long nr_pages, int nid, struct vmem_altmap *altmap)
 {
-	struct page *page, *ret;
-	unsigned long memmap_size = sizeof(struct page) * PAGES_PER_SECTION;
-
-	page = alloc_pages(GFP_KERNEL|__GFP_NOWARN, get_order(memmap_size));
-	if (page)
-		goto got_map_page;
-
-	ret = vmalloc(memmap_size);
-	if (ret)
-		goto got_map_ptr;
-
-	return NULL;
-got_map_page:
-	ret = (struct page *)pfn_to_kaddr(page_to_pfn(page));
-got_map_ptr:
-
-	return ret;
+	return kvmalloc(array_size(sizeof(struct page),
+				   PAGES_PER_SECTION), GFP_KERNEL);
 }
 
 static void depopulate_section_memmap(unsigned long pfn, unsigned long nr_pages,
 		struct vmem_altmap *altmap)
 {
-	struct page *memmap = pfn_to_page(pfn);
-
-	if (is_vmalloc_addr(memmap))
-		vfree(memmap);
-	else
-		free_pages((unsigned long)memmap,
-			   get_order(sizeof(struct page) * PAGES_PER_SECTION));
+	kvfree(pfn_to_page(pfn));
 }
 
 static void free_map_bootmem(struct page *memmap)
-- 
2.17.2


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

* [PATCH v5 2/2] mm/sparse.c: allocate memmap preferring the given node
  2020-03-16 10:21 ` [PATCH v4 2/2] mm/sparse.c: allocate memmap preferring the given node Baoquan He
@ 2020-03-16 12:56   ` Baoquan He
  2020-03-16 16:28       ` Pankaj Gupta
                       ` (3 more replies)
  0 siblings, 4 replies; 15+ messages in thread
From: Baoquan He @ 2020-03-16 12:56 UTC (permalink / raw)
  To: linux-kernel
  Cc: linux-mm, mhocko, akpm, david, willy, richard.weiyang, vbabka

When allocating memmap for hot added memory with the classic sparse, the
specified 'nid' is ignored in populate_section_memmap().

While in allocating memmap for the classic sparse during boot, the node
given by 'nid' is preferred. And VMEMMAP prefers the node of 'nid' in
both boot stage and memory hot adding. So seems no reason to not respect
the node of 'nid' for the classic sparse when hot adding memory.

Use kvmalloc_node instead to use the passed in 'nid'.

Signed-off-by: Baoquan He <bhe@redhat.com>
Acked-by: Michal Hocko <mhocko@suse.com>
Reviewed-by: Matthew Wilcox (Oracle) <willy@infradead.org>
---
 mm/sparse.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/mm/sparse.c b/mm/sparse.c
index 3fa407d7f70a..31dcdfb55c72 100644
--- a/mm/sparse.c
+++ b/mm/sparse.c
@@ -719,8 +719,8 @@ static int fill_subsection_map(unsigned long pfn, unsigned long nr_pages)
 struct page * __meminit populate_section_memmap(unsigned long pfn,
 		unsigned long nr_pages, int nid, struct vmem_altmap *altmap)
 {
-	return kvmalloc(array_size(sizeof(struct page),
-				   PAGES_PER_SECTION), GFP_KERNEL);
+	return kvmalloc_node(array_size(sizeof(struct page),
+					PAGES_PER_SECTION), GFP_KERNEL, nid);
 }
 
 static void depopulate_section_memmap(unsigned long pfn, unsigned long nr_pages,
-- 
2.17.2


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

* Re: [PATCH v5 2/2] mm/sparse.c: allocate memmap preferring the given node
  2020-03-16 12:56   ` [PATCH v5 " Baoquan He
@ 2020-03-16 16:28       ` Pankaj Gupta
  2020-03-16 16:29     ` David Hildenbrand
                         ` (2 subsequent siblings)
  3 siblings, 0 replies; 15+ messages in thread
From: Pankaj Gupta @ 2020-03-16 16:28 UTC (permalink / raw)
  To: Baoquan He
  Cc: linux-kernel, linux-mm, mhocko, Andrew Morton, David Hildenbrand,
	willy, richard.weiyang, Vlastimil Babka

> When allocating memmap for hot added memory with the classic sparse, the
> specified 'nid' is ignored in populate_section_memmap().
>
> While in allocating memmap for the classic sparse during boot, the node
> given by 'nid' is preferred. And VMEMMAP prefers the node of 'nid' in
> both boot stage and memory hot adding. So seems no reason to not respect
> the node of 'nid' for the classic sparse when hot adding memory.
>
> Use kvmalloc_node instead to use the passed in 'nid'.
>
> Signed-off-by: Baoquan He <bhe@redhat.com>
> Acked-by: Michal Hocko <mhocko@suse.com>
> Reviewed-by: Matthew Wilcox (Oracle) <willy@infradead.org>
> ---
>  mm/sparse.c | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/mm/sparse.c b/mm/sparse.c
> index 3fa407d7f70a..31dcdfb55c72 100644
> --- a/mm/sparse.c
> +++ b/mm/sparse.c
> @@ -719,8 +719,8 @@ static int fill_subsection_map(unsigned long pfn, unsigned long nr_pages)
>  struct page * __meminit populate_section_memmap(unsigned long pfn,
>                 unsigned long nr_pages, int nid, struct vmem_altmap *altmap)
>  {
> -       return kvmalloc(array_size(sizeof(struct page),
> -                                  PAGES_PER_SECTION), GFP_KERNEL);
> +       return kvmalloc_node(array_size(sizeof(struct page),
> +                                       PAGES_PER_SECTION), GFP_KERNEL, nid);
>  }
>
>  static void depopulate_section_memmap(unsigned long pfn, unsigned long nr_pages,
> --

Acked-by: Pankaj Gupta <pankaj.gupta.linux@gmail.com>

> 2.17.2
>
>

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

* Re: [PATCH v5 2/2] mm/sparse.c: allocate memmap preferring the given node
@ 2020-03-16 16:28       ` Pankaj Gupta
  0 siblings, 0 replies; 15+ messages in thread
From: Pankaj Gupta @ 2020-03-16 16:28 UTC (permalink / raw)
  To: Baoquan He
  Cc: linux-kernel, linux-mm, mhocko, Andrew Morton, David Hildenbrand,
	willy, richard.weiyang, Vlastimil Babka

> When allocating memmap for hot added memory with the classic sparse, the
> specified 'nid' is ignored in populate_section_memmap().
>
> While in allocating memmap for the classic sparse during boot, the node
> given by 'nid' is preferred. And VMEMMAP prefers the node of 'nid' in
> both boot stage and memory hot adding. So seems no reason to not respect
> the node of 'nid' for the classic sparse when hot adding memory.
>
> Use kvmalloc_node instead to use the passed in 'nid'.
>
> Signed-off-by: Baoquan He <bhe@redhat.com>
> Acked-by: Michal Hocko <mhocko@suse.com>
> Reviewed-by: Matthew Wilcox (Oracle) <willy@infradead.org>
> ---
>  mm/sparse.c | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/mm/sparse.c b/mm/sparse.c
> index 3fa407d7f70a..31dcdfb55c72 100644
> --- a/mm/sparse.c
> +++ b/mm/sparse.c
> @@ -719,8 +719,8 @@ static int fill_subsection_map(unsigned long pfn, unsigned long nr_pages)
>  struct page * __meminit populate_section_memmap(unsigned long pfn,
>                 unsigned long nr_pages, int nid, struct vmem_altmap *altmap)
>  {
> -       return kvmalloc(array_size(sizeof(struct page),
> -                                  PAGES_PER_SECTION), GFP_KERNEL);
> +       return kvmalloc_node(array_size(sizeof(struct page),
> +                                       PAGES_PER_SECTION), GFP_KERNEL, nid);
>  }
>
>  static void depopulate_section_memmap(unsigned long pfn, unsigned long nr_pages,
> --

Acked-by: Pankaj Gupta <pankaj.gupta.linux@gmail.com>

> 2.17.2
>
>


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

* Re: [PATCH v5 2/2] mm/sparse.c: allocate memmap preferring the given node
  2020-03-16 12:56   ` [PATCH v5 " Baoquan He
  2020-03-16 16:28       ` Pankaj Gupta
@ 2020-03-16 16:29     ` David Hildenbrand
  2020-03-16 22:16     ` Wei Yang
  2020-03-24  1:07     ` Baoquan He
  3 siblings, 0 replies; 15+ messages in thread
From: David Hildenbrand @ 2020-03-16 16:29 UTC (permalink / raw)
  To: Baoquan He, linux-kernel
  Cc: linux-mm, mhocko, akpm, willy, richard.weiyang, vbabka

On 16.03.20 13:56, Baoquan He wrote:
> When allocating memmap for hot added memory with the classic sparse, the
> specified 'nid' is ignored in populate_section_memmap().
> 
> While in allocating memmap for the classic sparse during boot, the node
> given by 'nid' is preferred. And VMEMMAP prefers the node of 'nid' in
> both boot stage and memory hot adding. So seems no reason to not respect
> the node of 'nid' for the classic sparse when hot adding memory.
> 
> Use kvmalloc_node instead to use the passed in 'nid'.
> 
> Signed-off-by: Baoquan He <bhe@redhat.com>
> Acked-by: Michal Hocko <mhocko@suse.com>
> Reviewed-by: Matthew Wilcox (Oracle) <willy@infradead.org>
> ---
>  mm/sparse.c | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/mm/sparse.c b/mm/sparse.c
> index 3fa407d7f70a..31dcdfb55c72 100644
> --- a/mm/sparse.c
> +++ b/mm/sparse.c
> @@ -719,8 +719,8 @@ static int fill_subsection_map(unsigned long pfn, unsigned long nr_pages)
>  struct page * __meminit populate_section_memmap(unsigned long pfn,
>  		unsigned long nr_pages, int nid, struct vmem_altmap *altmap)
>  {
> -	return kvmalloc(array_size(sizeof(struct page),
> -				   PAGES_PER_SECTION), GFP_KERNEL);
> +	return kvmalloc_node(array_size(sizeof(struct page),
> +					PAGES_PER_SECTION), GFP_KERNEL, nid);
>  }
>  
>  static void depopulate_section_memmap(unsigned long pfn, unsigned long nr_pages,
> 

Reviewed-by: David Hildenbrand <david@redhat.com>

-- 
Thanks,

David / dhildenb


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

* Re: [PATCH v5 1/2] mm/sparse.c: Use kvmalloc/kvfree to alloc/free memmap for the classic sparse
  2020-03-16 12:54 ` [PATCH v5 " Baoquan He
@ 2020-03-16 22:16   ` Wei Yang
  0 siblings, 0 replies; 15+ messages in thread
From: Wei Yang @ 2020-03-16 22:16 UTC (permalink / raw)
  To: Baoquan He
  Cc: linux-kernel, linux-mm, mhocko, akpm, david, willy,
	richard.weiyang, vbabka

On Mon, Mar 16, 2020 at 08:54:50PM +0800, Baoquan He wrote:
>This change makes populate_section_memmap()/depopulate_section_memmap
>much simpler.
>
>Suggested-by: Michal Hocko <mhocko@kernel.org>
>Signed-off-by: Baoquan He <bhe@redhat.com>
>Reviewed-by: David Hildenbrand <david@redhat.com>
>Acked-by: Michal Hocko <mhocko@suse.com>
>Reviewed-by: Pankaj Gupta <pankaj.gupta.linux@gmail.com>
>Reviewed-by: Matthew Wilcox (Oracle) <willy@infradead.org>

Reviewed-by: Wei Yang <richard.weiyang@gmail.com>

-- 
Wei Yang
Help you, Help me

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

* Re: [PATCH v5 2/2] mm/sparse.c: allocate memmap preferring the given node
  2020-03-16 12:56   ` [PATCH v5 " Baoquan He
  2020-03-16 16:28       ` Pankaj Gupta
  2020-03-16 16:29     ` David Hildenbrand
@ 2020-03-16 22:16     ` Wei Yang
  2020-03-24  1:07     ` Baoquan He
  3 siblings, 0 replies; 15+ messages in thread
From: Wei Yang @ 2020-03-16 22:16 UTC (permalink / raw)
  To: Baoquan He
  Cc: linux-kernel, linux-mm, mhocko, akpm, david, willy,
	richard.weiyang, vbabka

On Mon, Mar 16, 2020 at 08:56:25PM +0800, Baoquan He wrote:
>When allocating memmap for hot added memory with the classic sparse, the
>specified 'nid' is ignored in populate_section_memmap().
>
>While in allocating memmap for the classic sparse during boot, the node
>given by 'nid' is preferred. And VMEMMAP prefers the node of 'nid' in
>both boot stage and memory hot adding. So seems no reason to not respect
>the node of 'nid' for the classic sparse when hot adding memory.
>
>Use kvmalloc_node instead to use the passed in 'nid'.
>
>Signed-off-by: Baoquan He <bhe@redhat.com>
>Acked-by: Michal Hocko <mhocko@suse.com>
>Reviewed-by: Matthew Wilcox (Oracle) <willy@infradead.org>

Reviewed-by: Wei Yang <richard.weiyang@gmail.com>


-- 
Wei Yang
Help you, Help me

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

* Re: [PATCH v5 2/2] mm/sparse.c: allocate memmap preferring the given node
  2020-03-16 12:56   ` [PATCH v5 " Baoquan He
                       ` (2 preceding siblings ...)
  2020-03-16 22:16     ` Wei Yang
@ 2020-03-24  1:07     ` Baoquan He
  3 siblings, 0 replies; 15+ messages in thread
From: Baoquan He @ 2020-03-24  1:07 UTC (permalink / raw)
  To: akpm; +Cc: linux-mm, linux-kernel

Hi Andrew,

On 03/16/20 at 08:56pm, Baoquan He wrote:
> When allocating memmap for hot added memory with the classic sparse, the
> specified 'nid' is ignored in populate_section_memmap().
> 
> While in allocating memmap for the classic sparse during boot, the node
> given by 'nid' is preferred. And VMEMMAP prefers the node of 'nid' in
> both boot stage and memory hot adding. So seems no reason to not respect
> the node of 'nid' for the classic sparse when hot adding memory.
> 
> Use kvmalloc_node instead to use the passed in 'nid'.

Just checked linux-next, seems this one is missed. Michal suggested
splitting the old v4 into two patches, this patch is to use the passed
in 'nid' to allocate memmap with !VMEMMAP.

Thanks
Baoquan

> 
> Signed-off-by: Baoquan He <bhe@redhat.com>
> Acked-by: Michal Hocko <mhocko@suse.com>
> Reviewed-by: Matthew Wilcox (Oracle) <willy@infradead.org>
> ---
>  mm/sparse.c | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/mm/sparse.c b/mm/sparse.c
> index 3fa407d7f70a..31dcdfb55c72 100644
> --- a/mm/sparse.c
> +++ b/mm/sparse.c
> @@ -719,8 +719,8 @@ static int fill_subsection_map(unsigned long pfn, unsigned long nr_pages)
>  struct page * __meminit populate_section_memmap(unsigned long pfn,
>  		unsigned long nr_pages, int nid, struct vmem_altmap *altmap)
>  {
> -	return kvmalloc(array_size(sizeof(struct page),
> -				   PAGES_PER_SECTION), GFP_KERNEL);
> +	return kvmalloc_node(array_size(sizeof(struct page),
> +					PAGES_PER_SECTION), GFP_KERNEL, nid);
>  }
>  
>  static void depopulate_section_memmap(unsigned long pfn, unsigned long nr_pages,
> -- 
> 2.17.2
> 
> 


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

end of thread, other threads:[~2020-03-24  1:07 UTC | newest]

Thread overview: 15+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-03-16 10:21 [PATCH v4 1/2] mm/sparse.c: Use kvmalloc/kvfree to alloc/free memmap for the classic sparse Baoquan He
2020-03-16 10:21 ` [PATCH v4 2/2] mm/sparse.c: allocate memmap preferring the given node Baoquan He
2020-03-16 12:56   ` [PATCH v5 " Baoquan He
2020-03-16 16:28     ` Pankaj Gupta
2020-03-16 16:28       ` Pankaj Gupta
2020-03-16 16:29     ` David Hildenbrand
2020-03-16 22:16     ` Wei Yang
2020-03-24  1:07     ` Baoquan He
2020-03-16 11:00 ` [PATCH v4 1/2] mm/sparse.c: Use kvmalloc/kvfree to alloc/free memmap for the classic sparse David Hildenbrand
2020-03-16 12:40   ` Baoquan He
2020-03-16 11:17 ` Pankaj Gupta
2020-03-16 11:17   ` Pankaj Gupta
2020-03-16 12:18   ` Matthew Wilcox
2020-03-16 12:54 ` [PATCH v5 " Baoquan He
2020-03-16 22:16   ` Wei Yang

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.