]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - mm/slab_common.c
mm: memcontrol: remove synchronous stock draining code
[karo-tx-linux.git] / mm / slab_common.c
index 3a6e0cfdf03add7f19f4dc9ebdf7cc8bf6fad695..2a3f5ff410cf1e684179ce3d7eb72e3d40102639 100644 (file)
@@ -93,16 +93,6 @@ static int kmem_cache_sanity_check(const char *name, size_t size)
                               s->object_size);
                        continue;
                }
-
-#if !defined(CONFIG_SLUB)
-               if (!strcmp(s->name, name)) {
-                       pr_err("%s (%s): Cache name already exists.\n",
-                              __func__, name);
-                       dump_stack();
-                       s = NULL;
-                       return -EINVAL;
-               }
-#endif
        }
 
        WARN_ON(strchr(name, ' '));     /* It confuses parsers */
@@ -250,7 +240,7 @@ struct kmem_cache *find_mergeable(size_t size, size_t align,
        size = ALIGN(size, align);
        flags = kmem_cache_flags(size, flags, name, NULL);
 
-       list_for_each_entry(s, &slab_caches, list) {
+       list_for_each_entry_reverse(s, &slab_caches, list) {
                if (slab_unmergeable(s))
                        continue;
 
@@ -269,6 +259,10 @@ struct kmem_cache *find_mergeable(size_t size, size_t align,
                if (s->size - size >= sizeof(void *))
                        continue;
 
+               if (IS_ENABLED(CONFIG_SLAB) && align &&
+                       (align > s->align || s->align % align))
+                       continue;
+
                return s;
        }
        return NULL;
@@ -840,14 +834,9 @@ void print_slabinfo_header(struct seq_file *m)
        seq_putc(m, '\n');
 }
 
-static void *s_start(struct seq_file *m, loff_t *pos)
+void *slab_start(struct seq_file *m, loff_t *pos)
 {
-       loff_t n = *pos;
-
        mutex_lock(&slab_mutex);
-       if (!n)
-               print_slabinfo_header(m);
-
        return seq_list_start(&slab_caches, *pos);
 }
 
@@ -909,10 +898,12 @@ int cache_show(struct kmem_cache *s, struct seq_file *m)
        return 0;
 }
 
-static int s_show(struct seq_file *m, void *p)
+static int slab_show(struct seq_file *m, void *p)
 {
        struct kmem_cache *s = list_entry(p, struct kmem_cache, list);
 
+       if (p == slab_caches.next)
+               print_slabinfo_header(m);
        if (!is_root_cache(s))
                return 0;
        return cache_show(s, m);
@@ -932,10 +923,10 @@ static int s_show(struct seq_file *m, void *p)
  * + further values on SMP and with statistics enabled
  */
 static const struct seq_operations slabinfo_op = {
-       .start = s_start,
+       .start = slab_start,
        .next = slab_next,
        .stop = slab_stop,
-       .show = s_show,
+       .show = slab_show,
 };
 
 static int slabinfo_open(struct inode *inode, struct file *file)