All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v4 RESEND 1/3] mm/sparse: optimize sparse_index_alloc
@ 2012-07-13  2:01 Gavin Shan
  2012-07-13  2:01 ` [PATCH v4 RESEND 2/3] mm/sparse: more check on mem_section number Gavin Shan
  2012-07-13  2:01 ` [PATCH v2 3/3] mm/sparse: remove index_init_lock Gavin Shan
  0 siblings, 2 replies; 5+ messages in thread
From: Gavin Shan @ 2012-07-13  2:01 UTC (permalink / raw)
  To: linux-mm; +Cc: rientjes, mhocko, akpm, Gavin Shan

With CONFIG_SPARSEMEM_EXTREME, the two level of memory section
descriptors are allocated from slab or bootmem. When allocating
from slab, let slab/bootmem allocator to clear the memory chunk.
We needn't clear that explicitly.

Signed-off-by: Gavin Shan <shangw@linux.vnet.ibm.com>
Reviewed-by: Michal Hocko <mhocko@suse.cz>
Acked-by: David Rientjes <rientjes@google.com>
---
 mm/sparse.c |   10 ++++------
 1 files changed, 4 insertions(+), 6 deletions(-)

diff --git a/mm/sparse.c b/mm/sparse.c
index c7bb952..d882e88 100644
--- a/mm/sparse.c
+++ b/mm/sparse.c
@@ -65,14 +65,12 @@ static struct mem_section noinline __init_refok *sparse_index_alloc(int nid)
 
 	if (slab_is_available()) {
 		if (node_state(nid, N_HIGH_MEMORY))
-			section = kmalloc_node(array_size, GFP_KERNEL, nid);
+			section = kzalloc_node(array_size, GFP_KERNEL, nid);
 		else
-			section = kmalloc(array_size, GFP_KERNEL);
-	} else
+			section = kzalloc(array_size, GFP_KERNEL);
+	} else {
 		section = alloc_bootmem_node(NODE_DATA(nid), array_size);
-
-	if (section)
-		memset(section, 0, array_size);
+	}
 
 	return section;
 }
-- 
1.7.5.4

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

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

* [PATCH v4 RESEND 2/3] mm/sparse: more check on mem_section number
  2012-07-13  2:01 [PATCH v4 RESEND 1/3] mm/sparse: optimize sparse_index_alloc Gavin Shan
@ 2012-07-13  2:01 ` Gavin Shan
  2012-07-13  2:01 ` [PATCH v2 3/3] mm/sparse: remove index_init_lock Gavin Shan
  1 sibling, 0 replies; 5+ messages in thread
From: Gavin Shan @ 2012-07-13  2:01 UTC (permalink / raw)
  To: linux-mm; +Cc: rientjes, mhocko, akpm, Gavin Shan

Function __section_nr() was implemented to retrieve the corresponding
memory section number according to its descriptor. It's possible that
the specified memory section descriptor isn't existing in the global
array. So here to add more check on that and report error for wrong
case.

Signed-off-by: Gavin Shan <shangw@linux.vnet.ibm.com>
Acked-by: David Rientjes <rientjes@google.com>
---
 mm/sparse.c |    2 ++
 1 files changed, 2 insertions(+), 0 deletions(-)

diff --git a/mm/sparse.c b/mm/sparse.c
index d882e88..51950de 100644
--- a/mm/sparse.c
+++ b/mm/sparse.c
@@ -130,6 +130,8 @@ int __section_nr(struct mem_section* ms)
 		     break;
 	}
 
+	VM_BUG_ON(root_nr == NR_SECTION_ROOTS);
+
 	return (root_nr * SECTIONS_PER_ROOT) + (ms - root);
 }
 
-- 
1.7.5.4

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

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

