diff options
author | Andrew Morton <akpm@linux-foundation.org> | 2013-04-18 09:47:12 +1000 |
---|---|---|
committer | Stephen Rothwell <sfr@canb.auug.org.au> | 2013-04-24 17:25:29 +1000 |
commit | 41310218c9ce23c03c38ab7e66ea5da2f57d769c (patch) | |
tree | 06fc0cb869efbb4dbbe53d49a4ba7e9872da5977 /kernel | |
parent | 193e23dc9ad22f2c25a961ed6a82b87b26e0df08 (diff) |
resource-add-release_mem_region_adjustable-fix-fix
switch back to GFP_KERNEL, less buggily
Cc: David Rientjes <rientjes@google.com>
Cc: Jiang Liu <jiang.liu@huawei.com>
Cc: Ram Pai <linuxram@us.ibm.com>
Cc: T Makphaibulchoke <tmac@hp.com>
Cc: Tang Chen <tangchen@cn.fujitsu.com>
Cc: Toshi Kani <toshi.kani@hp.com>
Cc: Wen Congyang <wency@cn.fujitsu.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/resource.c | 29 |
1 files changed, 17 insertions, 12 deletions
diff --git a/kernel/resource.c b/kernel/resource.c index c7ca8f323e6b..1c51cc64bcca 100644 --- a/kernel/resource.c +++ b/kernel/resource.c @@ -1046,7 +1046,8 @@ int release_mem_region_adjustable(struct resource *parent, resource_size_t start, resource_size_t size) { struct resource **p; - struct resource *res, *new; + struct resource *res; + struct resource *new_res; resource_size_t end; int ret = -EINVAL; @@ -1054,6 +1055,9 @@ int release_mem_region_adjustable(struct resource *parent, if ((start < parent->start) || (end > parent->end)) return ret; + /* The kzalloc() result gets checked later */ + new_res = kzalloc(sizeof(struct resource), GFP_KERNEL); + p = &parent->child; write_lock(&resource_lock); @@ -1091,32 +1095,33 @@ int release_mem_region_adjustable(struct resource *parent, start - res->start); } else { /* split into two entries */ - new = kzalloc(sizeof(struct resource), GFP_ATOMIC); - if (!new) { + if (!new_res) { ret = -ENOMEM; break; } - new->name = res->name; - new->start = end + 1; - new->end = res->end; - new->flags = res->flags; - new->parent = res->parent; - new->sibling = res->sibling; - new->child = NULL; + new_res->name = res->name; + new_res->start = end + 1; + new_res->end = res->end; + new_res->flags = res->flags; + new_res->parent = res->parent; + new_res->sibling = res->sibling; + new_res->child = NULL; ret = __adjust_resource(res, res->start, start - res->start); if (ret) { - kfree(new); + kfree(new_res); break; } - res->sibling = new; + res->sibling = new_res; + new_res = NULL; } break; } write_unlock(&resource_lock); + kfree(new_res); return ret; } #endif /* CONFIG_MEMORY_HOTPLUG */ |