Messages in this thread Patch in this message |  | | | Date | Wed, 25 Aug 2010 09:07:07 -0500 (CDT) | | From | Christoph Lameter <> | | Subject | Re: linux-next: build failure after merge of the final tree (slab tree related) |
| |
On Wed, 25 Aug 2010, Pekka Enberg wrote:
> I dropped slub cleanups from -next until we've resolved the UP boot time crash > problem. >
It works here with this patch. I'd rather see a general solution so that we can use allocpercpu for bootstrapping any allocator without such special bandaids.
Subject: Slub: UP bandaid
Since the percpu allocator does not provide early allocation in UP mode (only in SMP configurations) use __get_free_page() to improvise a compound page allocation that can be later freed via kfree().
Compound pages will be released when the cpu caches are resized.
Signed-off-by: Christoph Lameter <cl@linux.com>
--- mm/slub.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) Index: linux-2.6/mm/slub.c =================================================================== --- linux-2.6.orig/mm/slub.c 2010-08-24 20:07:12.766010774 -0500 +++ linux-2.6/mm/slub.c 2010-08-24 20:15:46.304130417 -0500 @@ -2064,8 +2064,24 @@
static inline int alloc_kmem_cache_cpus(struct kmem_cache *s) { +#ifdef CONFIG_SMP + /* + * Will use reserve that does not require slab operation during + * early boot. + */ BUILD_BUG_ON(PERCPU_DYNAMIC_EARLY_SIZE < SLUB_PAGE_SHIFT * sizeof(struct kmem_cache_cpu)); +#else + /* + * Special hack for UP mode. allocpercpu() falls back to kmalloc + * operations. So we cannot use that before the slab allocator is up + * Simply get the smallest possible compound page. The page will be + * released via kfree() when the cpu caches are resized later. + */ + if (slab_state < UP) + s->cpu_slab = (__percpu void *)__get_free_page(GFP_NOWAIT, 1); + else +#endif
s->cpu_slab = alloc_percpu(struct kmem_cache_cpu);
|  |