Login | Register For Free | Help
Search for: (Advanced)

Mailing List Archive: Linux: Kernel

[PATCH 4/8] donot allow to eject the memory device if it is being used

 

 

Linux kernel RSS feed   Index | Next | Previous | View Threaded


wency at cn

Jun 26, 2012, 2:20 AM

Post #1 of 3 (56 views)
Permalink
[PATCH 4/8] donot allow to eject the memory device if it is being used

We eject the memory device even if it is in use. It is very dangerous,
and it will cause the kernel panicked.

Signed-off-by: Wen Congyang <wency [at] cn>
---
drivers/acpi/acpi_memhotplug.c | 34 +++++++++++++++++++++++++++-------
1 files changed, 27 insertions(+), 7 deletions(-)

diff --git a/drivers/acpi/acpi_memhotplug.c b/drivers/acpi/acpi_memhotplug.c
index a325bb9..2e5d5ab 100644
--- a/drivers/acpi/acpi_memhotplug.c
+++ b/drivers/acpi/acpi_memhotplug.c
@@ -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 {
@@ -251,9 +252,19 @@ 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;
num_enabled++;
}
if (!num_enabled) {
@@ -317,11 +328,20 @@ static int acpi_memory_disable_device(struct acpi_memory_device *mem_device)
* Note: Assume that this function returns zero on success
*/
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);
}
--
1.7.1

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo [at] vger
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/


rientjes at google

Jun 26, 2012, 9:21 PM

Post #2 of 3 (43 views)
Permalink
Re: [PATCH 4/8] donot allow to eject the memory device if it is being used [In reply to]

On Tue, 26 Jun 2012, Wen Congyang wrote:

> diff --git a/drivers/acpi/acpi_memhotplug.c b/drivers/acpi/acpi_memhotplug.c
> index a325bb9..2e5d5ab 100644
> --- a/drivers/acpi/acpi_memhotplug.c
> +++ b/drivers/acpi/acpi_memhotplug.c
> @@ -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 {
> @@ -251,9 +252,19 @@ 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;
> num_enabled++;
> }
> if (!num_enabled) {

num_enabled should only be incremented for result == 0.
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo [at] vger
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/


wency at cn

Jun 27, 2012, 7:01 PM

Post #3 of 3 (40 views)
Permalink
Re: [PATCH 4/8] donot allow to eject the memory device if it is being used [In reply to]

At 06/27/2012 12:21 PM, David Rientjes Wrote:
> On Tue, 26 Jun 2012, Wen Congyang wrote:
>
>> diff --git a/drivers/acpi/acpi_memhotplug.c b/drivers/acpi/acpi_memhotplug.c
>> index a325bb9..2e5d5ab 100644
>> --- a/drivers/acpi/acpi_memhotplug.c
>> +++ b/drivers/acpi/acpi_memhotplug.c
>> @@ -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 {
>> @@ -251,9 +252,19 @@ 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;
>> num_enabled++;
>> }
>> if (!num_enabled) {
>
> num_enabled should only be incremented for result == 0.
>

If num_enabled is not incremented for result == -EEXIST, this device is not
managed by this module, and it is not able to be hot removed. Another problem
is the user will see a strange message: add_memory failed

Thanks
Wen Congyang
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo [at] vger
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/

Linux kernel RSS feed   Index | Next | Previous | View Threaded
 
 


Interested in having your list archived? Contact Gossamer Threads
 
  Web Applications & Managed Hosting Powered by Gossamer Threads Inc.