@@ -1713,6 +1713,7 @@ bool mem_cgroup_kmem_disabled(void);
int __memcg_kmem_charge_page(struct page *page, gfp_t gfp, int order);
void __memcg_kmem_uncharge_page(struct page *page, int order);
+struct obj_cgroup *get_obj_cgroup_from_cgroup(struct cgroup *cgrp);
struct obj_cgroup *get_obj_cgroup_from_current(void);
struct obj_cgroup *get_obj_cgroup_from_page(struct page *page);
@@ -2908,6 +2908,47 @@ static struct obj_cgroup *__get_obj_cgroup_from_memcg(struct mem_cgroup *memcg)
return objcg;
}
+static struct obj_cgroup *get_obj_cgroup_from_memcg(struct mem_cgroup *memcg)
+{
+ struct obj_cgroup *objcg;
+
+ if (memcg_kmem_bypass())
+ return NULL;
+
+ rcu_read_lock();
+ objcg = __get_obj_cgroup_from_memcg(memcg);
+ rcu_read_unlock();
+ return objcg;
+}
+
+struct obj_cgroup *get_obj_cgroup_from_cgroup(struct cgroup *cgrp)
+{
+ struct cgroup_subsys_state *css;
+ struct mem_cgroup *memcg;
+ struct obj_cgroup *objcg;
+
+ rcu_read_lock();
+ css = rcu_dereference(cgrp->subsys[memory_cgrp_id]);
+ if (!css || !css_tryget_online(css)) {
+ rcu_read_unlock();
+ cgroup_put(cgrp);
+ return ERR_PTR(-EINVAL);
+ }
+ rcu_read_unlock();
+ cgroup_put(cgrp);
+
+ memcg = mem_cgroup_from_css(css);
+ if (!memcg) {
+ css_put(css);
+ return ERR_PTR(-EINVAL);
+ }
+
+ objcg = get_obj_cgroup_from_memcg(memcg);
+ css_put(css);
+
+ return objcg;
+}
+
__always_inline struct obj_cgroup *get_obj_cgroup_from_current(void)
{
struct obj_cgroup *objcg = NULL;
Introduce new helper get_obj_cgroup_from_cgroup() to get obj_cgroup from a specific cgroup. Signed-off-by: Yafang Shao <laoar.shao@gmail.com> --- include/linux/memcontrol.h | 1 + mm/memcontrol.c | 41 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+)