Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 336686
b: refs/heads/master
c: 6547947
h: refs/heads/master
v: v3
  • Loading branch information
Wen Congyang authored and Rafael J. Wysocki committed Nov 16, 2012
1 parent c7870aa commit 9ed523e
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 10 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: e0b7b24dd9559fcda0f8bfd6acbcad81682c4fdd
refs/heads/master: 65479472571fbf91502b7854be45ec0026b5229e
42 changes: 33 additions & 9 deletions trunk/drivers/acpi/acpi_memhotplug.c
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,7 @@ struct acpi_memory_info {
unsigned short caching; /* memory cache attribute */
unsigned short write_protect; /* memory read/write attribute */
unsigned int enabled:1;
unsigned int failed:1;
};

struct acpi_memory_device {
Expand Down Expand Up @@ -257,9 +258,23 @@ static int acpi_memory_enable_device(struct acpi_memory_device *mem_device)
node = memory_add_physaddr_to_nid(info->start_addr);

result = add_memory(node, info->start_addr, info->length);
if (result)

/*
* If the memory block has been used by the kernel, add_memory()
* returns -EEXIST. If add_memory() returns the other error, it
* means that this memory block is not used by the kernel.
*/
if (result && result != -EEXIST) {
info->failed = 1;
continue;
info->enabled = 1;
}

if (!result)
info->enabled = 1;
/*
* Add num_enable even if add_memory() returns -EEXIST, so the
* device is bound to this driver.
*/
num_enabled++;
}
if (!num_enabled) {
Expand All @@ -280,21 +295,30 @@ 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;
int result = 0;
struct acpi_memory_info *info, *n;

list_for_each_entry_safe(info, n, &mem_device->res_list, list) {
if (info->enabled) {
result = remove_memory(info->start_addr, info->length);
if (result)
return result;
}
if (info->failed)
/* The kernel does not use this memory block */
continue;

if (!info->enabled)
/*
* The kernel uses this memory block, but it may be not
* managed by us.
*/
return -EBUSY;

result = remove_memory(info->start_addr, info->length);
if (result)
return result;

list_del(&info->list);
kfree(info);
}

return 0;
return result;
}

static void acpi_memory_device_notify(acpi_handle handle, u32 event, void *data)
Expand Down

0 comments on commit 9ed523e

Please sign in to comment.