Andrew Morton <[email protected]> writes:

> On Fri, 18 Dec 2015 15:50:24 +0100 Vitaly Kuznetsov <[email protected]> 
> wrote:
>
>> Out of memory condition is not a bug and while we can't add new memory in
>> such case crashing the system seems wrong. Propagating the return value
>> from register_memory_resource() requires interface change.
>> 
>> --- a/mm/memory_hotplug.c
>> +++ b/mm/memory_hotplug.c
>> +static int register_memory_resource(u64 start, u64 size,
>> +                                struct resource **resource)
>>  {
>>      struct resource *res;
>>      res = kzalloc(sizeof(struct resource), GFP_KERNEL);
>> -    BUG_ON(!res);
>> +    if (!res)
>> +            return -ENOMEM;
>>  
>>      res->name = "System RAM";
>>      res->start = start;
>> @@ -140,9 +142,10 @@ static struct resource *register_memory_resource(u64 
>> start, u64 size)
>>      if (request_resource(&iomem_resource, res) < 0) {
>>              pr_debug("System RAM resource %pR cannot be added\n", res);
>>              kfree(res);
>> -            res = NULL;
>> +            return -EEXIST;
>>      }
>> -    return res;
>> +    *resource = res;
>> +    return 0;
>>  }
>
> Was there a reason for overwriting the request_resource() return
> value?
> Ordinarily it should be propagated back to callers.
>
> Please review.
>

This is a nice-to-have addition but it will break at least ACPI
memhotplug: request_resource() has the following:

conflict = request_resource_conflict(root, new);
return conflict ? -EBUSY : 0;

so we'll end up returning -EBUSY from register_memory_resource() and
add_memory(), at the same time acpi_memory_enable_device() counts on
-EEXIST:

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

/*
* 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)
continue;

So I see 3 options here:
1) Keep the overwrite
2) Change the request_resource() return value to -EEXIST
3) Adapt all add_memory() call sites to -EBUSY.

Please let me know your preference.

> --- 
> a/mm/memory_hotplug.c~memory-hotplug-dont-bug-in-register_memory_resource-fix
> +++ a/mm/memory_hotplug.c
> @@ -131,7 +131,9 @@ static int register_memory_resource(u64
>                                   struct resource **resource)
>  {
>       struct resource *res;
> +     int ret = 0;
>       res = kzalloc(sizeof(struct resource), GFP_KERNEL);
> +
>       if (!res)
>               return -ENOMEM;
>
> @@ -139,13 +141,14 @@ static int register_memory_resource(u64
>       res->start = start;
>       res->end = start + size - 1;
>       res->flags = IORESOURCE_MEM | IORESOURCE_BUSY;
> -     if (request_resource(&iomem_resource, res) < 0) {
> +     ret = request_resource(&iomem_resource, res);
> +     if (ret < 0) {
>               pr_debug("System RAM resource %pR cannot be added\n", res);
>               kfree(res);
> -             return -EEXIST;
> +     } else {
> +             *resource = res;
>       }
> -     *resource = res;
> -     return 0;
> +     return ret;
>  }
>
>  static void release_memory_resource(struct resource *res)
> _

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

Reply via email to