2006-12-09 09:39:58

by Yasunori Goto

[permalink] [raw]
Subject: [Patch](memory hotplug) Fix compile error for i386 with NUMA config

Hello.

This patch is to fix compile error when config memory hotplug
with numa on i386.

The cause of compile error was missing of arch_add_memory(), remove_memory(),
and memory_add_physaddr_to_nid() when NUMA config is on.

This is for 2.6.19, and I tested no compile error of it.

Please apply.

Signed-off-by: Yasunori Goto <[email protected]>

---
arch/i386/mm/discontig.c | 17 +++++++++++++++++
arch/i386/mm/init.c | 4 +---
2 files changed, 18 insertions(+), 3 deletions(-)

Index: linux-2.6.19/arch/i386/mm/init.c
===================================================================
--- linux-2.6.19.orig/arch/i386/mm/init.c 2006-12-04 20:06:32.000000000 +0900
+++ linux-2.6.19/arch/i386/mm/init.c 2006-12-04 21:09:49.000000000 +0900
@@ -681,10 +681,9 @@
* memory to the highmem for now.
*/
#ifdef CONFIG_MEMORY_HOTPLUG
-#ifndef CONFIG_NEED_MULTIPLE_NODES
int arch_add_memory(int nid, u64 start, u64 size)
{
- struct pglist_data *pgdata = &contig_page_data;
+ struct pglist_data *pgdata = NODE_DATA(nid);
struct zone *zone = pgdata->node_zones + ZONE_HIGHMEM;
unsigned long start_pfn = start >> PAGE_SHIFT;
unsigned long nr_pages = size >> PAGE_SHIFT;
@@ -697,7 +696,6 @@
return -EINVAL;
}
#endif
-#endif

kmem_cache_t *pgd_cache;
kmem_cache_t *pmd_cache;
Index: linux-2.6.19/arch/i386/mm/discontig.c
===================================================================
--- linux-2.6.19.orig/arch/i386/mm/discontig.c 2006-12-04 20:06:32.000000000 +0900
+++ linux-2.6.19/arch/i386/mm/discontig.c 2006-12-09 17:30:24.000000000 +0900
@@ -405,3 +405,20 @@
totalram_pages += totalhigh_pages;
#endif
}
+
+#ifdef CONFIG_MEMORY_HOTPLUG
+/* This is the case that there is no _PXM on DSDT for added memory */
+int memory_add_physaddr_to_nid(u64 addr)
+{
+ int nid;
+ unsigned long pfn = addr >> PAGE_SHIFT;
+
+ for (nid = 0; nid < MAX_NUMNODES; nid++){
+ if (node_start_pfn[nid] <= pfn &&
+ pfn < node_end_pfn[nid])
+ return nid;
+ }
+
+ return 0;
+}
+#endif

--
Yasunori Goto



2006-12-09 11:24:15

by David Rientjes

[permalink] [raw]
Subject: Re: [Patch](memory hotplug) Fix compile error for i386 with NUMA config

On Sat, 9 Dec 2006, Yasunori Goto wrote:

> Hello.
>
> This patch is to fix compile error when config memory hotplug
> with numa on i386.
>
> The cause of compile error was missing of arch_add_memory(), remove_memory(),
> and memory_add_physaddr_to_nid() when NUMA config is on.
>
> This is for 2.6.19, and I tested no compile error of it.
>
> Please apply.
>
> Signed-off-by: Yasunori Goto <[email protected]>
>
> ---
> arch/i386/mm/discontig.c | 17 +++++++++++++++++
> arch/i386/mm/init.c | 4 +---
> 2 files changed, 18 insertions(+), 3 deletions(-)
>
> Index: linux-2.6.19/arch/i386/mm/init.c
> ===================================================================
> --- linux-2.6.19.orig/arch/i386/mm/init.c 2006-12-04 20:06:32.000000000 +0900
> +++ linux-2.6.19/arch/i386/mm/init.c 2006-12-04 21:09:49.000000000 +0900
> @@ -681,10 +681,9 @@
> * memory to the highmem for now.
> */
> #ifdef CONFIG_MEMORY_HOTPLUG
> -#ifndef CONFIG_NEED_MULTIPLE_NODES
> int arch_add_memory(int nid, u64 start, u64 size)
> {
> - struct pglist_data *pgdata = &contig_page_data;
> + struct pglist_data *pgdata = NODE_DATA(nid);
> struct zone *zone = pgdata->node_zones + ZONE_HIGHMEM;
> unsigned long start_pfn = start >> PAGE_SHIFT;
> unsigned long nr_pages = size >> PAGE_SHIFT;
> @@ -697,7 +696,6 @@
> return -EINVAL;
> }
> #endif
> -#endif
>
> kmem_cache_t *pgd_cache;
> kmem_cache_t *pmd_cache;

The reason for the #ifndef CONFIG_NEED_MULTIPLE_NODES check seems to
solely exist for excluding the NUMA case, so it doesn't appear as though
this is the correct fix since your changelog indicates a compile problem
with a NUMA build. This hypothesis is supported by the comment which
conveniently appears just before arch_add_memory which _explicitly_ states
that the following is for non-NUMA cases.

