mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-10-03 07:38:10 +00:00
Merge branch 'for-3.4-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/percpu
Pull two percpu fixes from Tejun Heo: "One adds missing KERN_CONT on split printk()s and the other makes the percpu allocator avoid using PMD_SIZE as atom_size on x86_32. Using PMD_SIZE led to vmalloc area exhaustion on certain configurations (x86_32 android) and the only cost of using PAGE_SIZE instead is static percpu area not being aligned to large page mapping." * 'for-3.4-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/percpu: percpu, x86: don't use PMD_SIZE as embedded atom_size on 32bit percpu: use KERN_CONT in pcpu_dump_alloc_info()
This commit is contained in:
commit
e9b19cd43f
2 changed files with 18 additions and 6 deletions
|
@ -185,10 +185,22 @@ void __init setup_per_cpu_areas(void)
|
||||||
#endif
|
#endif
|
||||||
rc = -EINVAL;
|
rc = -EINVAL;
|
||||||
if (pcpu_chosen_fc != PCPU_FC_PAGE) {
|
if (pcpu_chosen_fc != PCPU_FC_PAGE) {
|
||||||
const size_t atom_size = cpu_has_pse ? PMD_SIZE : PAGE_SIZE;
|
|
||||||
const size_t dyn_size = PERCPU_MODULE_RESERVE +
|
const size_t dyn_size = PERCPU_MODULE_RESERVE +
|
||||||
PERCPU_DYNAMIC_RESERVE - PERCPU_FIRST_CHUNK_RESERVE;
|
PERCPU_DYNAMIC_RESERVE - PERCPU_FIRST_CHUNK_RESERVE;
|
||||||
|
size_t atom_size;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* On 64bit, use PMD_SIZE for atom_size so that embedded
|
||||||
|
* percpu areas are aligned to PMD. This, in the future,
|
||||||
|
* can also allow using PMD mappings in vmalloc area. Use
|
||||||
|
* PAGE_SIZE on 32bit as vmalloc space is highly contended
|
||||||
|
* and large vmalloc area allocs can easily fail.
|
||||||
|
*/
|
||||||
|
#ifdef CONFIG_X86_64
|
||||||
|
atom_size = PMD_SIZE;
|
||||||
|
#else
|
||||||
|
atom_size = PAGE_SIZE;
|
||||||
|
#endif
|
||||||
rc = pcpu_embed_first_chunk(PERCPU_FIRST_CHUNK_RESERVE,
|
rc = pcpu_embed_first_chunk(PERCPU_FIRST_CHUNK_RESERVE,
|
||||||
dyn_size, atom_size,
|
dyn_size, atom_size,
|
||||||
pcpu_cpu_distance,
|
pcpu_cpu_distance,
|
||||||
|
|
10
mm/percpu.c
10
mm/percpu.c
|
@ -1132,20 +1132,20 @@ static void pcpu_dump_alloc_info(const char *lvl,
|
||||||
for (alloc_end += gi->nr_units / upa;
|
for (alloc_end += gi->nr_units / upa;
|
||||||
alloc < alloc_end; alloc++) {
|
alloc < alloc_end; alloc++) {
|
||||||
if (!(alloc % apl)) {
|
if (!(alloc % apl)) {
|
||||||
printk("\n");
|
printk(KERN_CONT "\n");
|
||||||
printk("%spcpu-alloc: ", lvl);
|
printk("%spcpu-alloc: ", lvl);
|
||||||
}
|
}
|
||||||
printk("[%0*d] ", group_width, group);
|
printk(KERN_CONT "[%0*d] ", group_width, group);
|
||||||
|
|
||||||
for (unit_end += upa; unit < unit_end; unit++)
|
for (unit_end += upa; unit < unit_end; unit++)
|
||||||
if (gi->cpu_map[unit] != NR_CPUS)
|
if (gi->cpu_map[unit] != NR_CPUS)
|
||||||
printk("%0*d ", cpu_width,
|
printk(KERN_CONT "%0*d ", cpu_width,
|
||||||
gi->cpu_map[unit]);
|
gi->cpu_map[unit]);
|
||||||
else
|
else
|
||||||
printk("%s ", empty_str);
|
printk(KERN_CONT "%s ", empty_str);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
printk("\n");
|
printk(KERN_CONT "\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Reference in a new issue