From: Yang Wei <yang.wei@xxxxxxxxxxxxxxxxx> We found _set_memory_array() and set_memory_array_wb() takes more than 500ms in kernel space in the following scenario. So use this patch to trigger schedule for each page, to avoid other threads getting stuck. 0xffffffff810a34d2 find_next_iomem_res ([kernel.kallsyms]) 0xffffffff810a3d40 walk_system_ram_range ([kernel.kallsyms]) 0xffffffff810772ca pat_pagerange_is_ram ([kernel.kallsyms]) 0xffffffff8107796f reserve_memtype ([kernel.kallsyms]) 0xffffffff81075e98 _set_memory_array ([kernel.kallsyms]) 0xffffffffc0ef6083 nv_alloc_system_pages [nvidia] ([kernel.kallsyms]) 0xffffffff810a34d2 find_next_iomem_res ([kernel.kallsyms]) 0xffffffff810a3d40 walk_system_ram_range ([kernel.kallsyms]) 0xffffffff810772ca pat_pagerange_is_ram ([kernel.kallsyms]) 0xffffffff8107745a free_memtype.part.7 ([kernel.kallsyms]) 0xffffffff8107606e set_memory_array_wb ([kernel.kallsyms]) 0xffffffffc0ef6291 nv_free_system_pages [nvidia]([kernel.kallsyms]) Signed-off-by: Yang Wei <yang.wei@xxxxxxxxxxxxxxxxx> Tested-by: Yang Wei <yang.wei@xxxxxxxxxxxxxxxxx> --- arch/x86/mm/pageattr.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/arch/x86/mm/pageattr.c b/arch/x86/mm/pageattr.c index 101f3ad..f7c67b8 100644 --- a/arch/x86/mm/pageattr.c +++ b/arch/x86/mm/pageattr.c @@ -1625,6 +1625,7 @@ static int _set_memory_array(unsigned long *addr, int addrinarray, new_type, NULL); if (ret) goto out_free; + cond_resched(); } /* If WC, set to UC- first and then WC */ @@ -1989,6 +1990,7 @@ int set_pages_array_wb(struct page **pages, int addrinarray) start = page_to_pfn(pages[i]) << PAGE_SHIFT; end = start + PAGE_SIZE; free_memtype(start, end); + cond_resched(); } return 0; -- 1.8.3.1