> Index: linux-2.6.19/arch/i386/mm/discontig.c
> ===================================================================
> --- linux-2.6.19.orig/arch/i386/mm/discontig.c 2006-12-04 20:06:32.000000000 +0900
> +++ linux-2.6.19/arch/i386/mm/discontig.c 2006-12-09 17:30:24.000000000 +0900
> @@ -405,3 +405,20 @@
> totalram_pages += totalhigh_pages;
> #endif
> }
> +
> +#ifdef CONFIG_MEMORY_HOTPLUG
> +/* This is the case that there is no _PXM on DSDT for added memory */
> +int memory_add_physaddr_to_nid(u64 addr)
> +{
> + int nid;
> + unsigned long pfn = addr >> PAGE_SHIFT;
> +
> + for (nid = 0; nid < MAX_NUMNODES; nid++){
> + if (node_start_pfn[nid] <= pfn &&
> + pfn < node_end_pfn[nid])
> + return nid;
> + }
> +
> + return 0;
> +}
> +#endif
>

memory_add_physaddr_to_nid is only declared as extern in
include/linux/memory_hotplug.h in the CONFIG_NUMA case so this also
doesn't appear as the correct fix but probably worked for your compile
since you had CONFIG_MEMORY_HOTPLUG enabled.

David

2006-12-11 04:48:46

by Yasunori Goto

[permalink] [raw]
Subject: Re: [Patch](memory hotplug) Fix compile error for i386 with NUMA config

Hi David-san.

> On Sat, 9 Dec 2006, Yasunori Goto wrote:
>
> > Hello.
> >
> > This patch is to fix compile error when config memory hotplug
> > with numa on i386.
> >
> > The cause of compile error was missing of arch_add_memory(), remove_memory(),
> > and memory_add_physaddr_to_nid() when NUMA config is on.
> >
> > This is for 2.6.19, and I tested no compile error of it.
> >
> > Please apply.
> >
> > Signed-off-by: Yasunori Goto <[email protected]>
> >
> > ---
> > arch/i386/mm/discontig.c | 17 +++++++++++++++++
> > arch/i386/mm/init.c | 4 +---
> > 2 files changed, 18 insertions(+), 3 deletions(-)
> >
> > Index: linux-2.6.19/arch/i386/mm/init.c
> > ===================================================================
> > --- linux-2.6.19.orig/arch/i386/mm/init.c 2006-12-04 20:06:32.000000000 +0900
> > +++ linux-2.6.19/arch/i386/mm/init.c 2006-12-04 21:09:49.000000000 +0900
> > @@ -681,10 +681,9 @@
> > * memory to the highmem for now.
> > */
> > #ifdef CONFIG_MEMORY_HOTPLUG
> > -#ifndef CONFIG_NEED_MULTIPLE_NODES
> > int arch_add_memory(int nid, u64 start, u64 size)
> > {
> > - struct pglist_data *pgdata = &contig_page_data;
> > + struct pglist_data *pgdata = NODE_DATA(nid);
> > struct zone *zone = pgdata->node_zones + ZONE_HIGHMEM;
> > unsigned long start_pfn = start >> PAGE_SHIFT;
> > unsigned long nr_pages = size >> PAGE_SHIFT;
> > @@ -697,7 +696,6 @@
> > return -EINVAL;
> > }
> > #endif
> > -#endif
> >
> > kmem_cache_t *pgd_cache;
> > kmem_cache_t *pmd_cache;
>
> The reason for the #ifndef CONFIG_NEED_MULTIPLE_NODES check seems to
> solely exist for excluding the NUMA case, so it doesn't appear as though
> this is the correct fix since your changelog indicates a compile problem
> with a NUMA build. This hypothesis is supported by the comment which
> conveniently appears just before arch_add_memory which _explicitly_ states
> that the following is for non-NUMA cases.

No.
Other arch's arch_add_memory() and remove_memory() have been already
used for NUMA case too. But i386 didn't do it because just
contig_page_data is used.
Current NODE_DATA() macro is defined both case appropriately.
So, this #ifdef is redundant now.

(See: http://marc.theaimsgroup.com/?l=linux-mm&m=116494983531221&w=2)

>
> > Index: linux-2.6.19/arch/i386/mm/discontig.c
> > ===================================================================
> > --- linux-2.6.19.orig/arch/i386/mm/discontig.c 2006-12-04 20:06:32.000000000 +0900
> > +++ linux-2.6.19/arch/i386/mm/discontig.c 2006-12-09 17:30:24.000000000 +0900
> > @@ -405,3 +405,20 @@
> > totalram_pages += totalhigh_pages;
> > #endif
> > }
> > +
> > +#ifdef CONFIG_MEMORY_HOTPLUG
> > +/* This is the case that there is no _PXM on DSDT for added memory */
> > +int memory_add_physaddr_to_nid(u64 addr)
> > +{
> > + int nid;
> > + unsigned long pfn = addr >> PAGE_SHIFT;
> > +
> > + for (nid = 0; nid < MAX_NUMNODES; nid++){
> > + if (node_start_pfn[nid] <= pfn &&
> > + pfn < node_end_pfn[nid])
> > + return nid;
> > + }
> > +
> > + return 0;
> > +}
> > +#endif
> >
>
> memory_add_physaddr_to_nid is only declared as extern in
> include/linux/memory_hotplug.h in the CONFIG_NUMA case so this also
> doesn't appear as the correct fix but probably worked for your compile
> since you had CONFIG_MEMORY_HOTPLUG enabled.

