|
@@ -97,7 +97,7 @@ int register_memory(struct memory_block *memory)
|
|
|
int error;
|
|
|
|
|
|
memory->sysdev.cls = &memory_sysdev_class;
|
|
|
- memory->sysdev.id = memory->phys_index / sections_per_block;
|
|
|
+ memory->sysdev.id = memory->start_section_nr / sections_per_block;
|
|
|
|
|
|
error = sysdev_register(&memory->sysdev);
|
|
|
return error;
|
|
@@ -138,12 +138,26 @@ static unsigned long get_memory_block_size(void)
|
|
|
* uses.
|
|
|
*/
|
|
|
|
|
|
-static ssize_t show_mem_phys_index(struct sys_device *dev,
|
|
|
+static ssize_t show_mem_start_phys_index(struct sys_device *dev,
|
|
|
struct sysdev_attribute *attr, char *buf)
|
|
|
{
|
|
|
struct memory_block *mem =
|
|
|
container_of(dev, struct memory_block, sysdev);
|
|
|
- return sprintf(buf, "%08lx\n", mem->phys_index / sections_per_block);
|
|
|
+ unsigned long phys_index;
|
|
|
+
|
|
|
+ phys_index = mem->start_section_nr / sections_per_block;
|
|
|
+ return sprintf(buf, "%08lx\n", phys_index);
|
|
|
+}
|
|
|
+
|
|
|
+static ssize_t show_mem_end_phys_index(struct sys_device *dev,
|
|
|
+ struct sysdev_attribute *attr, char *buf)
|
|
|
+{
|
|
|
+ struct memory_block *mem =
|
|
|
+ container_of(dev, struct memory_block, sysdev);
|
|
|
+ unsigned long phys_index;
|
|
|
+
|
|
|
+ phys_index = mem->end_section_nr / sections_per_block;
|
|
|
+ return sprintf(buf, "%08lx\n", phys_index);
|
|
|
}
|
|
|
|
|
|
/*
|
|
@@ -158,7 +172,7 @@ static ssize_t show_mem_removable(struct sys_device *dev,
|
|
|
container_of(dev, struct memory_block, sysdev);
|
|
|
|
|
|
for (i = 0; i < sections_per_block; i++) {
|
|
|
- pfn = section_nr_to_pfn(mem->phys_index + i);
|
|
|
+ pfn = section_nr_to_pfn(mem->start_section_nr + i);
|
|
|
ret &= is_mem_section_removable(pfn, PAGES_PER_SECTION);
|
|
|
}
|
|
|
|
|
@@ -275,14 +289,15 @@ static int memory_block_change_state(struct memory_block *mem,
|
|
|
mem->state = MEM_GOING_OFFLINE;
|
|
|
|
|
|
for (i = 0; i < sections_per_block; i++) {
|
|
|
- ret = memory_section_action(mem->phys_index + i, to_state);
|
|
|
+ ret = memory_section_action(mem->start_section_nr + i,
|
|
|
+ to_state);
|
|
|
if (ret)
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
if (ret) {
|
|
|
for (i = 0; i < sections_per_block; i++)
|
|
|
- memory_section_action(mem->phys_index + i,
|
|
|
+ memory_section_action(mem->start_section_nr + i,
|
|
|
from_state_req);
|
|
|
|
|
|
mem->state = from_state_req;
|
|
@@ -330,7 +345,8 @@ static ssize_t show_phys_device(struct sys_device *dev,
|
|
|
return sprintf(buf, "%d\n", mem->phys_device);
|
|
|
}
|
|
|
|
|
|
-static SYSDEV_ATTR(phys_index, 0444, show_mem_phys_index, NULL);
|
|
|
+static SYSDEV_ATTR(phys_index, 0444, show_mem_start_phys_index, NULL);
|
|
|
+static SYSDEV_ATTR(end_phys_index, 0444, show_mem_end_phys_index, NULL);
|
|
|
static SYSDEV_ATTR(state, 0644, show_mem_state, store_mem_state);
|
|
|
static SYSDEV_ATTR(phys_device, 0444, show_phys_device, NULL);
|
|
|
static SYSDEV_ATTR(removable, 0444, show_mem_removable, NULL);
|
|
@@ -522,16 +538,20 @@ static int init_memory_block(struct memory_block **memory,
|
|
|
return -ENOMEM;
|
|
|
|
|
|
scn_nr = __section_nr(section);
|
|
|
- mem->phys_index = base_memory_block_id(scn_nr) * sections_per_block;
|
|
|
+ mem->start_section_nr =
|
|
|
+ base_memory_block_id(scn_nr) * sections_per_block;
|
|
|
+ mem->end_section_nr = mem->start_section_nr + sections_per_block - 1;
|
|
|
mem->state = state;
|
|
|
mem->section_count++;
|
|
|
mutex_init(&mem->state_mutex);
|
|
|
- start_pfn = section_nr_to_pfn(mem->phys_index);
|
|
|
+ start_pfn = section_nr_to_pfn(mem->start_section_nr);
|
|
|
mem->phys_device = arch_get_memory_phys_device(start_pfn);
|
|
|
|
|
|
ret = register_memory(mem);
|
|
|
if (!ret)
|
|
|
ret = mem_create_simple_file(mem, phys_index);
|
|
|
+ if (!ret)
|
|
|
+ ret = mem_create_simple_file(mem, end_phys_index);
|
|
|
if (!ret)
|
|
|
ret = mem_create_simple_file(mem, state);
|
|
|
if (!ret)
|
|
@@ -575,11 +595,12 @@ int remove_memory_block(unsigned long node_id, struct mem_section *section,
|
|
|
|
|
|
mutex_lock(&mem_sysfs_mutex);
|
|
|
mem = find_memory_block(section);
|
|
|
+ unregister_mem_sect_under_nodes(mem, __section_nr(section));
|
|
|
|
|
|
mem->section_count--;
|
|
|
if (mem->section_count == 0) {
|
|
|
- unregister_mem_sect_under_nodes(mem);
|
|
|
mem_remove_simple_file(mem, phys_index);
|
|
|
+ mem_remove_simple_file(mem, end_phys_index);
|
|
|
mem_remove_simple_file(mem, state);
|
|
|
mem_remove_simple_file(mem, phys_device);
|
|
|
mem_remove_simple_file(mem, removable);
|