mm/memory_hotplug: document why shuffle_zone() is relevant
[linux-2.6-microblaze.git] / mm / slab_common.c
index ad67a03..a513f32 100644 (file)
@@ -130,36 +130,6 @@ int __kmem_cache_alloc_bulk(struct kmem_cache *s, gfp_t flags, size_t nr,
        return i;
 }
 
-#ifdef CONFIG_MEMCG_KMEM
-static void memcg_kmem_cache_create_func(struct work_struct *work)
-{
-       struct kmem_cache *cachep = container_of(work, struct kmem_cache,
-                                                memcg_params.work);
-       memcg_create_kmem_cache(cachep);
-}
-
-void slab_init_memcg_params(struct kmem_cache *s)
-{
-       s->memcg_params.root_cache = NULL;
-       s->memcg_params.memcg_cache = NULL;
-       INIT_WORK(&s->memcg_params.work, memcg_kmem_cache_create_func);
-}
-
-static void init_memcg_params(struct kmem_cache *s,
-                             struct kmem_cache *root_cache)
-{
-       if (root_cache)
-               s->memcg_params.root_cache = root_cache;
-       else
-               slab_init_memcg_params(s);
-}
-#else
-static inline void init_memcg_params(struct kmem_cache *s,
-                                    struct kmem_cache *root_cache)
-{
-}
-#endif /* CONFIG_MEMCG_KMEM */
-
 /*
  * Figure out what the alignment of the objects will be given a set of
  * flags, a user specified alignment and the size of the objects.
@@ -197,9 +167,6 @@ int slab_unmergeable(struct kmem_cache *s)
        if (slab_nomerge || (s->flags & SLAB_NEVER_MERGE))
                return 1;
 
-       if (!is_root_cache(s))
-               return 1;
-
        if (s->ctor)
                return 1;
 
@@ -286,7 +253,6 @@ static struct kmem_cache *create_cache(const char *name,
        s->useroffset = useroffset;
        s->usersize = usersize;
 
-       init_memcg_params(s, root_cache);
        err = __kmem_cache_create(s, flags);
        if (err)
                goto out_free_cache;
@@ -344,7 +310,6 @@ kmem_cache_create_usercopy(const char *name,
 
        get_online_cpus();
        get_online_mems();
-       memcg_get_cache_ids();
 
        mutex_lock(&slab_mutex);
 
@@ -394,7 +359,6 @@ kmem_cache_create_usercopy(const char *name,
 out_unlock:
        mutex_unlock(&slab_mutex);
 
-       memcg_put_cache_ids();
        put_online_mems();
        put_online_cpus();
 
@@ -507,87 +471,6 @@ static int shutdown_cache(struct kmem_cache *s)
        return 0;
 }
 
-#ifdef CONFIG_MEMCG_KMEM
-/*
- * memcg_create_kmem_cache - Create a cache for non-root memory cgroups.
- * @root_cache: The parent of the new cache.
- *
- * This function attempts to create a kmem cache that will serve allocation
- * requests going all non-root memory cgroups to @root_cache. The new cache
- * inherits properties from its parent.
- */
-void memcg_create_kmem_cache(struct kmem_cache *root_cache)
-{
-       struct kmem_cache *s = NULL;
-       char *cache_name;
-
-       get_online_cpus();
-       get_online_mems();
-
-       mutex_lock(&slab_mutex);
-
-       if (root_cache->memcg_params.memcg_cache)
-               goto out_unlock;
-
-       cache_name = kasprintf(GFP_KERNEL, "%s-memcg", root_cache->name);
-       if (!cache_name)
-               goto out_unlock;
-
-       s = create_cache(cache_name, root_cache->object_size,
-                        root_cache->align,
-                        root_cache->flags & CACHE_CREATE_MASK,
-                        root_cache->useroffset, root_cache->usersize,
-                        root_cache->ctor, root_cache);
-       /*
-        * If we could not create a memcg cache, do not complain, because
-        * that's not critical at all as we can always proceed with the root
-        * cache.
-        */
-       if (IS_ERR(s)) {
-               kfree(cache_name);
-               goto out_unlock;
-       }
-
-       /*
-        * Since readers won't lock (see memcg_slab_pre_alloc_hook()), we need a
-        * barrier here to ensure nobody will see the kmem_cache partially
-        * initialized.
-        */
-       smp_wmb();
-       root_cache->memcg_params.memcg_cache = s;
-
-out_unlock:
-       mutex_unlock(&slab_mutex);
-
-       put_online_mems();
-       put_online_cpus();
-}
-
-static int shutdown_memcg_caches(struct kmem_cache *s)
-{
-       BUG_ON(!is_root_cache(s));
-
-       if (s->memcg_params.memcg_cache)
-               WARN_ON(shutdown_cache(s->memcg_params.memcg_cache));
-
-       return 0;
-}
-
-static void cancel_memcg_cache_creation(struct kmem_cache *s)
-{
-       cancel_work_sync(&s->memcg_params.work);
-}
-#else
-static inline int shutdown_memcg_caches(struct kmem_cache *s)
-{
-       return 0;
-}
-
-static inline void cancel_memcg_cache_creation(struct kmem_cache *s)
-{
-}
-#endif /* CONFIG_MEMCG_KMEM */
-
 void slab_kmem_cache_release(struct kmem_cache *s)
 {
        __kmem_cache_release(s);
@@ -602,8 +485,6 @@ void kmem_cache_destroy(struct kmem_cache *s)
        if (unlikely(!s))
                return;
 
-       cancel_memcg_cache_creation(s);
-
        get_online_cpus();
        get_online_mems();
 
@@ -613,10 +494,7 @@ void kmem_cache_destroy(struct kmem_cache *s)
        if (s->refcount)
                goto out_unlock;
 
-       err = shutdown_memcg_caches(s);
-       if (!err)
-               err = shutdown_cache(s);
-
+       err = shutdown_cache(s);
        if (err) {
                pr_err("kmem_cache_destroy %s: Slab cache still has objects\n",
                       s->name);
@@ -653,33 +531,6 @@ int kmem_cache_shrink(struct kmem_cache *cachep)
 }
 EXPORT_SYMBOL(kmem_cache_shrink);
 
-/**
- * kmem_cache_shrink_all - shrink root and memcg caches
- * @s: The cache pointer
- */
-void kmem_cache_shrink_all(struct kmem_cache *s)
-{
-       struct kmem_cache *c;
-
-       if (!IS_ENABLED(CONFIG_MEMCG_KMEM) || !is_root_cache(s)) {
-               kmem_cache_shrink(s);
-               return;
-       }
-
-       get_online_cpus();
-       get_online_mems();
-       kasan_cache_shrink(s);
-       __kmem_cache_shrink(s);
-
-       c = memcg_cache(s);
-       if (c) {
-               kasan_cache_shrink(c);
-               __kmem_cache_shrink(c);
-       }
-       put_online_mems();
-       put_online_cpus();
-}
-
 bool slab_is_available(void)
 {
        return slab_state >= UP;
@@ -708,8 +559,6 @@ void __init create_boot_cache(struct kmem_cache *s, const char *name,
        s->useroffset = useroffset;
        s->usersize = usersize;
 
-       slab_init_memcg_params(s);
-
        err = __kmem_cache_create(s, flags);
 
        if (err)
@@ -1098,25 +947,6 @@ void slab_stop(struct seq_file *m, void *p)
        mutex_unlock(&slab_mutex);
 }
 
-static void
-memcg_accumulate_slabinfo(struct kmem_cache *s, struct slabinfo *info)
-{
-       struct kmem_cache *c;
-       struct slabinfo sinfo;
-
-       c = memcg_cache(s);
-       if (c) {
-               memset(&sinfo, 0, sizeof(sinfo));
-               get_slabinfo(c, &sinfo);
-
-               info->active_slabs += sinfo.active_slabs;
-               info->num_slabs += sinfo.num_slabs;
-               info->shared_avail += sinfo.shared_avail;
-               info->active_objs += sinfo.active_objs;
-               info->num_objs += sinfo.num_objs;
-       }
-}
-
 static void cache_show(struct kmem_cache *s, struct seq_file *m)
 {
        struct slabinfo sinfo;
@@ -1124,10 +954,8 @@ static void cache_show(struct kmem_cache *s, struct seq_file *m)
        memset(&sinfo, 0, sizeof(sinfo));
        get_slabinfo(s, &sinfo);
 
-       memcg_accumulate_slabinfo(s, &sinfo);
-
        seq_printf(m, "%-17s %6lu %6lu %6u %4u %4d",
-                  cache_name(s), sinfo.active_objs, sinfo.num_objs, s->size,
+                  s->name, sinfo.active_objs, sinfo.num_objs, s->size,
                   sinfo.objects_per_slab, (1 << sinfo.cache_order));
 
        seq_printf(m, " : tunables %4u %4u %4u",
@@ -1144,8 +972,7 @@ static int slab_show(struct seq_file *m, void *p)
 
        if (p == slab_caches.next)
                print_slabinfo_header(m);
-       if (is_root_cache(s))
-               cache_show(s, m);
+       cache_show(s, m);
        return 0;
 }
 
@@ -1170,13 +997,13 @@ void dump_unreclaimable_slab(void)
        pr_info("Name                      Used          Total\n");
 
        list_for_each_entry_safe(s, s2, &slab_caches, list) {
-               if (!is_root_cache(s) || (s->flags & SLAB_RECLAIM_ACCOUNT))
+               if (s->flags & SLAB_RECLAIM_ACCOUNT)
                        continue;
 
                get_slabinfo(s, &sinfo);
 
                if (sinfo.num_objs > 0)
-                       pr_info("%-17s %10luKB %10luKB\n", cache_name(s),
+                       pr_info("%-17s %10luKB %10luKB\n", s->name,
                                (sinfo.active_objs * s->size) / 1024,
                                (sinfo.num_objs * s->size) / 1024);
        }
@@ -1235,53 +1062,6 @@ static int __init slab_proc_init(void)
 }
 module_init(slab_proc_init);
 
-#if defined(CONFIG_DEBUG_FS) && defined(CONFIG_MEMCG_KMEM)
-/*
- * Display information about kmem caches that have memcg cache.
- */
-static int memcg_slabinfo_show(struct seq_file *m, void *unused)
-{
-       struct kmem_cache *s, *c;
-       struct slabinfo sinfo;
-
-       mutex_lock(&slab_mutex);
-       seq_puts(m, "# <name> <css_id[:dead|deact]> <active_objs> <num_objs>");
-       seq_puts(m, " <active_slabs> <num_slabs>\n");
-       list_for_each_entry(s, &slab_caches, list) {
-               /*
-                * Skip kmem caches that don't have the memcg cache.
-                */
-               if (!s->memcg_params.memcg_cache)
-                       continue;
-
-               memset(&sinfo, 0, sizeof(sinfo));
-               get_slabinfo(s, &sinfo);
-               seq_printf(m, "%-17s root       %6lu %6lu %6lu %6lu\n",
-                          cache_name(s), sinfo.active_objs, sinfo.num_objs,
-                          sinfo.active_slabs, sinfo.num_slabs);
-
-               c = s->memcg_params.memcg_cache;
-               memset(&sinfo, 0, sizeof(sinfo));
-               get_slabinfo(c, &sinfo);
-               seq_printf(m, "%-17s %4d %6lu %6lu %6lu %6lu\n",
-                          cache_name(c), root_mem_cgroup->css.id,
-                          sinfo.active_objs, sinfo.num_objs,
-                          sinfo.active_slabs, sinfo.num_slabs);
-       }
-       mutex_unlock(&slab_mutex);
-       return 0;
-}
-DEFINE_SHOW_ATTRIBUTE(memcg_slabinfo);
-
-static int __init memcg_slabinfo_init(void)
-{
-       debugfs_create_file("memcg_slabinfo", S_IFREG | S_IRUGO,
-                           NULL, NULL, &memcg_slabinfo_fops);
-       return 0;
-}
-
-late_initcall(memcg_slabinfo_init);
-#endif /* CONFIG_DEBUG_FS && CONFIG_MEMCG_KMEM */
 #endif /* CONFIG_SLAB || CONFIG_SLUB_DEBUG */
 
 static __always_inline void *__do_krealloc(const void *p, size_t new_size,