aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/base
diff options
context:
space:
mode:
authorNathan Fontenot <nfont@austin.ibm.com>2010-10-19 13:45:24 -0400
committerGreg Kroah-Hartman <gregkh@suse.de>2010-10-22 13:16:44 -0400
commit2938ffbd466d2811a6012609684a2298eef35065 (patch)
tree3d4d0209d71481e329eb68f0d82afe585b6a5da2 /drivers/base
parente4619c857d1d769b1172a75ba6b6ebd1186a9c58 (diff)
Driver core: Add mutex for adding/removing memory blocks
Add a new mutex for use in adding and removing of memory blocks. This is needed to avoid any race conditions in which the same memory block could be added and removed at the same time. Signed-off-by: Nathan Fontenot <nfont@austin.ibm.com> Reviewed-by: Robin Holt <holt@sgi.com> Reviewed-By: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/base')
-rw-r--r--drivers/base/memory.c7
1 files changed, 7 insertions, 0 deletions
diff --git a/drivers/base/memory.c b/drivers/base/memory.c
index 63c25601572..5185bcff2de 100644
--- a/drivers/base/memory.c
+++ b/drivers/base/memory.c
@@ -27,6 +27,8 @@
27#include <asm/atomic.h> 27#include <asm/atomic.h>
28#include <asm/uaccess.h> 28#include <asm/uaccess.h>
29 29
30static DEFINE_MUTEX(mem_sysfs_mutex);
31
30#define MEMORY_CLASS_NAME "memory" 32#define MEMORY_CLASS_NAME "memory"
31 33
32static struct sysdev_class memory_sysdev_class = { 34static struct sysdev_class memory_sysdev_class = {
@@ -484,6 +486,8 @@ static int add_memory_block(int nid, struct mem_section *section,
484 if (!mem) 486 if (!mem)
485 return -ENOMEM; 487 return -ENOMEM;
486 488
489 mutex_lock(&mem_sysfs_mutex);
490
487 mem->phys_index = __section_nr(section); 491 mem->phys_index = __section_nr(section);
488 mem->state = state; 492 mem->state = state;
489 mutex_init(&mem->state_mutex); 493 mutex_init(&mem->state_mutex);
@@ -504,6 +508,7 @@ static int add_memory_block(int nid, struct mem_section *section,
504 ret = register_mem_sect_under_node(mem, nid); 508 ret = register_mem_sect_under_node(mem, nid);
505 } 509 }
506 510
511 mutex_unlock(&mem_sysfs_mutex);
507 return ret; 512 return ret;
508} 513}
509 514
@@ -512,6 +517,7 @@ int remove_memory_block(unsigned long node_id, struct mem_section *section,
512{ 517{
513 struct memory_block *mem; 518 struct memory_block *mem;
514 519
520 mutex_lock(&mem_sysfs_mutex);
515 mem = find_memory_block(section); 521 mem = find_memory_block(section);
516 unregister_mem_sect_under_nodes(mem); 522 unregister_mem_sect_under_nodes(mem);
517 mem_remove_simple_file(mem, phys_index); 523 mem_remove_simple_file(mem, phys_index);
@@ -520,6 +526,7 @@ int remove_memory_block(unsigned long node_id, struct mem_section *section,
520 mem_remove_simple_file(mem, removable); 526 mem_remove_simple_file(mem, removable);
521 unregister_memory(mem, section); 527 unregister_memory(mem, section);
522 528
529 mutex_unlock(&mem_sysfs_mutex);
523 return 0; 530 return 0;
524} 531}
525 532