On Mon, Jun 29, 2009 at 01:58:35PM +0200, Nick Piggin wrote: > n Mon, Jun 29, 2009 at 01:50:38PM +0200, Heiko Carstens wrote: > > On Mon, Jun 29, 2009 at 12:39:43PM +0200, Nick Piggin wrote: > > > On Mon, Jun 29, 2009 at 12:31:23PM +0200, Heiko Carstens wrote: > > > > On Mon, Jun 29, 2009 at 03:14:40PM +0530, Sachin Sant wrote: > > > > > I still have problems booting next with SLQB on a s390 box. > > > > > > > > > > Write protected kernel read-only data: 0x12000 - 0x446fff > > > > > Experimental hierarchical RCU implementation. > > > > > Experimental hierarchical RCU init done. > > > > > console ÝttyS0¨ enabled > > > > > Unable to handle kernel pointer dereference at virtual kernel address (null) > > > > > > This could I suppose be due to failed allocation where the caller > > > isn't expecting failure (or using SLAB_PANIC). > > > > > > Did you manage to test with the prink debugging patch for SLQB that > > > I sent for the power6 boot failure? I don't think I saw a reply from > > > you but maybe I missed it? > > > > Could you send me the debug patch as well? I can give it a quick run as well. > > This is what I had. It is only helpful for the power6 > failure where there was a problem in an allocation from > kmem_cache_create. slqb returns ZERO_SIZE_PTR instead of NULL for large size requests it cannot handle. The patch below would fix it. But I think its too ugly. So I leave it up to Nick to come up with a real and nice patch ;) diff --git a/include/linux/slqb_def.h b/include/linux/slqb_def.h index 7b4a601..9d03485 100644 --- a/include/linux/slqb_def.h +++ b/include/linux/slqb_def.h @@ -187,7 +187,7 @@ static __always_inline int kmalloc_index(size_t size) if (unlikely(!size)) return 0; if (unlikely(size > 1UL << KMALLOC_SHIFT_SLQB_HIGH)) - return 0; + return -1; if (unlikely(size <= KMALLOC_MIN_SIZE)) return KMALLOC_SHIFT_LOW; @@ -219,7 +219,7 @@ static __always_inline int kmalloc_index(size_t size) if (size <= 512 * 1024) return 19; if (size <= 1024 * 1024) return 20; if (size <= 2 * 1024 * 1024) return 21; - return -1; + return -2; } #ifdef CONFIG_ZONE_DMA @@ -239,8 +239,12 @@ static __always_inline struct kmem_cache *kmalloc_slab(size_t size, gfp_t flags) int index; index = kmalloc_index(size); - if (unlikely(index == 0)) - return ZERO_SIZE_PTR; + if (unlikely(index <= 0)) { + if (index == 0) + return ZERO_SIZE_PTR; + if (index == -1) + return NULL; + } if (likely(!(flags & SLQB_DMA))) return &kmalloc_caches[index]; -- To unsubscribe from this list: send the line "unsubscribe linux-next" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html