rtc: Remove ARCH_KIRKWOOD dependency
[cascardo/linux.git] / mm / slub.c
index 92d8139..3e8afcc 100644 (file)
--- a/mm/slub.c
+++ b/mm/slub.c
@@ -283,6 +283,10 @@ static inline void set_freepointer(struct kmem_cache *s, void *object, void *fp)
        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)
 {
@@ -377,9 +381,9 @@ static inline bool __cmpxchg_double_slab(struct kmem_cache *s, struct page *page
     defined(CONFIG_HAVE_ALIGNED_STRUCT_PAGE)
        if (s->flags & __CMPXCHG_DOUBLE) {
                if (cmpxchg_double(&page->freelist, &page->counters,
-                       freelist_old, counters_old,
-                       freelist_new, counters_new))
-               return 1;
+                                  freelist_old, counters_old,
+                                  freelist_new, counters_new))
+                       return 1;
        } else
 #endif
        {
@@ -413,9 +417,9 @@ static inline bool cmpxchg_double_slab(struct kmem_cache *s, struct page *page,
     defined(CONFIG_HAVE_ALIGNED_STRUCT_PAGE)
        if (s->flags & __CMPXCHG_DOUBLE) {
                if (cmpxchg_double(&page->freelist, &page->counters,
-                       freelist_old, counters_old,
-                       freelist_new, counters_new))
-               return 1;
+                                  freelist_old, counters_old,
+                                  freelist_new, counters_new))
+                       return 1;
        } else
 #endif
        {
@@ -1379,9 +1383,9 @@ static struct page *new_slab(struct kmem_cache *s, gfp_t flags, int node)
 {
        struct page *page;
        void *start;
-       void *last;
        void *p;
        int order;
+       int idx;
 
        BUG_ON(flags & GFP_SLAB_BUG_MASK);
 
@@ -1402,14 +1406,13 @@ static struct page *new_slab(struct kmem_cache *s, gfp_t flags, int node)
        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;
@@ -4463,7 +4466,7 @@ SLAB_ATTR_RO(ctor);
 
 static ssize_t aliases_show(struct kmem_cache *s, char *buf)
 {
-       return sprintf(buf, "%d\n", s->refcount - 1);
+       return sprintf(buf, "%d\n", s->refcount < 0 ? 0 : s->refcount - 1);
 }
 SLAB_ATTR_RO(aliases);
 
@@ -5125,12 +5128,6 @@ static char *create_unique_id(struct kmem_cache *s)
                *p++ = '-';
        p += sprintf(p, "%07d", s->size);
 
-#ifdef CONFIG_MEMCG_KMEM
-       if (!is_root_cache(s))
-               p += sprintf(p, "-%08d",
-                               memcg_cache_id(s->memcg_params->memcg));
-#endif
-
        BUG_ON(p > name + ID_STR_LENGTH - 1);
        return name;
 }