hugetlb_cgroup: add reservation accounting for private mappings
[platform/kernel/linux-rpi.git] / include / linux / hugetlb_cgroup.h
index 5443f45..0699cd2 100644 (file)
@@ -18,6 +18,8 @@
 #include <linux/mmdebug.h>
 
 struct hugetlb_cgroup;
+struct resv_map;
+
 /*
  * Minimum page order trackable by hugetlb cgroup.
  * At least 4 pages are necessary for all the tracking information.
@@ -27,6 +29,33 @@ struct hugetlb_cgroup;
 #define HUGETLB_CGROUP_MIN_ORDER       2
 
 #ifdef CONFIG_CGROUP_HUGETLB
+enum hugetlb_memory_event {
+       HUGETLB_MAX,
+       HUGETLB_NR_MEMORY_EVENTS,
+};
+
+struct hugetlb_cgroup {
+       struct cgroup_subsys_state css;
+
+       /*
+        * the counter to account for hugepages from hugetlb.
+        */
+       struct page_counter hugepage[HUGE_MAX_HSTATE];
+
+       /*
+        * the counter to account for hugepage reservations from hugetlb.
+        */
+       struct page_counter rsvd_hugepage[HUGE_MAX_HSTATE];
+
+       atomic_long_t events[HUGE_MAX_HSTATE][HUGETLB_NR_MEMORY_EVENTS];
+       atomic_long_t events_local[HUGE_MAX_HSTATE][HUGETLB_NR_MEMORY_EVENTS];
+
+       /* Handle for "hugetlb.events" */
+       struct cgroup_file events_file[HUGE_MAX_HSTATE];
+
+       /* Handle for "hugetlb.events.local" */
+       struct cgroup_file events_local_file[HUGE_MAX_HSTATE];
+};
 
 static inline struct hugetlb_cgroup *
 __hugetlb_cgroup_from_page(struct page *page, bool rsvd)
@@ -102,9 +131,9 @@ extern void hugetlb_cgroup_uncharge_cgroup(int idx, unsigned long nr_pages,
                                           struct hugetlb_cgroup *h_cg);
 extern void hugetlb_cgroup_uncharge_cgroup_rsvd(int idx, unsigned long nr_pages,
                                                struct hugetlb_cgroup *h_cg);
-extern void hugetlb_cgroup_uncharge_counter(struct page_counter *p,
-                                           unsigned long nr_pages,
-                                           struct cgroup_subsys_state *css);
+extern void hugetlb_cgroup_uncharge_counter(struct resv_map *resv,
+                                           unsigned long start,
+                                           unsigned long end);
 
 extern void hugetlb_cgroup_file_init(void) __init;
 extern void hugetlb_cgroup_migrate(struct page *oldhpage,
@@ -193,6 +222,12 @@ hugetlb_cgroup_uncharge_cgroup_rsvd(int idx, unsigned long nr_pages,
 {
 }
 
+static inline void hugetlb_cgroup_uncharge_counter(struct resv_map *resv,
+                                                  unsigned long start,
+                                                  unsigned long end)
+{
+}
+
 static inline void hugetlb_cgroup_file_init(void)
 {
 }