memory_add_physaddr_to_nid() is used for memory hotplug to
find node id for new memory when ACPI's DSDT doesn't define
_PXM for new memory. So, when CONFIG_MEMORY_HOTPLUG is not set,
this function is not used.

Bye.

--
Yasunori Goto


2006-12-11 07:52:33

by David Rientjes

[permalink] [raw]
Subject: Re: [Patch](memory hotplug) Fix compile error for i386 with NUMA config

On Mon, 11 Dec 2006, Yasunori Goto wrote:

> No.
> Other arch's arch_add_memory() and remove_memory() have been already
> used for NUMA case too. But i386 didn't do it because just
> contig_page_data is used.
> Current NODE_DATA() macro is defined both case appropriately.
> So, this #ifdef is redundant now.
>

Then I assume the comment directly above this change is also redundant
since it explicitly states that the following code is for the non-NUMA
case.

David

2006-12-11 08:22:39

by Yasunori Goto

[permalink] [raw]
Subject: Re: [Patch](memory hotplug) Fix compile error for i386 with NUMA config


> > No.
> > Other arch's arch_add_memory() and remove_memory() have been already
> > used for NUMA case too. But i386 didn't do it because just
> > contig_page_data is used.
> > Current NODE_DATA() macro is defined both case appropriately.
> > So, this #ifdef is redundant now.
> >
>
> Then I assume the comment directly above this change is also redundant
> since it explicitly states that the following code is for the non-NUMA
> case.

Ahhhhh. Yes indeed.

Here is fixed patch. Thanks for your comment.

Bye.


-------

This patch is to fix compile error when config memory hotplug
with numa on i386.

The cause of compile error was missing of arch_add_memory(), remove_memory(),
and memory_add_physaddr_to_nid().

This is for 2.6.19, and I tested no compile error of it.

Please apply.

Signed-off-by: Yasunori Goto <[email protected]>

---
arch/i386/mm/discontig.c | 17 +++++++++++++++++
arch/i386/mm/init.c | 9 +--------
2 files changed, 18 insertions(+), 8 deletions(-)

Index: linux-2.6.19/arch/i386/mm/init.c
===================================================================
--- linux-2.6.19.orig/arch/i386/mm/init.c 2006-12-09 17:42:06.000000000 +0900
+++ linux-2.6.19/arch/i386/mm/init.c 2006-12-11 16:58:49.000000000 +0900
@@ -675,16 +675,10 @@
#endif
}

-/*
- * this is for the non-NUMA, single node SMP system case.
- * Specifically, in the case of x86, we will always add
- * memory to the highmem for now.
- */
#ifdef CONFIG_MEMORY_HOTPLUG
-#ifndef CONFIG_NEED_MULTIPLE_NODES
int arch_add_memory(int nid, u64 start, u64 size)
{
- struct pglist_data *pgdata = &contig_page_data;
+ struct pglist_data *pgdata = NODE_DATA(nid);
struct zone *zone = pgdata->node_zones + ZONE_HIGHMEM;
unsigned long start_pfn = start >> PAGE_SHIFT;
unsigned long nr_pages = size >> PAGE_SHIFT;
@@ -697,7 +691,6 @@
return -EINVAL;
}
#endif
-#endif

kmem_cache_t *pgd_cache;
kmem_cache_t *pmd_cache;
Index: linux-2.6.19/arch/i386/mm/discontig.c
===================================================================
--- linux-2.6.19.orig/arch/i386/mm/discontig.c 2006-12-09 17:42:06.000000000 +0900
+++ linux-2.6.19/arch/i386/mm/discontig.c 2006-12-09 17:58:32.000000000 +0900
@@ -405,3 +405,20 @@
totalram_pages += totalhigh_pages;
#endif
}
+
+#ifdef CONFIG_MEMORY_HOTPLUG
+/* This is the case that there is no _PXM on DSDT for added memory */
+int memory_add_physaddr_to_nid(u64 addr)
+{
+ int nid;
+ unsigned long pfn = addr >> PAGE_SHIFT;
+
+ for (nid = 0; nid < MAX_NUMNODES; nid++){
+ if (node_start_pfn[nid] <= pfn &&
+ pfn < node_end_pfn[nid])
+ return nid;
+ }
+
+ return 0;
+}
+#endif

--
Yasunori Goto