Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 356523
b: refs/heads/master
c: 60a5a19
h: refs/heads/master
i:
  356521: a802c3e
  356519: 257083a
v: v3
  • Loading branch information
Tang Chen authored and Linus Torvalds committed Feb 24, 2013
1 parent 4d280bd commit 8f220b3
Show file tree
Hide file tree
Showing 4 changed files with 64 additions and 6 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: 815121d2b5cd56f1757d4468dc3abadd06a0ed6b
refs/heads/master: 60a5a19e7419ba0bc22ed01b3285e8940b42944c
8 changes: 6 additions & 2 deletions trunk/drivers/acpi/acpi_memhotplug.c
Original file line number Diff line number Diff line change
Expand Up @@ -280,9 +280,11 @@ static int acpi_memory_enable_device(struct acpi_memory_device *mem_device)

static int acpi_memory_remove_memory(struct acpi_memory_device *mem_device)
{
int result = 0;
int result = 0, nid;
struct acpi_memory_info *info, *n;

nid = acpi_get_node(mem_device->device->handle);

list_for_each_entry_safe(info, n, &mem_device->res_list, list) {
if (info->failed)
/* The kernel does not use this memory block */
Expand All @@ -295,7 +297,9 @@ static int acpi_memory_remove_memory(struct acpi_memory_device *mem_device)
*/
return -EBUSY;

result = remove_memory(info->start_addr, info->length);
if (nid < 0)
nid = memory_add_physaddr_to_nid(info->start_addr);
result = remove_memory(nid, info->start_addr, info->length);
if (result)
return result;

Expand Down
2 changes: 1 addition & 1 deletion trunk/include/linux/memory_hotplug.h
Original file line number Diff line number Diff line change
Expand Up @@ -248,7 +248,7 @@ extern int arch_add_memory(int nid, u64 start, u64 size);
extern int offline_pages(unsigned long start_pfn, unsigned long nr_pages);
extern int offline_memory_block(struct memory_block *mem);
extern bool is_memblock_offlined(struct memory_block *mem);
extern int remove_memory(u64 start, u64 size);
extern int remove_memory(int nid, u64 start, u64 size);
extern int sparse_add_one_section(struct zone *zone, unsigned long start_pfn,
int nr_pages);
extern void sparse_remove_one_section(struct zone *zone, struct mem_section *ms);
Expand Down
58 changes: 56 additions & 2 deletions trunk/mm/memory_hotplug.c
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
#include <linux/suspend.h>
#include <linux/mm_inline.h>
#include <linux/firmware-map.h>
#include <linux/stop_machine.h>

#include <asm/tlbflush.h>

Expand Down Expand Up @@ -1679,7 +1680,58 @@ static int is_memblock_offlined_cb(struct memory_block *mem, void *arg)
return ret;
}

int __ref remove_memory(u64 start, u64 size)
static int check_cpu_on_node(void *data)
{
struct pglist_data *pgdat = data;
int cpu;

for_each_present_cpu(cpu) {
if (cpu_to_node(cpu) == pgdat->node_id)
/*
* the cpu on this node isn't removed, and we can't
* offline this node.
*/
return -EBUSY;
}

return 0;
}

/* offline the node if all memory sections of this node are removed */
static void try_offline_node(int nid)
{
unsigned long start_pfn = NODE_DATA(nid)->node_start_pfn;
unsigned long end_pfn = start_pfn + NODE_DATA(nid)->node_spanned_pages;
unsigned long pfn;

for (pfn = start_pfn; pfn < end_pfn; pfn += PAGES_PER_SECTION) {
unsigned long section_nr = pfn_to_section_nr(pfn);

if (!present_section_nr(section_nr))
continue;

if (pfn_to_nid(pfn) != nid)
continue;

/*
* some memory sections of this node are not removed, and we
* can't offline node now.
*/
return;
}

if (stop_machine(check_cpu_on_node, NODE_DATA(nid), NULL))
return;

/*
* all memory/cpu of this node are removed, we can offline this
* node now.
*/
node_set_offline(nid);
unregister_one_node(nid);
}

int __ref remove_memory(int nid, u64 start, u64 size)
{
unsigned long start_pfn, end_pfn;
int ret = 0;
Expand Down Expand Up @@ -1734,6 +1786,8 @@ int __ref remove_memory(u64 start, u64 size)

arch_remove_memory(start, size);

try_offline_node(nid);

unlock_memory_hotplug();

return 0;
Expand All @@ -1743,7 +1797,7 @@ int offline_pages(unsigned long start_pfn, unsigned long nr_pages)
{
return -EINVAL;
}
int remove_memory(u64 start, u64 size)
int remove_memory(int nid, u64 start, u64 size)
{
return -EINVAL;
}
Expand Down

0 comments on commit 8f220b3

Please sign in to comment.