* [PATCH v2 3/3] mm/sparse: remove index_init_lock
  2012-07-13  2:01 [PATCH v4 RESEND 1/3] mm/sparse: optimize sparse_index_alloc Gavin Shan
  2012-07-13  2:01 ` [PATCH v4 RESEND 2/3] mm/sparse: more check on mem_section number Gavin Shan
@ 2012-07-13  2:01 ` Gavin Shan
  2012-07-13  8:41   ` Michal Hocko
  1 sibling, 1 reply; 5+ messages in thread
From: Gavin Shan @ 2012-07-13  2:01 UTC (permalink / raw)
  To: linux-mm; +Cc: rientjes, mhocko, akpm, Gavin Shan

sparse_index_init uses index_init_lock spinlock to protect root
mem_section assignment. The lock is not necessary anymore because the
function is called only during the boot (during paging init which
is executed only from a single CPU) and from the hotplug code (by
add_memory via arch_add_memory) which uses mem_hotplug_mutex.

The lock has been introduced by 28ae55c9 (sparsemem extreme: hotplug
preparation) and sparse_index_init was used only during boot at that
time.

Later when the hotplug code (and add_memory) was introduced there was
no synchronization so it was possible to online more sections from
the same root probably (though I am not 100% sure about that).
The first synchronization has been added by 6ad696d2 (mm: allow memory
hotplug and hibernation in the same kernel) which has been later
replaced by the mem_hotplug_mutex - 20d6c96b (mem-hotplug: introduce
{un}lock_memory_hotplug()).

Let's remove the lock as it is not needed and it makes the code more
confusing.

Signed-off-by: Gavin Shan <shangw@linux.vnet.ibm.com>
---
 mm/sparse.c |   14 +-------------
 1 files changed, 1 insertions(+), 13 deletions(-)

diff --git a/mm/sparse.c b/mm/sparse.c
index 51950de..40b1100 100644
--- a/mm/sparse.c
+++ b/mm/sparse.c
@@ -77,7 +77,6 @@ static struct mem_section noinline __init_refok *sparse_index_alloc(int nid)
 
 static int __meminit sparse_index_init(unsigned long section_nr, int nid)
 {
-	static DEFINE_SPINLOCK(index_init_lock);
 	unsigned long root = SECTION_NR_TO_ROOT(section_nr);
 	struct mem_section *section;
 	int ret = 0;
@@ -88,20 +87,9 @@ static int __meminit sparse_index_init(unsigned long section_nr, int nid)
 	section = sparse_index_alloc(nid);
 	if (!section)
 		return -ENOMEM;
-	/*
-	 * This lock keeps two different sections from
-	 * reallocating for the same index
-	 */
-	spin_lock(&index_init_lock);
-
-	if (mem_section[root]) {
-		ret = -EEXIST;
-		goto out;
-	}
 
 	mem_section[root] = section;
-out:
-	spin_unlock(&index_init_lock);
+
 	return ret;
 }
 #else /* !SPARSEMEM_EXTREME */
-- 
1.7.5.4

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

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

* Re: [PATCH v2 3/3] mm/sparse: remove index_init_lock
  2012-07-13  2:01 ` [PATCH v2 3/3] mm/sparse: remove index_init_lock Gavin Shan
@ 2012-07-13  8:41   ` Michal Hocko
  2012-07-16  3:46     ` Gavin Shan
  0 siblings, 1 reply; 5+ messages in thread
From: Michal Hocko @ 2012-07-13  8:41 UTC (permalink / raw)
  To: Gavin Shan; +Cc: linux-mm, rientjes, akpm

On Fri 13-07-12 10:01:22, Gavin Shan wrote:
> sparse_index_init uses index_init_lock spinlock to protect root
> mem_section assignment. The lock is not necessary anymore because the
> function is called only during the boot (during paging init which
> is executed only from a single CPU) and from the hotplug code (by
> add_memory via arch_add_memory) which uses mem_hotplug_mutex.
> 
> The lock has been introduced by 28ae55c9 (sparsemem extreme: hotplug
> preparation) and sparse_index_init was used only during boot at that
> time.
> 
> Later when the hotplug code (and add_memory) was introduced there was
> no synchronization so it was possible to online more sections from
> the same root probably (though I am not 100% sure about that).
> The first synchronization has been added by 6ad696d2 (mm: allow memory
> hotplug and hibernation in the same kernel) which has been later
> replaced by the mem_hotplug_mutex - 20d6c96b (mem-hotplug: introduce
> {un}lock_memory_hotplug()).
> 
> Let's remove the lock as it is not needed and it makes the code more
> confusing.
> 
> Signed-off-by: Gavin Shan <shangw@linux.vnet.ibm.com>

Reviewed-by: Michal Hocko <mhocko@suse.cz>

> ---
>  mm/sparse.c |   14 +-------------
>  1 files changed, 1 insertions(+), 13 deletions(-)
> 
> diff --git a/mm/sparse.c b/mm/sparse.c
> index 51950de..40b1100 100644
> --- a/mm/sparse.c
> +++ b/mm/sparse.c
> @@ -77,7 +77,6 @@ static struct mem_section noinline __init_refok *sparse_index_alloc(int nid)
>  
>  static int __meminit sparse_index_init(unsigned long section_nr, int nid)
>  {
> -	static DEFINE_SPINLOCK(index_init_lock);
>  	unsigned long root = SECTION_NR_TO_ROOT(section_nr);
>  	struct mem_section *section;
>  	int ret = 0;
> @@ -88,20 +87,9 @@ static int __meminit sparse_index_init(unsigned long section_nr, int nid)
>  	section = sparse_index_alloc(nid);
>  	if (!section)
>  		return -ENOMEM;
> -	/*
> -	 * This lock keeps two different sections from
> -	 * reallocating for the same index
> -	 */
> -	spin_lock(&index_init_lock);
> -
> -	if (mem_section[root]) {
> -		ret = -EEXIST;
> -		goto out;
> -	}
>  
>  	mem_section[root] = section;
> -out:
> -	spin_unlock(&index_init_lock);
> +
>  	return ret;
>  }
>  #else /* !SPARSEMEM_EXTREME */
> -- 
> 1.7.5.4
> 
> --
> To unsubscribe, send a message with 'unsubscribe linux-mm' in
> the body to majordomo@kvack.org.  For more info on Linux MM,
> see: http://www.linux-mm.org/ .
> Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

