diff options
author | Tejun Heo <tj@kernel.org> | 2009-08-14 15:00:50 +0900 |
---|---|---|
committer | Tejun Heo <tj@kernel.org> | 2009-08-14 15:00:50 +0900 |
commit | f58dc01ba2ca9fe3ab2ba4ca43d9c8a735cf62d8 (patch) | |
tree | 9eb76a0d6aa34e56f8650fe98a5ce26891a522ab /mm/percpu.c | |
parent | 08fc45806103e59a37418e84719b878f9bb32540 (diff) | |
download | op-kernel-dev-f58dc01ba2ca9fe3ab2ba4ca43d9c8a735cf62d8.zip op-kernel-dev-f58dc01ba2ca9fe3ab2ba4ca43d9c8a735cf62d8.tar.gz |
percpu: generalize first chunk allocator selection
Now that all first chunk allocators are in mm/percpu.c, it makes sense
to make generalize percpu_alloc kernel parameter. Define PCPU_FC_*
and set pcpu_chosen_fc using early_param() in mm/percpu.c. Arch code
can use the set value to determine which first chunk allocator to use.
Signed-off-by: Tejun Heo <tj@kernel.org>
Diffstat (limited to 'mm/percpu.c')
-rw-r--r-- | mm/percpu.c | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/mm/percpu.c b/mm/percpu.c index 7971997d..7fb40bb 100644 --- a/mm/percpu.c +++ b/mm/percpu.c @@ -1414,6 +1414,38 @@ size_t __init pcpu_setup_first_chunk(size_t static_size, size_t reserved_size, return pcpu_unit_size; } +const char *pcpu_fc_names[PCPU_FC_NR] __initdata = { + [PCPU_FC_AUTO] = "auto", + [PCPU_FC_EMBED] = "embed", + [PCPU_FC_PAGE] = "page", + [PCPU_FC_LPAGE] = "lpage", +}; + +enum pcpu_fc pcpu_chosen_fc __initdata = PCPU_FC_AUTO; + +static int __init percpu_alloc_setup(char *str) +{ + if (0) + /* nada */; +#ifdef CONFIG_NEED_PER_CPU_EMBED_FIRST_CHUNK + else if (!strcmp(str, "embed")) + pcpu_chosen_fc = PCPU_FC_EMBED; +#endif +#ifdef CONFIG_NEED_PER_CPU_PAGE_FIRST_CHUNK + else if (!strcmp(str, "page")) + pcpu_chosen_fc = PCPU_FC_PAGE; +#endif +#ifdef CONFIG_NEED_PER_CPU_LPAGE_FIRST_CHUNK + else if (!strcmp(str, "lpage")) + pcpu_chosen_fc = PCPU_FC_LPAGE; +#endif + else + pr_warning("PERCPU: unknown allocator %s specified\n", str); + + return 0; +} +early_param("percpu_alloc", percpu_alloc_setup); + static inline size_t pcpu_calc_fc_sizes(size_t static_size, size_t reserved_size, ssize_t *dyn_sizep) |