Commit 96a1e4dd authored by Zheng Yejian's avatar Zheng Yejian
Browse files

livepatch: Check calltrace of idle tasks

hulk inclusion
category: feature
bugzilla: https://gitee.com/openeuler/kernel/issues/I9R2TB



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

for_each_process_thread() only include init_task and its descendant,
but not include idle tasks. Idle tasks also require calltraces checking.

Signed-off-by: default avatarZheng Yejian <zhengyejian1@huawei.com>
parent 92c2ec1a
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -246,6 +246,7 @@ static int do_check_calltrace(struct walk_stackframe_args *args,
{
	int ret;
	struct task_struct *g, *t;
	unsigned int cpu;

	for_each_process_thread(g, t) {
		if (klp_is_migration_thread(t->comm))
@@ -254,6 +255,11 @@ static int do_check_calltrace(struct walk_stackframe_args *args,
		if (ret)
			return ret;
	}
	for_each_online_cpu(cpu) {
		ret = check_task_calltrace(idle_task(cpu), args, fn);
		if (ret)
			return ret;
	}
	return 0;
}

+6 −0
Original line number Diff line number Diff line
@@ -242,6 +242,7 @@ static int do_check_calltrace(struct walk_stackframe_args *args,
{
	int ret;
	struct task_struct *g, *t;
	unsigned int cpu;

	for_each_process_thread(g, t) {
		if (klp_is_migration_thread(t->comm))
@@ -250,6 +251,11 @@ static int do_check_calltrace(struct walk_stackframe_args *args,
		if (ret)
			return ret;
	}
	for_each_online_cpu(cpu) {
		ret = check_task_calltrace(idle_task(cpu), args, fn);
		if (ret)
			return ret;
	}
	return 0;
}

+6 −0
Original line number Diff line number Diff line
@@ -280,6 +280,7 @@ static int do_check_calltrace(struct walk_stackframe_args *args,
{
	int ret;
	struct task_struct *g, *t;
	unsigned int cpu;

	for_each_process_thread(g, t) {
		if (klp_is_migration_thread(t->comm))
@@ -288,6 +289,11 @@ static int do_check_calltrace(struct walk_stackframe_args *args,
		if (ret)
			return ret;
	}
	for_each_online_cpu(cpu) {
		ret = check_task_calltrace(idle_task(cpu), args, fn);
		if (ret)
			return ret;
	}
	return 0;
}

+6 −0
Original line number Diff line number Diff line
@@ -283,6 +283,7 @@ static int do_check_calltrace(struct walk_stackframe_args *args,
{
	int ret;
	struct task_struct *g, *t;
	unsigned int cpu;

	for_each_process_thread(g, t) {
		if (klp_is_migration_thread(t->comm))
@@ -291,6 +292,11 @@ static int do_check_calltrace(struct walk_stackframe_args *args,
		if (ret)
			return ret;
	}
	for_each_online_cpu(cpu) {
		ret = check_task_calltrace(idle_task(cpu), args, fn);
		if (ret)
			return ret;
	}
	return 0;
}

+6 −1
Original line number Diff line number Diff line
@@ -299,6 +299,7 @@ static int do_check_calltrace(bool (*fn)(void *, int *, unsigned long), void *da
{
	int ret = 0;
	struct task_struct *g, *t;
	unsigned int cpu;

	for_each_process_thread(g, t) {
		if (klp_is_migration_thread(t->comm))
@@ -308,7 +309,11 @@ static int do_check_calltrace(bool (*fn)(void *, int *, unsigned long), void *da
		if (ret)
			return ret;
	}

	for_each_online_cpu(cpu) {
		ret = check_task_calltrace(idle_task(cpu), fn, data);
		if (ret)
			return ret;
	}
	return 0;
}