Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

mm/sparse: remove index_init_lock

sparse_index_init() uses the index_init_lock spinlock to protect root
mem_section assignment. The lock is not necessary anymore because the
function is called only during 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 was 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 was 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.

[mhocko@suse.cz: changelog]
Signed-off-by: Gavin Shan <shangw@linux.vnet.ibm.com>
Reviewed-by: Michal Hocko <mhocko@suse.cz>
Cc: Michal Hocko <mhocko@suse.cz>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

authored by

Gavin Shan and committed by
Linus Torvalds
c1c95183 db36a461

+1 -13
+1 -13
mm/sparse.c
··· 77 77 78 78 static int __meminit sparse_index_init(unsigned long section_nr, int nid) 79 79 { 80 - static DEFINE_SPINLOCK(index_init_lock); 81 80 unsigned long root = SECTION_NR_TO_ROOT(section_nr); 82 81 struct mem_section *section; 83 82 int ret = 0; ··· 87 88 section = sparse_index_alloc(nid); 88 89 if (!section) 89 90 return -ENOMEM; 90 - /* 91 - * This lock keeps two different sections from 92 - * reallocating for the same index 93 - */ 94 - spin_lock(&index_init_lock); 95 - 96 - if (mem_section[root]) { 97 - ret = -EEXIST; 98 - goto out; 99 - } 100 91 101 92 mem_section[root] = section; 102 - out: 103 - spin_unlock(&index_init_lock); 93 + 104 94 return ret; 105 95 } 106 96 #else /* !SPARSEMEM_EXTREME */