Messages in this thread | | | Date | Thu, 2 Jul 2015 11:57:15 +0800 | Subject | Re: commit 4066c33d0308f8 breaks booting under KVM | From | Gavin Guo <> |
| |
On Mon, Jun 29, 2015 at 10:01 PM, Christoph Lameter <cl@linux.com> wrote: > > On Fri, 26 Jun 2015, Linus Torvalds wrote: > > > Does reverting it fix everything? I'll give people another day or so to see > > if they can see what's wrong, but I guess I'll just revert if no fix end up > > being forthcoming.. > > Reversion will only affect a special slub debug kernel option and we have > run without the static names for years. So ok to revert. > > > the problem here is the sequencing of SLAB bootstrap. SLAB bootstrap > requires certain kmalloc caches to be initialized in a specific sequence > and that has always caused fragility. Slab cache creation may > generate a "off slab" configuration which means a kmem_cache > will then refer to a kmem_cache from the kmalloc array that may not be > there. > > Gavin: Please check your logic here. The two small caches are not always > created and they often lead to off slab configurations. It depends on the > minimum aligment required by the architecture. These also need to be > created in the proper sequence. > > Note that you removed the comment that said: > > /* > - * Caches that are not of the two-to-the-power-of size. > - * These have to be created immediately after the > - * earlier power of two caches > + * "i == 2" is the "kmalloc-192" case which is the last special > + * case for initialization and it's the point to jump to > > The modification you have made does create the non power of two caches not > in sequence anymore but before all others! > > Here is the new code. > > void __init create_kmalloc_caches(unsigned long flags) > { > int i; > > for (i = KMALLOC_LOOP_LOW; i <= KMALLOC_SHIFT_HIGH; i++) { > if (!kmalloc_caches[i]) { > kmalloc_caches[i] = create_kmalloc_cache( > kmalloc_info[i].name, > kmalloc_info[i].size, > flags); > } > > /* > * "i == 2" is the "kmalloc-192" case which is the last special > * case for initialization and it's the point to jump to > * allocate the minimize size of the object. In slab allocator, > * the KMALLOC_SHIFT_LOW = 5. So, it needs to skip 2^3 and 2^4 > * and go straight to allocate 2^5. If the ARCH_DMA_MINALIGN is > * defined, it may be larger than 2^5 and here is also the > * trick to skip the empty gap. > */ > if (i == 2) > i = (KMALLOC_SHIFT_LOW - 1); > }
Sorry, it's my fault, I didn't notice that the 96 and 192 bytes kmem_cache need to be initialized after initialization of the power of 2 caches. I saw that in another thread the fix patch had been sent out. Really appreciate for the help. I'll be more prudent in the future.
| |