From: Yang Wei <redacted>
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 <redacted>
Tested-by: Yang Wei <redacted>
---
arch/x86/mm/pageattr.c | 2 ++
1 file changed, 2 insertions(+)
@@ -1625,6 +1625,7 @@ static int _set_memory_array(unsigned long *addr, int addrinarray,new_type,NULL);if(ret)gotoout_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();}return0;
On Fri, Nov 26, 2021 at 03:32:26PM +0800, Yang Wei wrote:
From: Yang Wei <redacted>
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 <redacted>
Tested-by: Yang Wei <redacted>
---
arch/x86/mm/pageattr.c | 2 ++
1 file changed, 2 insertions(+)
On Fri, Nov 26, 2021 at 03:32:26PM +0800, Yang Wei wrote:
From: Yang Wei <redacted>
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 <redacted>
Tested-by: Yang Wei <redacted>
---
arch/x86/mm/pageattr.c | 2 ++
1 file changed, 2 insertions(+)
Why is this 4.19-only?
What commit in Linus's tree resolved this issue?
confused,
greg k-h
On Fri, Nov 26, 2021 at 03:32:26PM +0800, Yang Wei wrote:
quoted
From: Yang Wei <redacted>
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 <redacted>
Tested-by: Yang Wei <redacted>
---
arch/x86/mm/pageattr.c | 2 ++
1 file changed, 2 insertions(+)
Why is this 4.19-only?
What commit in Linus's tree resolved this issue?
confused,
greg k-h
We found that the nvidia driver calling
nv_alloc_system_pages()/nv_free_system_pages()
takes long-time in kernel space, which makes other threads getting stuck
on non-preemptible
kernel. And it causes the GPU to drop frames on our 4.19 host environment.
This patch can significantly reduce dropped frames. We are currently
only testing on
4.19, but it should also workson 4.4, 4.9 and 4.14.
The set_memory_array_wb() and set_memory_array_xx() have been removed
since 5.4, so
Linus's tree does not including the fix of this issue.
We found that the nvidia driver calling
nv_alloc_system_pages()/nv_free_system_pages()
Is that the proprietary nvidia driver?
Nvidia display driver 460.73.01. Since there is no source code, we
cannot modify and recompile the driver. I think the kernel interface
set_memory_array_wb()/set_memory_array_xx() should be adapted to any
parameter input.
On Sun, Nov 28, 2021 at 12:25:23AM +0800, YangWei wrote:
在 2021/11/27 00:36, Greg KH 写道:
quoted
On Fri, Nov 26, 2021 at 03:32:26PM +0800, Yang Wei wrote:
quoted
From: Yang Wei <redacted>
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 <redacted>
Tested-by: Yang Wei <redacted>
---
arch/x86/mm/pageattr.c | 2 ++
1 file changed, 2 insertions(+)
Why is this 4.19-only?
What commit in Linus's tree resolved this issue?
confused,
greg k-h
We found that the nvidia driver calling
nv_alloc_system_pages()/nv_free_system_pages()
For obvious reasons, we do not care about this type of problem at all.
Please contact the vendor responsible for this as they are the only ones
who can do anything about it.
good luck!
greg k-h