Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 235466
b: refs/heads/master
c: d336016
h: refs/heads/master
v: v3
  • Loading branch information
Nathan Fontenot authored and Greg Kroah-Hartman committed Feb 4, 2011
1 parent ee24aeb commit 51f4060
Show file tree
Hide file tree
Showing 5 changed files with 46 additions and 18 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 0c2c99b1b8ab5d294f176d631e945ebdefcce4cd
refs/heads/master: d33601644cd3b09afb2edd9474517edc441c8fad
41 changes: 31 additions & 10 deletions trunk/drivers/base/memory.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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);
}

/*
Expand All @@ -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);
}

Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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);
Expand Down
12 changes: 8 additions & 4 deletions trunk/drivers/base/node.c
Original file line number Diff line number Diff line change
Expand Up @@ -375,8 +375,10 @@ int register_mem_sect_under_node(struct memory_block *mem_blk, int nid)
return -EFAULT;
if (!node_online(nid))
return 0;
sect_start_pfn = section_nr_to_pfn(mem_blk->phys_index);
sect_end_pfn = sect_start_pfn + PAGES_PER_SECTION - 1;

sect_start_pfn = section_nr_to_pfn(mem_blk->start_section_nr);
sect_end_pfn = section_nr_to_pfn(mem_blk->end_section_nr);
sect_end_pfn += PAGES_PER_SECTION - 1;
for (pfn = sect_start_pfn; pfn <= sect_end_pfn; pfn++) {
int page_nid;

Expand All @@ -400,7 +402,8 @@ int register_mem_sect_under_node(struct memory_block *mem_blk, int nid)
}

/* unregister memory section under all nodes that it spans */
int unregister_mem_sect_under_nodes(struct memory_block *mem_blk)
int unregister_mem_sect_under_nodes(struct memory_block *mem_blk,
unsigned long phys_index)
{
NODEMASK_ALLOC(nodemask_t, unlinked_nodes, GFP_KERNEL);
unsigned long pfn, sect_start_pfn, sect_end_pfn;
Expand All @@ -412,7 +415,8 @@ int unregister_mem_sect_under_nodes(struct memory_block *mem_blk)
if (!unlinked_nodes)
return -ENOMEM;
nodes_clear(*unlinked_nodes);
sect_start_pfn = section_nr_to_pfn(mem_blk->phys_index);

sect_start_pfn = section_nr_to_pfn(phys_index);
sect_end_pfn = sect_start_pfn + PAGES_PER_SECTION - 1;
for (pfn = sect_start_pfn; pfn <= sect_end_pfn; pfn++) {
int nid;
Expand Down
3 changes: 2 additions & 1 deletion trunk/include/linux/memory.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,8 @@
#include <linux/mutex.h>

struct memory_block {
unsigned long phys_index;
unsigned long start_section_nr;
unsigned long end_section_nr;
unsigned long state;
int section_count;

Expand Down
6 changes: 4 additions & 2 deletions trunk/include/linux/node.h
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,8 @@ extern int register_cpu_under_node(unsigned int cpu, unsigned int nid);
extern int unregister_cpu_under_node(unsigned int cpu, unsigned int nid);
extern int register_mem_sect_under_node(struct memory_block *mem_blk,
int nid);
extern int unregister_mem_sect_under_nodes(struct memory_block *mem_blk);
extern int unregister_mem_sect_under_nodes(struct memory_block *mem_blk,
unsigned long phys_index);

#ifdef CONFIG_HUGETLBFS
extern void register_hugetlbfs_with_node(node_registration_func_t doregister,
Expand Down Expand Up @@ -67,7 +68,8 @@ static inline int register_mem_sect_under_node(struct memory_block *mem_blk,
{
return 0;
}
static inline int unregister_mem_sect_under_nodes(struct memory_block *mem_blk)
static inline int unregister_mem_sect_under_nodes(struct memory_block *mem_blk,
unsigned long phys_index)
{
return 0;
}
Expand Down

0 comments on commit 51f4060

Please sign in to comment.