-- 
Michal Hocko
SUSE Labs
SUSE LINUX s.r.o.
Lihovarska 1060/12
190 00 Praha 9    
Czech Republic

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

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

* Re: [PATCH v2 3/3] mm/sparse: remove index_init_lock
  2012-07-13  8:41   ` Michal Hocko
@ 2012-07-16  3:46     ` Gavin Shan
  0 siblings, 0 replies; 5+ messages in thread
From: Gavin Shan @ 2012-07-16  3:46 UTC (permalink / raw)
  To: Michal Hocko; +Cc: Gavin Shan, linux-mm, rientjes, akpm

On Fri, Jul 13, 2012 at 10:41:27AM +0200, Michal Hocko wrote:
>On Fri 13-07-12 10:01:22, Gavin Shan wrote:
>> sparse_index_init uses index_init_lock spinlock to protect root
>> mem_section assignment. The lock is not necessary anymore because the
>> function is called only during the boot (during paging init which
>> is executed only from a single CPU) and from the hotplug code (by
>> add_memory via arch_add_memory) which uses mem_hotplug_mutex.
>> 
>> The lock has been introduced by 28ae55c9 (sparsemem extreme: hotplug
>> preparation) and sparse_index_init was used only during boot at that
>> time.
>> 
>> Later when the hotplug code (and add_memory) was introduced there was
>> no synchronization so it was possible to online more sections from
>> the same root probably (though I am not 100% sure about that).
>> The first synchronization has been added by 6ad696d2 (mm: allow memory
>> hotplug and hibernation in the same kernel) which has been later
>> replaced by the mem_hotplug_mutex - 20d6c96b (mem-hotplug: introduce
>> {un}lock_memory_hotplug()).
>> 
>> Let's remove the lock as it is not needed and it makes the code more
>> confusing.
>> 
>> Signed-off-by: Gavin Shan <shangw@linux.vnet.ibm.com>
>
>Reviewed-by: Michal Hocko <mhocko@suse.cz>
>

Thanks, Michal :-)

>> ---
>>  mm/sparse.c |   14 +-------------
>>  1 files changed, 1 insertions(+), 13 deletions(-)
>> 
>> diff --git a/mm/sparse.c b/mm/sparse.c
>> index 51950de..40b1100 100644
>> --- a/mm/sparse.c
>> +++ b/mm/sparse.c
>> @@ -77,7 +77,6 @@ static struct mem_section noinline __init_refok *sparse_index_alloc(int nid)
>>  
>>  static int __meminit sparse_index_init(unsigned long section_nr, int nid)
>>  {
>> -	static DEFINE_SPINLOCK(index_init_lock);
>>  	unsigned long root = SECTION_NR_TO_ROOT(section_nr);
>>  	struct mem_section *section;
>>  	int ret = 0;
>> @@ -88,20 +87,9 @@ static int __meminit sparse_index_init(unsigned long section_nr, int nid)
>>  	section = sparse_index_alloc(nid);
>>  	if (!section)
>>  		return -ENOMEM;
>> -	/*
>> -	 * This lock keeps two different sections from
>> -	 * reallocating for the same index
>> -	 */
>> -	spin_lock(&index_init_lock);
>> -
>> -	if (mem_section[root]) {
>> -		ret = -EEXIST;
>> -		goto out;
>> -	}
>>  
>>  	mem_section[root] = section;
>> -out:
>> -	spin_unlock(&index_init_lock);
>> +
>>  	return ret;
>>  }
>>  #else /* !SPARSEMEM_EXTREME */
>> -- 
>> 1.7.5.4
>> 
>> --
>> To unsubscribe, send a message with 'unsubscribe linux-mm' in
>> the body to majordomo@kvack.org.  For more info on Linux MM,
>> see: http://www.linux-mm.org/ .
>> Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
>
>-- 
>Michal Hocko
>SUSE Labs
>SUSE LINUX s.r.o.
>Lihovarska 1060/12
>190 00 Praha 9    
>Czech Republic
>

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

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

end of thread, other threads:[~2012-07-16  3:42 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-07-13  2:01 [PATCH v4 RESEND 1/3] mm/sparse: optimize sparse_index_alloc Gavin Shan
2012-07-13  2:01 ` [PATCH v4 RESEND 2/3] mm/sparse: more check on mem_section number Gavin Shan
2012-07-13  2:01 ` [PATCH v2 3/3] mm/sparse: remove index_init_lock Gavin Shan
2012-07-13  8:41   ` Michal Hocko
2012-07-16  3:46     ` Gavin Shan

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.