public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH] x86, mm: clean up setup_node_bootmem
@ 2011-03-03  1:19 Yinghai Lu
  2011-03-03  6:30 ` Tejun Heo
  2011-03-03 20:49 ` David Rientjes
  0 siblings, 2 replies; 5+ messages in thread
From: Yinghai Lu @ 2011-03-03  1:19 UTC (permalink / raw)
  To: Thomas Gleixner, Ingo Molnar, H. Peter Anvin, Tejun Heo,
	David Rientjes
  Cc: linux-kernel@vger.kernel.org


only one user now, so change it to static

Also move validity checking into the fuction.

Signed-off-by: Yinghai Lu <yinghai@kernel.org>

---
 arch/x86/include/asm/numa_64.h |    2 --
 arch/x86/mm/numa_64.c          |   10 +++-------
 2 files changed, 3 insertions(+), 9 deletions(-)

Index: linux-2.6/arch/x86/include/asm/numa_64.h
===================================================================
--- linux-2.6.orig/arch/x86/include/asm/numa_64.h
+++ linux-2.6/arch/x86/include/asm/numa_64.h
@@ -13,8 +13,6 @@ struct bootnode {
 extern int numa_off;
 
 extern unsigned long numa_free_all_bootmem(void);
-extern void setup_node_bootmem(int nodeid, unsigned long start,
-			       unsigned long end);
 
 #ifdef CONFIG_NUMA
 /*
Index: linux-2.6/arch/x86/mm/numa_64.c
===================================================================
--- linux-2.6.orig/arch/x86/mm/numa_64.c
+++ linux-2.6/arch/x86/mm/numa_64.c
@@ -237,21 +237,18 @@ int __init numa_add_memblk(int nid, u64
 }
 
 /* Initialize bootmem allocator for a node */
-void __init
+static void __init
 setup_node_bootmem(int nodeid, unsigned long start, unsigned long end)
 {
 	unsigned long start_pfn, last_pfn, nodedata_phys;
 	const int pgdat_size = roundup(sizeof(pg_data_t), PAGE_SIZE);
 	int nid;
 
-	if (!end)
-		return;
-
 	/*
 	 * Don't confuse VM with a node that doesn't have the
 	 * minimum amount of memory:
 	 */
-	if (end && (end - start) < NODE_MIN_SIZE)
+	if (end < (start +  NODE_MIN_SIZE))
 		return;
 
 	start = roundup(start, ZONE_ALIGN);
@@ -557,8 +554,7 @@ static int __init numa_register_memblks(
 			end = max(mi->blk[i].end, end);
 		}
 
-		if (start < end)
-			setup_node_bootmem(nid, start, end);
+		setup_node_bootmem(nid, start, end);
 	}
 
 	return 0;

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

* Re: [PATCH] x86, mm: clean up setup_node_bootmem
  2011-03-03  1:19 [PATCH] x86, mm: clean up setup_node_bootmem Yinghai Lu
@ 2011-03-03  6:30 ` Tejun Heo
  2011-03-03 20:49 ` David Rientjes
  1 sibling, 0 replies; 5+ messages in thread
From: Tejun Heo @ 2011-03-03  6:30 UTC (permalink / raw)
  To: Yinghai Lu
  Cc: Thomas Gleixner, Ingo Molnar, H. Peter Anvin, David Rientjes,
	linux-kernel@vger.kernel.org

On Wed, Mar 02, 2011 at 05:19:29PM -0800, Yinghai Lu wrote:
> only one user now, so change it to static

Can you please try to use proper sentences?  ie.

  There is only one user left now, so make it static.

> Also move validity checking into the fuction.
>
> Signed-off-by: Yinghai Lu <yinghai@kernel.org>
...
> Index: linux-2.6/arch/x86/mm/numa_64.c
> ===================================================================
> --- linux-2.6.orig/arch/x86/mm/numa_64.c
> +++ linux-2.6/arch/x86/mm/numa_64.c
> @@ -237,21 +237,18 @@ int __init numa_add_memblk(int nid, u64
>  }
>  
>  /* Initialize bootmem allocator for a node */
> -void __init
> +static void __init
>  setup_node_bootmem(int nodeid, unsigned long start, unsigned long end)
>  {
>  	unsigned long start_pfn, last_pfn, nodedata_phys;
>  	const int pgdat_size = roundup(sizeof(pg_data_t), PAGE_SIZE);
>  	int nid;
>  
> -	if (!end)
> -		return;
> -
>  	/*
>  	 * Don't confuse VM with a node that doesn't have the
>  	 * minimum amount of memory:
>  	 */
> -	if (end && (end - start) < NODE_MIN_SIZE)
> +	if (end < (start +  NODE_MIN_SIZE))

Please drop the parentheses.

Thanks.

-- 
tejun

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

* Re: [PATCH] x86, mm: clean up setup_node_bootmem
  2011-03-03  1:19 [PATCH] x86, mm: clean up setup_node_bootmem Yinghai Lu
  2011-03-03  6:30 ` Tejun Heo
@ 2011-03-03 20:49 ` David Rientjes
  2011-03-03 21:35   ` Yinghai Lu
  1 sibling, 1 reply; 5+ messages in thread
From: David Rientjes @ 2011-03-03 20:49 UTC (permalink / raw)
  To: Yinghai Lu
  Cc: Thomas Gleixner, Ingo Molnar, H. Peter Anvin, Tejun Heo,
	linux-kernel@vger.kernel.org

On Wed, 2 Mar 2011, Yinghai Lu wrote:

> 
> only one user now, so change it to static
> 
> Also move validity checking into the fuction.
> 
> Signed-off-by: Yinghai Lu <yinghai@kernel.org>
> 
> ---
>  arch/x86/include/asm/numa_64.h |    2 --
>  arch/x86/mm/numa_64.c          |   10 +++-------
>  2 files changed, 3 insertions(+), 9 deletions(-)
> 
> Index: linux-2.6/arch/x86/include/asm/numa_64.h
> ===================================================================
> --- linux-2.6.orig/arch/x86/include/asm/numa_64.h
> +++ linux-2.6/arch/x86/include/asm/numa_64.h
> @@ -13,8 +13,6 @@ struct bootnode {
>  extern int numa_off;
>  
>  extern unsigned long numa_free_all_bootmem(void);
> -extern void setup_node_bootmem(int nodeid, unsigned long start,
> -			       unsigned long end);
>  
>  #ifdef CONFIG_NUMA
>  /*
> Index: linux-2.6/arch/x86/mm/numa_64.c
> ===================================================================
> --- linux-2.6.orig/arch/x86/mm/numa_64.c
> +++ linux-2.6/arch/x86/mm/numa_64.c
> @@ -237,21 +237,18 @@ int __init numa_add_memblk(int nid, u64
>  }
>  
>  /* Initialize bootmem allocator for a node */
> -void __init
> +static void __init
>  setup_node_bootmem(int nodeid, unsigned long start, unsigned long end)
>  {
>  	unsigned long start_pfn, last_pfn, nodedata_phys;
>  	const int pgdat_size = roundup(sizeof(pg_data_t), PAGE_SIZE);
>  	int nid;
>  
> -	if (!end)
> -		return;
> -
>  	/*
>  	 * Don't confuse VM with a node that doesn't have the
>  	 * minimum amount of memory:
>  	 */
> -	if (end && (end - start) < NODE_MIN_SIZE)
> +	if (end < (start +  NODE_MIN_SIZE))
>  		return;
>  
>  	start = roundup(start, ZONE_ALIGN);
> @@ -557,8 +554,7 @@ static int __init numa_register_memblks(
>  			end = max(mi->blk[i].end, end);
>  		}
>  
> -		if (start < end)
> -			setup_node_bootmem(nid, start, end);
> +		setup_node_bootmem(nid, start, end);
>  	}
>  
>  	return 0;
> 

Good catch on finding only the one caller of setup_node_bootmem().

I'd actually rather see the validity checking being done in 
numa_register_memblks(), though, because it's a bug for a node to be set 
in node_possible_map without having a valid 
[mi->blk[i].start, mi->blk[i].end) range.

So could this be

	BUG_ON(end < start);
	/*
	 * Don't confuse the VM with a node that doesn't have the minimum
	 * amount of memory.
	 */
	if (end < start + NODE_MIN_SIZE) {
		node_clear(nid, node_possible_map);
		continue;
	}
	setup_node_bootmem(nid, start, end);

instead?

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

* Re: [PATCH] x86, mm: clean up setup_node_bootmem
  2011-03-03 20:49 ` David Rientjes
@ 2011-03-03 21:35   ` Yinghai Lu
  2011-03-03 22:04     ` David Rientjes
  0 siblings, 1 reply; 5+ messages in thread
From: Yinghai Lu @ 2011-03-03 21:35 UTC (permalink / raw)
  To: David Rientjes
  Cc: Thomas Gleixner, Ingo Molnar, H. Peter Anvin, Tejun Heo,
	linux-kernel@vger.kernel.org

On 03/03/2011 12:49 PM, David Rientjes wrote:
> On Wed, 2 Mar 2011, Yinghai Lu wrote:
> 
>>
>> only one user now, so change it to static
>>
>> Also move validity checking into the fuction.
>>
>> Signed-off-by: Yinghai Lu <yinghai@kernel.org>
>>
>> ---
>>  arch/x86/include/asm/numa_64.h |    2 --
>>  arch/x86/mm/numa_64.c          |   10 +++-------
>>  2 files changed, 3 insertions(+), 9 deletions(-)
>>
>> Index: linux-2.6/arch/x86/include/asm/numa_64.h
>> ===================================================================
>> --- linux-2.6.orig/arch/x86/include/asm/numa_64.h
>> +++ linux-2.6/arch/x86/include/asm/numa_64.h
>> @@ -13,8 +13,6 @@ struct bootnode {
>>  extern int numa_off;
>>  
>>  extern unsigned long numa_free_all_bootmem(void);
>> -extern void setup_node_bootmem(int nodeid, unsigned long start,
>> -			       unsigned long end);
>>  
>>  #ifdef CONFIG_NUMA
>>  /*
>> Index: linux-2.6/arch/x86/mm/numa_64.c
>> ===================================================================
>> --- linux-2.6.orig/arch/x86/mm/numa_64.c
>> +++ linux-2.6/arch/x86/mm/numa_64.c
>> @@ -237,21 +237,18 @@ int __init numa_add_memblk(int nid, u64
>>  }
>>  
>>  /* Initialize bootmem allocator for a node */
>> -void __init
>> +static void __init
>>  setup_node_bootmem(int nodeid, unsigned long start, unsigned long end)
>>  {
>>  	unsigned long start_pfn, last_pfn, nodedata_phys;
>>  	const int pgdat_size = roundup(sizeof(pg_data_t), PAGE_SIZE);
>>  	int nid;
>>  
>> -	if (!end)
>> -		return;
>> -
>>  	/*
>>  	 * Don't confuse VM with a node that doesn't have the
>>  	 * minimum amount of memory:
>>  	 */
>> -	if (end && (end - start) < NODE_MIN_SIZE)
>> +	if (end < (start +  NODE_MIN_SIZE))
>>  		return;
>>  
>>  	start = roundup(start, ZONE_ALIGN);
>> @@ -557,8 +554,7 @@ static int __init numa_register_memblks(
>>  			end = max(mi->blk[i].end, end);
>>  		}
>>  
>> -		if (start < end)
>> -			setup_node_bootmem(nid, start, end);
>> +		setup_node_bootmem(nid, start, end);
>>  	}
>>  
>>  	return 0;
>>
> 
> Good catch on finding only the one caller of setup_node_bootmem().
> 
> I'd actually rather see the validity checking being done in 
> numa_register_memblks(), though, because it's a bug for a node to be set 
> in node_possible_map without having a valid 
> [mi->blk[i].start, mi->blk[i].end) range.
> 
> So could this be
> 
> 	BUG_ON(end < start);

no, it could cause crash here

        /* Finally register nodes. */
        for_each_node_mask(nid, node_possible_map) {
                u64 start = (u64)max_pfn << PAGE_SHIFT;
                u64 end = 0;

                for (i = 0; i < mi->nr_blks; i++) {
                        if (nid != mi->blk[i].nid)
                                continue;
                        start = min(mi->blk[i].start, start);
                        end = max(mi->blk[i].end, end);
                }

could have some node without memory. and it could be set in node_possible_map, and it will have end = 0, and start max_pfn<<page_shift.


> 	/*
> 	 * Don't confuse the VM with a node that doesn't have the minimum
> 	 * amount of memory.
> 	 */
> 	if (end < start + NODE_MIN_SIZE) {
> 		node_clear(nid, node_possible_map);

why touch that possible_map ?
online_map is for that purpose that state node have ram.

> 		continue;
> 	}
> 	setup_node_bootmem(nid, start, end);
> 
> instead?

Thanks

Yinghai

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

* Re: [PATCH] x86, mm: clean up setup_node_bootmem
  2011-03-03 21:35   ` Yinghai Lu
@ 2011-03-03 22:04     ` David Rientjes
  0 siblings, 0 replies; 5+ messages in thread
From: David Rientjes @ 2011-03-03 22:04 UTC (permalink / raw)
  To: Yinghai Lu
  Cc: Thomas Gleixner, Ingo Molnar, H. Peter Anvin, Tejun Heo,
	linux-kernel@vger.kernel.org

On Thu, 3 Mar 2011, Yinghai Lu wrote:

> >> Index: linux-2.6/arch/x86/mm/numa_64.c
> >> ===================================================================
> >> --- linux-2.6.orig/arch/x86/mm/numa_64.c
> >> +++ linux-2.6/arch/x86/mm/numa_64.c
> >> @@ -237,21 +237,18 @@ int __init numa_add_memblk(int nid, u64
> >>  }
> >>  
> >>  /* Initialize bootmem allocator for a node */
> >> -void __init
> >> +static void __init
> >>  setup_node_bootmem(int nodeid, unsigned long start, unsigned long end)
> >>  {
> >>  	unsigned long start_pfn, last_pfn, nodedata_phys;
> >>  	const int pgdat_size = roundup(sizeof(pg_data_t), PAGE_SIZE);
> >>  	int nid;
> >>  
> >> -	if (!end)
> >> -		return;
> >> -
> >>  	/*
> >>  	 * Don't confuse VM with a node that doesn't have the
> >>  	 * minimum amount of memory:
> >>  	 */
> >> -	if (end && (end - start) < NODE_MIN_SIZE)
> >> +	if (end < (start +  NODE_MIN_SIZE))
> >>  		return;
> >>  
> >>  	start = roundup(start, ZONE_ALIGN);
> >> @@ -557,8 +554,7 @@ static int __init numa_register_memblks(
> >>  			end = max(mi->blk[i].end, end);
> >>  		}
> >>  
> >> -		if (start < end)
> >> -			setup_node_bootmem(nid, start, end);
> >> +		setup_node_bootmem(nid, start, end);
> >>  	}
> >>  
> >>  	return 0;
> >>
> > 
> > Good catch on finding only the one caller of setup_node_bootmem().
> > 
> > I'd actually rather see the validity checking being done in 
> > numa_register_memblks(), though, because it's a bug for a node to be set 
> > in node_possible_map without having a valid 
> > [mi->blk[i].start, mi->blk[i].end) range.
> > 
> > So could this be
> > 
> > 	BUG_ON(end < start);
> 
> no, it could cause crash here
> 
>         /* Finally register nodes. */
>         for_each_node_mask(nid, node_possible_map) {
>                 u64 start = (u64)max_pfn << PAGE_SHIFT;
>                 u64 end = 0;
> 
>                 for (i = 0; i < mi->nr_blks; i++) {
>                         if (nid != mi->blk[i].nid)
>                                 continue;
>                         start = min(mi->blk[i].start, start);
>                         end = max(mi->blk[i].end, end);
>                 }
> 
> could have some node without memory. and it could be set in node_possible_map, and it will have end = 0, and start max_pfn<<page_shift.
> 

Ok, I didn't realize this was being used for memoryless nodes.

> > 	/*
> > 	 * Don't confuse the VM with a node that doesn't have the minimum
> > 	 * amount of memory.
> > 	 */
> > 	if (end < start + NODE_MIN_SIZE) {
> > 		node_clear(nid, node_possible_map);
> 
> why touch that possible_map ?
> online_map is for that purpose that state node have ram.
> 

Hmm, that's the purpose of N_NORMAL_MEMORY, not node_online_map.  I 
understand why we don't want to register bootmem for a node that has such 
little memory that we disregard it, but shouldn't we then consider it to 
no longer be possible?

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

end of thread, other threads:[~2011-03-03 22:04 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-03-03  1:19 [PATCH] x86, mm: clean up setup_node_bootmem Yinghai Lu
2011-03-03  6:30 ` Tejun Heo
2011-03-03 20:49 ` David Rientjes
2011-03-03 21:35   ` Yinghai Lu
2011-03-03 22:04     ` David Rientjes

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox