Driver core: Add mutex for adding/removing memory blocks
[firefly-linux-kernel-4.4.55.git] / drivers / base / memory.c
index 63c25601572de00c98a331cea3d82666bad90c7a..5185bcff2de91f5216decd1c4614e9f1ab123cf1 100644 (file)
@@ -27,6 +27,8 @@
 #include <asm/atomic.h>
 #include <asm/uaccess.h>
 
+static DEFINE_MUTEX(mem_sysfs_mutex);
+
 #define MEMORY_CLASS_NAME      "memory"
 
 static struct sysdev_class memory_sysdev_class = {
@@ -484,6 +486,8 @@ static int add_memory_block(int nid, struct mem_section *section,
        if (!mem)
                return -ENOMEM;
 
+       mutex_lock(&mem_sysfs_mutex);
+
        mem->phys_index = __section_nr(section);
        mem->state = state;
        mutex_init(&mem->state_mutex);
@@ -504,6 +508,7 @@ static int add_memory_block(int nid, struct mem_section *section,
                        ret = register_mem_sect_under_node(mem, nid);
        }
 
+       mutex_unlock(&mem_sysfs_mutex);
        return ret;
 }
 
@@ -512,6 +517,7 @@ int remove_memory_block(unsigned long node_id, struct mem_section *section,
 {
        struct memory_block *mem;
 
+       mutex_lock(&mem_sysfs_mutex);
        mem = find_memory_block(section);
        unregister_mem_sect_under_nodes(mem);
        mem_remove_simple_file(mem, phys_index);
@@ -520,6 +526,7 @@ int remove_memory_block(unsigned long node_id, struct mem_section *section,
        mem_remove_simple_file(mem, removable);
        unregister_memory(mem, section);
 
+       mutex_unlock(&mem_sysfs_mutex);
        return 0;
 }