提交 2dcb2c2a 编写于 作者: K Kang Chen 提交者: Liu Shixin

mm: oom: move memcg_print_bad_task() out of mem_cgroup_scan_tasks()

hulk inclusion
category: bugfix
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I6NYW4
CVE: NA

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

raw call flow:

oom_kill_process
  -> mem_cgroup_scan_tasks(.., .., message)
    -> memcg_print_bad_task(message, ..)

message is "const char*" type, and incorrectly cast to
"oom_control*" type in memcg_print_bad_task.

Fix it by moving memcg_print_bad_task out of mem_cgroup_scan_tasks
and call it in select_bad_process and dump_tasks. Furthermore,
use struct oom_control* directly and remove the useless parm `ret`.
Reviewed-by: NKefeng Wang <wangkefeng.wang@huawei.com>
Signed-off-by: NKang Chen <void0red@hust.edu.cn>
Conflicts:
	include/linux/memcontrol.h
Signed-off-by: NLiu Shixin <liushixin2@huawei.com>
上级 51782f27
...@@ -23,6 +23,7 @@ ...@@ -23,6 +23,7 @@
#include <linux/page-flags.h> #include <linux/page-flags.h>
#include <linux/kabi.h> #include <linux/kabi.h>
#include <linux/dynamic_hugetlb.h> #include <linux/dynamic_hugetlb.h>
#include <linux/oom.h>
struct mem_cgroup; struct mem_cgroup;
struct obj_cgroup; struct obj_cgroup;
...@@ -400,7 +401,7 @@ DECLARE_STATIC_KEY_FALSE(memcg_qos_stat_key); ...@@ -400,7 +401,7 @@ DECLARE_STATIC_KEY_FALSE(memcg_qos_stat_key);
bool memcg_low_priority_scan_tasks(int (*)(struct task_struct *, void *), bool memcg_low_priority_scan_tasks(int (*)(struct task_struct *, void *),
void *); void *);
void memcg_print_bad_task(void *arg, int ret); void memcg_print_bad_task(struct oom_control *oc);
extern int sysctl_memcg_qos_handler(struct ctl_table *table, extern int sysctl_memcg_qos_handler(struct ctl_table *table,
int write, void __user *buffer, size_t *length, loff_t *ppos); int write, void __user *buffer, size_t *length, loff_t *ppos);
#endif #endif
......
...@@ -1201,9 +1201,6 @@ int mem_cgroup_scan_tasks(struct mem_cgroup *memcg, ...@@ -1201,9 +1201,6 @@ int mem_cgroup_scan_tasks(struct mem_cgroup *memcg,
break; break;
} }
} }
#ifdef CONFIG_MEMCG_QOS
memcg_print_bad_task(arg, ret);
#endif
return ret; return ret;
} }
...@@ -3950,14 +3947,12 @@ bool memcg_low_priority_scan_tasks(int (*fn)(struct task_struct *, void *), ...@@ -3950,14 +3947,12 @@ bool memcg_low_priority_scan_tasks(int (*fn)(struct task_struct *, void *),
return oc->chosen ? true : false; return oc->chosen ? true : false;
} }
void memcg_print_bad_task(void *arg, int ret) void memcg_print_bad_task(struct oom_control *oc)
{ {
struct oom_control *oc = arg;
if (!static_branch_likely(&memcg_qos_stat_key)) if (!static_branch_likely(&memcg_qos_stat_key))
return; return;
if (!ret && oc->chosen) { if (oc->chosen) {
struct mem_cgroup *memcg; struct mem_cgroup *memcg;
memcg = mem_cgroup_from_task(oc->chosen); memcg = mem_cgroup_from_task(oc->chosen);
...@@ -3988,6 +3983,13 @@ int sysctl_memcg_qos_handler(struct ctl_table *table, int write, ...@@ -3988,6 +3983,13 @@ int sysctl_memcg_qos_handler(struct ctl_table *table, int write,
return ret; return ret;
} }
#else
void memcg_print_bad_task(struct oom_control *oc)
{
}
#endif #endif
#ifdef CONFIG_NUMA #ifdef CONFIG_NUMA
......
...@@ -408,9 +408,10 @@ static void select_bad_process(struct oom_control *oc) ...@@ -408,9 +408,10 @@ static void select_bad_process(struct oom_control *oc)
{ {
oc->chosen_points = LONG_MIN; oc->chosen_points = LONG_MIN;
if (is_memcg_oom(oc)) if (is_memcg_oom(oc)) {
mem_cgroup_scan_tasks(oc->memcg, oom_evaluate_task, oc); if (!mem_cgroup_scan_tasks(oc->memcg, oom_evaluate_task, oc))
else { memcg_print_bad_task(oc);
} else {
struct task_struct *p; struct task_struct *p;
#ifdef CONFIG_MEMCG_QOS #ifdef CONFIG_MEMCG_QOS
...@@ -473,9 +474,10 @@ static void dump_tasks(struct oom_control *oc) ...@@ -473,9 +474,10 @@ static void dump_tasks(struct oom_control *oc)
pr_info("Tasks state (memory values in pages):\n"); pr_info("Tasks state (memory values in pages):\n");
pr_info("[ pid ] uid tgid total_vm rss pgtables_bytes swapents oom_score_adj name\n"); pr_info("[ pid ] uid tgid total_vm rss pgtables_bytes swapents oom_score_adj name\n");
if (is_memcg_oom(oc)) if (is_memcg_oom(oc)) {
mem_cgroup_scan_tasks(oc->memcg, dump_task, oc); if (!mem_cgroup_scan_tasks(oc->memcg, dump_task, oc))
else { memcg_print_bad_task(oc);
} else {
struct task_struct *p; struct task_struct *p;
rcu_read_lock(); rcu_read_lock();
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册