提交 0a03d546 编写于 作者: J Jing Xiangfeng 提交者: Yang Yingliang

memcg: fix kabi broken when enable CONFIG_MEMCG_QOS

hulk inclusion
category: feature
bugzilla: 51827
CVE: NA

--------------------------------------

Fix it by moving memcg_priority from struct mem_cgroup to
struct mem_cgroup_extension.
Signed-off-by: NJing Xiangfeng <jingxiangfeng@huawei.com>
Reviewed-by: NKefeng Wang <wangkefeng.wang@huawei.com>
Signed-off-by: NYang Yingliang <yangyingliang@huawei.com>
上级 d4c4911d
...@@ -287,10 +287,6 @@ struct mem_cgroup { ...@@ -287,10 +287,6 @@ struct mem_cgroup {
bool tcpmem_active; bool tcpmem_active;
int tcpmem_pressure; int tcpmem_pressure;
#ifdef CONFIG_MEMCG_QOS
/* Currently support 0 and -1, in the future it can expand to other value */
int memcg_priority;
#endif
#ifdef CONFIG_MEMCG_KMEM #ifdef CONFIG_MEMCG_KMEM
/* Index in the kmem_cache->memcg_params.memcg_caches array */ /* Index in the kmem_cache->memcg_params.memcg_caches array */
int kmemcg_id; int kmemcg_id;
...@@ -323,8 +319,14 @@ struct mem_cgroup_extension { ...@@ -323,8 +319,14 @@ struct mem_cgroup_extension {
struct list_head split_queue; struct list_head split_queue;
unsigned long split_queue_len; unsigned long split_queue_len;
struct mem_cgroup memcg; struct mem_cgroup memcg;
#ifdef CONFIG_MEMCG_QOS
/* Currently support 0 and -1, in the future it can expand to other value */
int memcg_priority;
#endif
}; };
#define to_memcg_ext(cgroup) container_of(cgroup, struct mem_cgroup_extension, memcg)
#ifdef CONFIG_MEMCG_QOS #ifdef CONFIG_MEMCG_QOS
bool memcg_low_priority_scan_tasks(int (*)(struct task_struct *, void *), bool memcg_low_priority_scan_tasks(int (*)(struct task_struct *, void *),
void *); void *);
......
...@@ -3407,29 +3407,42 @@ static int mem_cgroup_move_charge_write(struct cgroup_subsys_state *css, ...@@ -3407,29 +3407,42 @@ static int mem_cgroup_move_charge_write(struct cgroup_subsys_state *css,
static void memcg_qos_init(struct mem_cgroup *memcg) static void memcg_qos_init(struct mem_cgroup *memcg)
{ {
struct mem_cgroup *parent = parent_mem_cgroup(memcg); struct mem_cgroup *parent = parent_mem_cgroup(memcg);
struct mem_cgroup_extension *memcg_ext;
struct mem_cgroup_extension *parent_ext;
if (!parent) if (!parent)
return; return;
if (parent->memcg_priority && parent->use_hierarchy) memcg_ext = to_memcg_ext(memcg);
memcg->memcg_priority = parent->memcg_priority; parent_ext = to_memcg_ext(parent);
if (parent_ext->memcg_priority && parent->use_hierarchy)
memcg_ext->memcg_priority = parent_ext->memcg_priority;
} }
static s64 memcg_qos_read(struct cgroup_subsys_state *css, static s64 memcg_qos_read(struct cgroup_subsys_state *css,
struct cftype *cft) struct cftype *cft)
{ {
return mem_cgroup_from_css(css)->memcg_priority; struct mem_cgroup *memcg = mem_cgroup_from_css(css);
struct mem_cgroup_extension *memcg_ext;
memcg_ext = to_memcg_ext(memcg);
return memcg_ext->memcg_priority;
} }
static int memcg_qos_write(struct cgroup_subsys_state *css, static int memcg_qos_write(struct cgroup_subsys_state *css,
struct cftype *cft, s64 val) struct cftype *cft, s64 val)
{ {
struct mem_cgroup *memcg = mem_cgroup_from_css(css); struct mem_cgroup *memcg = mem_cgroup_from_css(css);
struct mem_cgroup_extension *memcg_ext;
memcg_ext = to_memcg_ext(memcg);
if (val >= 0) { if (val >= 0) {
memcg->memcg_priority = 0; memcg_ext->memcg_priority = 0;
} else { } else {
memcg->memcg_priority = -1; memcg_ext->memcg_priority = -1;
} }
return 0; return 0;
...@@ -3439,13 +3452,15 @@ static struct mem_cgroup *memcg_find_max_usage(struct mem_cgroup *last) ...@@ -3439,13 +3452,15 @@ static struct mem_cgroup *memcg_find_max_usage(struct mem_cgroup *last)
{ {
struct mem_cgroup *iter, *max_memcg = NULL; struct mem_cgroup *iter, *max_memcg = NULL;
struct cgroup_subsys_state *css; struct cgroup_subsys_state *css;
struct mem_cgroup_extension *memcg_ext;
unsigned long usage, max_usage = 0; unsigned long usage, max_usage = 0;
rcu_read_lock(); rcu_read_lock();
css_for_each_descendant_pre(css, &root_mem_cgroup->css) { css_for_each_descendant_pre(css, &root_mem_cgroup->css) {
iter = mem_cgroup_from_css(css); iter = mem_cgroup_from_css(css);
memcg_ext = to_memcg_ext(iter);
if (!iter->memcg_priority || iter == root_mem_cgroup || iter == last) if (!memcg_ext->memcg_priority || iter == root_mem_cgroup || iter == last)
continue; continue;
usage = mem_cgroup_usage(iter, false); usage = mem_cgroup_usage(iter, false);
...@@ -3504,11 +3519,13 @@ bool memcg_low_priority_scan_tasks(int (*fn)(struct task_struct *, void *), ...@@ -3504,11 +3519,13 @@ bool memcg_low_priority_scan_tasks(int (*fn)(struct task_struct *, void *),
void memcg_print_bad_task(void *arg, int ret) void memcg_print_bad_task(void *arg, int ret)
{ {
struct oom_control *oc = arg; struct oom_control *oc = arg;
struct mem_cgroup *memcg;
struct mem_cgroup_extension *memcg_ext;
if (!ret && oc->chosen) { if (!ret && oc->chosen) {
struct mem_cgroup *memcg;
memcg = mem_cgroup_from_task(oc->chosen); memcg = mem_cgroup_from_task(oc->chosen);
if (memcg->memcg_priority) memcg_ext = to_memcg_ext(memcg);
if (memcg_ext->memcg_priority)
pr_info("The bad task [%d:%s] is from low-priority memcg.\n", pr_info("The bad task [%d:%s] is from low-priority memcg.\n",
oc->chosen->pid, oc->chosen->comm); oc->chosen->pid, oc->chosen->comm);
} }
......
...@@ -327,6 +327,8 @@ static bool oom_next_task(struct task_struct *task, struct oom_control *oc, ...@@ -327,6 +327,8 @@ static bool oom_next_task(struct task_struct *task, struct oom_control *oc,
{ {
struct mem_cgroup *cur_memcg; struct mem_cgroup *cur_memcg;
struct mem_cgroup *oc_memcg; struct mem_cgroup *oc_memcg;
struct mem_cgroup_extension *cur_ext;
struct mem_cgroup_extension *oc_ext;
if (!points) if (!points)
...@@ -337,14 +339,16 @@ static bool oom_next_task(struct task_struct *task, struct oom_control *oc, ...@@ -337,14 +339,16 @@ static bool oom_next_task(struct task_struct *task, struct oom_control *oc,
oc_memcg = mem_cgroup_from_task(oc->chosen); oc_memcg = mem_cgroup_from_task(oc->chosen);
cur_memcg = mem_cgroup_from_task(task); cur_memcg = mem_cgroup_from_task(task);
oc_ext = to_memcg_ext(oc_memcg);
cur_ext = to_memcg_ext(cur_memcg);
if (cur_memcg->memcg_priority == oc_memcg->memcg_priority) { if (cur_ext->memcg_priority == oc_ext->memcg_priority) {
if (points < oc->chosen_points) if (points < oc->chosen_points)
return true; return true;
return false; return false;
} }
/* if oc is low-priority, so skip the task */ /* if oc is low-priority, so skip the task */
if (oc_memcg->memcg_priority) if (oc_ext->memcg_priority)
return true; return true;
return false; return false;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册