((freelist_idx_t *)(page->freelist))[idx] = val;
 }
 
-static void cache_init_objs(struct kmem_cache *cachep,
-                           struct page *page)
+static void cache_init_objs_debug(struct kmem_cache *cachep, struct page *page)
 {
+#if DEBUG
        int i;
 
        for (i = 0; i < cachep->num; i++) {
                void *objp = index_to_obj(cachep, page, i);
-#if DEBUG
+
                if (cachep->flags & SLAB_STORE_USER)
                        *dbg_userword(cachep, objp) = NULL;
 
                        poison_obj(cachep, objp, POISON_FREE);
                        slab_kernel_map(cachep, objp, 0, 0);
                }
-#else
-               if (cachep->ctor)
-                       cachep->ctor(objp);
+       }
 #endif
+}
+
+static void cache_init_objs(struct kmem_cache *cachep,
+                           struct page *page)
+{
+       int i;
+
+       cache_init_objs_debug(cachep, page);
+
+       for (i = 0; i < cachep->num; i++) {
+               /* constructor could break poison info */
+               if (DEBUG == 0 && cachep->ctor)
+                       cachep->ctor(index_to_obj(cachep, page, i));
+
                set_free_obj(page, i, i);
        }
 }