| From foo@baz Thu Feb 1 14:00:34 CET 2018 |
| From: Yisheng Xie <xieyisheng1@huawei.com> |
| Date: Wed, 29 Nov 2017 16:11:08 -0800 |
| Subject: kmemleak: add scheduling point to kmemleak_scan() |
| |
| From: Yisheng Xie <xieyisheng1@huawei.com> |
| |
| |
| [ Upstream commit bde5f6bc68db51128f875a756e9082a6c6ff7b4c ] |
| |
| kmemleak_scan() will scan struct page for each node and it can be really |
| large and resulting in a soft lockup. We have seen a soft lockup when |
| do scan while compile kernel: |
| |
| watchdog: BUG: soft lockup - CPU#53 stuck for 22s! [bash:10287] |
| [...] |
| Call Trace: |
| kmemleak_scan+0x21a/0x4c0 |
| kmemleak_write+0x312/0x350 |
| full_proxy_write+0x5a/0xa0 |
| __vfs_write+0x33/0x150 |
| vfs_write+0xad/0x1a0 |
| SyS_write+0x52/0xc0 |
| do_syscall_64+0x61/0x1a0 |
| entry_SYSCALL64_slow_path+0x25/0x25 |
| |
| Fix this by adding cond_resched every MAX_SCAN_SIZE. |
| |
| Link: http://lkml.kernel.org/r/1511439788-20099-1-git-send-email-xieyisheng1@huawei.com |
| Signed-off-by: Yisheng Xie <xieyisheng1@huawei.com> |
| Suggested-by: Catalin Marinas <catalin.marinas@arm.com> |
| Acked-by: Catalin Marinas <catalin.marinas@arm.com> |
| Cc: Michal Hocko <mhocko@kernel.org> |
| Signed-off-by: Andrew Morton <akpm@linux-foundation.org> |
| Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> |
| Signed-off-by: Sasha Levin <alexander.levin@microsoft.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| mm/kmemleak.c | 2 ++ |
| 1 file changed, 2 insertions(+) |
| |
| --- a/mm/kmemleak.c |
| +++ b/mm/kmemleak.c |
| @@ -1442,6 +1442,8 @@ static void kmemleak_scan(void) |
| if (page_count(page) == 0) |
| continue; |
| scan_block(page, page + 1, NULL); |
| + if (!(pfn % (MAX_SCAN_SIZE / sizeof(*page)))) |
| + cond_resched(); |
| } |
| } |
| put_online_mems(); |