提交 76cd04fa 编写于 作者: K Kemeng Shi 提交者: Zheng Zengkai

etmem_scan: release CPU after scan walk_step size

euleros inclusion
category: feature
feature: etmem
bugzilla: https://gitee.com/openeuler/kernel/issues/I4OODH?from=project-issue
CVE: NA

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

Now, we will call cond_resched after scan a full memslot. If we scan a huge
memslot, it will take long time before cond_resched. So call cond_resched
after scan walk_step size memory.
Signed-off-by: NKemeng Shi <shikemeng@huawei.com>
Reviewed-by: Nlouhongxiang <louhongxiang@huawei.com>
Reviewed-by: NChen Wandun <chenwandun@huawei.com>
Signed-off-by: NZheng Zengkai <zhengzengkai@huawei.com>
上级 0bb20a8f
...@@ -106,6 +106,9 @@ static struct kernel_param_ops walk_step_ops = { ...@@ -106,6 +106,9 @@ static struct kernel_param_ops walk_step_ops = {
static unsigned int __read_mostly walk_step = 512; // in PAGE_SIZE static unsigned int __read_mostly walk_step = 512; // in PAGE_SIZE
module_param_cb(walk_step, &walk_step_ops, &walk_step, 0644); module_param_cb(walk_step, &walk_step_ops, &walk_step, 0644);
static unsigned int resched_step = 10;
module_param(resched_step, uint, 0644);
static unsigned long pagetype_size[16] = { static unsigned long pagetype_size[16] = {
[PTE_ACCESSED] = PAGE_SIZE, /* 4k page */ [PTE_ACCESSED] = PAGE_SIZE, /* 4k page */
[PMD_ACCESSED] = PMD_SIZE, /* 2M page */ [PMD_ACCESSED] = PMD_SIZE, /* 2M page */
...@@ -836,6 +839,7 @@ static int vm_idle_walk_hva_range(struct page_idle_ctrl *pic, ...@@ -836,6 +839,7 @@ static int vm_idle_walk_hva_range(struct page_idle_ctrl *pic,
unsigned long addr_range; unsigned long addr_range;
unsigned long va_end; unsigned long va_end;
int ret; int ret;
int steps;
#ifdef CONFIG_X86_64 #ifdef CONFIG_X86_64
ret = ept_idle_supports_cpu(pic->kvm); ret = ept_idle_supports_cpu(pic->kvm);
...@@ -863,6 +867,7 @@ static int vm_idle_walk_hva_range(struct page_idle_ctrl *pic, ...@@ -863,6 +867,7 @@ static int vm_idle_walk_hva_range(struct page_idle_ctrl *pic,
} else { } else {
pic->gpa_to_hva = start - gpa_addr; pic->gpa_to_hva = start - gpa_addr;
gpa_end = gpa_addr + addr_range; gpa_end = gpa_addr + addr_range;
steps = 0;
for (; gpa_addr < gpa_end;) { for (; gpa_addr < gpa_end;) {
gpa_next = min(gpa_end, gpa_addr + walk_step * PAGE_SIZE); gpa_next = min(gpa_end, gpa_addr + walk_step * PAGE_SIZE);
#ifdef CONFIG_ARM64 #ifdef CONFIG_ARM64
...@@ -874,6 +879,11 @@ static int vm_idle_walk_hva_range(struct page_idle_ctrl *pic, ...@@ -874,6 +879,11 @@ static int vm_idle_walk_hva_range(struct page_idle_ctrl *pic,
if (ret) if (ret)
break; break;
if (++steps >= resched_step) {
cond_resched();
steps = 0;
}
} }
va_end = pic->gpa_to_hva + gpa_end; va_end = pic->gpa_to_hva + gpa_end;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册