Commit 431ce839 authored by Tiezhu Yang's avatar Tiezhu Yang Committed by Huacai Chen
Browse files

LoongArch: Check return values for set_memory_{rw,rox}



set_memory_rw() and set_memory_rox() may fail, so we should check the
return values and return immediately in larch_insn_text_copy().

Cc: stable@vger.kernel.org
Signed-off-by: default avatarTiezhu Yang <yangtiezhu@loongson.cn>
Signed-off-by: default avatarHuacai Chen <chenhuacai@loongson.cn>
parent a47f0754
Loading
Loading
Loading
Loading
+13 −2
Original line number Diff line number Diff line
@@ -258,6 +258,7 @@ static int text_copy_cb(void *data)
int larch_insn_text_copy(void *dst, void *src, size_t len)
{
	int ret = 0;
	int err = 0;
	size_t start, end;
	struct insn_copy copy = {
		.dst = dst,
@@ -275,9 +276,19 @@ int larch_insn_text_copy(void *dst, void *src, size_t len)
	start = round_down((size_t)dst, PAGE_SIZE);
	end   = round_up((size_t)dst + len, PAGE_SIZE);

	set_memory_rw(start, (end - start) / PAGE_SIZE);
	err = set_memory_rw(start, (end - start) / PAGE_SIZE);
	if (err) {
		pr_info("%s: set_memory_rw() failed\n", __func__);
		return err;
	}

	ret = stop_machine_cpuslocked(text_copy_cb, &copy, cpu_online_mask);
	set_memory_rox(start, (end - start) / PAGE_SIZE);

	err = set_memory_rox(start, (end - start) / PAGE_SIZE);
	if (err) {
		pr_info("%s: set_memory_rox() failed\n", __func__);
		return err;
	}

	return ret;
}