for (__p = (__addr); __p < (__addr) + (__objects) * (__s)->size;\
                        __p += (__s)->size)
 
+#define for_each_object_idx(__p, __idx, __s, __addr, __objects) \
+       for (__p = (__addr), __idx = 1; __idx <= __objects;\
+                       __p += (__s)->size, __idx++)
+
 /* Determine object index from a given position */
 static inline int slab_index(void *p, struct kmem_cache *s, void *addr)
 {
 {
        struct page *page;
        void *start;
-       void *last;
        void *p;
        int order;
+       int idx;
 
        BUG_ON(flags & GFP_SLAB_BUG_MASK);
 
        if (unlikely(s->flags & SLAB_POISON))
                memset(start, POISON_INUSE, PAGE_SIZE << order);
 
-       last = start;
-       for_each_object(p, s, start, page->objects) {
-               setup_object(s, page, last);
-               set_freepointer(s, last, p);
-               last = p;
+       for_each_object_idx(p, idx, s, start, page->objects) {
+               setup_object(s, page, p);
+               if (likely(idx < page->objects))
+                       set_freepointer(s, p, p + s->size);
+               else
+                       set_freepointer(s, p, NULL);
        }
-       setup_object(s, page, last);
-       set_freepointer(s, last, NULL);
 
        page->freelist = start;
        page->inuse = page->objects;