Commit c2fda50
workqueue: allow work_on_cpu() to be called recursively
If the @fn call work_on_cpu() again, the lockdep will complain:
> [ INFO: possible recursive locking detected ]
> 3.11.0-rc1-lockdep-fix-a #6 Not tainted
> ---------------------------------------------
> kworker/0:1/142 is trying to acquire lock:
> ((&wfc.work)){+.+.+.}, at: [<ffffffff81077100>] flush_work+0x0/0xb0
>
> but task is already holding lock:
> ((&wfc.work)){+.+.+.}, at: [<ffffffff81075dd9>] process_one_work+0x169/0x610
>
> other info that might help us debug this:
> Possible unsafe locking scenario:
>
> CPU0
> ----
> lock((&wfc.work));
> lock((&wfc.work));
>
> *** DEADLOCK ***
It is false-positive lockdep report. In this sutiation,
the two "wfc"s of the two work_on_cpu() are different,
they are both on stack. flush_work() can't be deadlock.
To fix this, we need to avoid the lockdep checking in this case,
thus we instroduce a internal __flush_work() which skip the lockdep.
tj: Minor comment adjustment.
Signed-off-by: Lai Jiangshan <[email protected]>
Reported-by: "Srivatsa S. Bhat" <[email protected]>
Reported-by: Alexander Duyck <[email protected]>
Signed-off-by: Tejun Heo <[email protected]>1 parent ad81f05 commit c2fda50
1 file changed
+22
-10
lines changed| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
2817 | 2817 | | |
2818 | 2818 | | |
2819 | 2819 | | |
| 2820 | + | |
| 2821 | + | |
| 2822 | + | |
| 2823 | + | |
| 2824 | + | |
| 2825 | + | |
| 2826 | + | |
| 2827 | + | |
| 2828 | + | |
| 2829 | + | |
| 2830 | + | |
| 2831 | + | |
| 2832 | + | |
2820 | 2833 | | |
2821 | 2834 | | |
2822 | 2835 | | |
| |||
2830 | 2843 | | |
2831 | 2844 | | |
2832 | 2845 | | |
2833 | | - | |
2834 | | - | |
2835 | 2846 | | |
2836 | 2847 | | |
2837 | 2848 | | |
2838 | | - | |
2839 | | - | |
2840 | | - | |
2841 | | - | |
2842 | | - | |
2843 | | - | |
2844 | | - | |
| 2849 | + | |
2845 | 2850 | | |
2846 | 2851 | | |
2847 | 2852 | | |
| |||
4756 | 4761 | | |
4757 | 4762 | | |
4758 | 4763 | | |
4759 | | - | |
| 4764 | + | |
| 4765 | + | |
| 4766 | + | |
| 4767 | + | |
| 4768 | + | |
| 4769 | + | |
| 4770 | + | |
| 4771 | + | |
4760 | 4772 | | |
4761 | 4773 | | |
4762 | 4774 | | |
| |||
0 commit comments