Merge tag 'drm-next-2019-09-27' of git://anongit.freedesktop.org/drm/drm
[linux-2.6-microblaze.git] / mm / slab.h
index 9057b80..68e455f 100644 (file)
--- a/mm/slab.h
+++ b/mm/slab.h
@@ -30,6 +30,69 @@ struct kmem_cache {
        struct list_head list;  /* List of all slab caches on the system */
 };
 
+#else /* !CONFIG_SLOB */
+
+struct memcg_cache_array {
+       struct rcu_head rcu;
+       struct kmem_cache *entries[0];
+};
+
+/*
+ * This is the main placeholder for memcg-related information in kmem caches.
+ * Both the root cache and the child caches will have it. For the root cache,
+ * this will hold a dynamically allocated array large enough to hold
+ * information about the currently limited memcgs in the system. To allow the
+ * array to be accessed without taking any locks, on relocation we free the old
+ * version only after a grace period.
+ *
+ * Root and child caches hold different metadata.
+ *
+ * @root_cache:        Common to root and child caches.  NULL for root, pointer to
+ *             the root cache for children.
+ *
+ * The following fields are specific to root caches.
+ *
+ * @memcg_caches: kmemcg ID indexed table of child caches.  This table is
+ *             used to index child cachces during allocation and cleared
+ *             early during shutdown.
+ *
+ * @root_caches_node: List node for slab_root_caches list.
+ *
+ * @children:  List of all child caches.  While the child caches are also
+ *             reachable through @memcg_caches, a child cache remains on
+ *             this list until it is actually destroyed.
+ *
+ * The following fields are specific to child caches.
+ *
+ * @memcg:     Pointer to the memcg this cache belongs to.
+ *
+ * @children_node: List node for @root_cache->children list.
+ *
+ * @kmem_caches_node: List node for @memcg->kmem_caches list.
+ */
+struct memcg_cache_params {
+       struct kmem_cache *root_cache;
+       union {
+               struct {
+                       struct memcg_cache_array __rcu *memcg_caches;
+                       struct list_head __root_caches_node;
+                       struct list_head children;
+                       bool dying;
+               };
+               struct {
+                       struct mem_cgroup *memcg;
+                       struct list_head children_node;
+                       struct list_head kmem_caches_node;
+                       struct percpu_ref refcnt;
+
+                       void (*work_fn)(struct kmem_cache *);
+                       union {
+                               struct rcu_head rcu_head;
+                               struct work_struct work;
+                       };
+               };
+       };
+};
 #endif /* CONFIG_SLOB */
 
 #ifdef CONFIG_SLAB
@@ -174,6 +237,7 @@ int __kmem_cache_shrink(struct kmem_cache *);
 void __kmemcg_cache_deactivate(struct kmem_cache *s);
 void __kmemcg_cache_deactivate_after_rcu(struct kmem_cache *s);
 void slab_kmem_cache_release(struct kmem_cache *);
+void kmem_cache_shrink_all(struct kmem_cache *s);
 
 struct seq_file;
 struct file;