提交 5669c3cf 编写于 作者: S Stephen Rothwell 提交者: Paul Mackerras

[POWERPC] Limit range of __init_ref_ok somewhat

This patch introduces zalloc_maybe_bootmem and uses it so that we don't
have to mark a whole (largish) routine as __init_ref_ok.
Signed-off-by: NStephen Rothwell <sfr@canb.auug.org.au>
Signed-off-by: NPaul Mackerras <paulus@samba.org>
上级 88de3cab
...@@ -424,7 +424,7 @@ static int default_irq_host_match(struct irq_host *h, struct device_node *np) ...@@ -424,7 +424,7 @@ static int default_irq_host_match(struct irq_host *h, struct device_node *np)
return h->of_node != NULL && h->of_node == np; return h->of_node != NULL && h->of_node == np;
} }
__init_refok struct irq_host *irq_alloc_host(struct device_node *of_node, struct irq_host *irq_alloc_host(struct device_node *of_node,
unsigned int revmap_type, unsigned int revmap_type,
unsigned int revmap_arg, unsigned int revmap_arg,
struct irq_host_ops *ops, struct irq_host_ops *ops,
...@@ -439,13 +439,7 @@ __init_refok struct irq_host *irq_alloc_host(struct device_node *of_node, ...@@ -439,13 +439,7 @@ __init_refok struct irq_host *irq_alloc_host(struct device_node *of_node,
/* Allocate structure and revmap table if using linear mapping */ /* Allocate structure and revmap table if using linear mapping */
if (revmap_type == IRQ_HOST_MAP_LINEAR) if (revmap_type == IRQ_HOST_MAP_LINEAR)
size += revmap_arg * sizeof(unsigned int); size += revmap_arg * sizeof(unsigned int);
if (mem_init_done) host = zalloc_maybe_bootmem(size, GFP_KERNEL);
host = kzalloc(size, GFP_KERNEL);
else {
host = alloc_bootmem(size);
if (host)
memset(host, 0, size);
}
if (host == NULL) if (host == NULL)
return NULL; return NULL;
......
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
#include <linux/init.h> #include <linux/init.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/bootmem.h> #include <linux/bootmem.h>
#include <linux/string.h>
#include <asm/system.h> #include <asm/system.h>
...@@ -12,3 +13,17 @@ void * __init_refok alloc_maybe_bootmem(size_t size, gfp_t mask) ...@@ -12,3 +13,17 @@ void * __init_refok alloc_maybe_bootmem(size_t size, gfp_t mask)
else else
return alloc_bootmem(size); return alloc_bootmem(size);
} }
void * __init_refok zalloc_maybe_bootmem(size_t size, gfp_t mask)
{
void *p;
if (mem_init_done)
p = kzalloc(size, mask);
else {
p = alloc_bootmem(size);
if (p)
memset(p, 0, size);
}
return p;
}
...@@ -190,6 +190,7 @@ extern unsigned long memory_limit; ...@@ -190,6 +190,7 @@ extern unsigned long memory_limit;
extern unsigned long klimit; extern unsigned long klimit;
extern void *alloc_maybe_bootmem(size_t size, gfp_t mask); extern void *alloc_maybe_bootmem(size_t size, gfp_t mask);
extern void *zalloc_maybe_bootmem(size_t size, gfp_t mask);
extern int powersave_nap; /* set if nap mode can be used in idle loop */ extern int powersave_nap; /* set if nap mode can be used in idle loop */
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册