]>
Commit | Line | Data |
---|---|---|
91861a69 SL |
1 | From d06a65eb150d08894215bf135d895dd1a7fd926d Mon Sep 17 00:00:00 2001 |
2 | From: Sahitya Tummala <stummala@codeaurora.org> | |
3 | Date: Mon, 4 Feb 2019 13:36:53 +0530 | |
4 | Subject: f2fs: do not use mutex lock in atomic context | |
5 | ||
6 | [ Upstream commit 9083977dabf3833298ddcd40dee28687f1e6b483 ] | |
7 | ||
8 | Fix below warning coming because of using mutex lock in atomic context. | |
9 | ||
10 | BUG: sleeping function called from invalid context at kernel/locking/mutex.c:98 | |
11 | in_atomic(): 1, irqs_disabled(): 0, pid: 585, name: sh | |
12 | Preemption disabled at: __radix_tree_preload+0x28/0x130 | |
13 | Call trace: | |
14 | dump_backtrace+0x0/0x2b4 | |
15 | show_stack+0x20/0x28 | |
16 | dump_stack+0xa8/0xe0 | |
17 | ___might_sleep+0x144/0x194 | |
18 | __might_sleep+0x58/0x8c | |
19 | mutex_lock+0x2c/0x48 | |
20 | f2fs_trace_pid+0x88/0x14c | |
21 | f2fs_set_node_page_dirty+0xd0/0x184 | |
22 | ||
23 | Do not use f2fs_radix_tree_insert() to avoid doing cond_resched() with | |
24 | spin_lock() acquired. | |
25 | ||
26 | Signed-off-by: Sahitya Tummala <stummala@codeaurora.org> | |
27 | Reviewed-by: Chao Yu <yuchao0@huawei.com> | |
28 | Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org> | |
29 | Signed-off-by: Sasha Levin <sashal@kernel.org> | |
30 | --- | |
31 | fs/f2fs/trace.c | 8 +++++++- | |
32 | 1 file changed, 7 insertions(+), 1 deletion(-) | |
33 | ||
34 | diff --git a/fs/f2fs/trace.c b/fs/f2fs/trace.c | |
35 | index 145fb659ad44..8f327fa7ae47 100644 | |
36 | --- a/fs/f2fs/trace.c | |
37 | +++ b/fs/f2fs/trace.c | |
38 | @@ -60,6 +60,7 @@ void f2fs_trace_pid(struct page *page) | |
39 | ||
40 | page->private = pid; | |
41 | ||
42 | +retry: | |
43 | if (radix_tree_preload(GFP_NOFS)) | |
44 | return; | |
45 | ||
46 | @@ -70,7 +71,12 @@ void f2fs_trace_pid(struct page *page) | |
47 | if (p) | |
48 | radix_tree_delete(&pids, pid); | |
49 | ||
50 | - f2fs_radix_tree_insert(&pids, pid, current); | |
51 | + if (radix_tree_insert(&pids, pid, current)) { | |
52 | + spin_unlock(&pids_lock); | |
53 | + radix_tree_preload_end(); | |
54 | + cond_resched(); | |
55 | + goto retry; | |
56 | + } | |
57 | ||
58 | trace_printk("%3x:%3x %4x %-16s\n", | |
59 | MAJOR(inode->i_sb->s_dev), MINOR(inode->i_sb->s_dev), | |
60 | -- | |
61 | 2.19.1 | |
62 |