]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/blob - queue-5.0/mlxsw-core-do-not-use-wq_mem_reclaim-for-mlxsw-ordered-workqueue.patch
5.0-stable patches
[thirdparty/kernel/stable-queue.git] / queue-5.0 / mlxsw-core-do-not-use-wq_mem_reclaim-for-mlxsw-ordered-workqueue.patch
1 From foo@baz Sat Apr 20 16:43:09 CEST 2019
2 From: Ido Schimmel <idosch@mellanox.com>
3 Date: Wed, 10 Apr 2019 06:58:14 +0000
4 Subject: mlxsw: core: Do not use WQ_MEM_RECLAIM for mlxsw ordered workqueue
5
6 From: Ido Schimmel <idosch@mellanox.com>
7
8 [ Upstream commit 4af0699782e2cc7d0d89db9eb6f8844dd3df82dc ]
9
10 The ordered workqueue is used to offload various objects such as routes
11 and neighbours in the order they are notified.
12
13 It should not be called as part of memory reclaim path, so remove the
14 WQ_MEM_RECLAIM flag. This can also result in a warning [1], if a worker
15 tries to flush a non-WQ_MEM_RECLAIM workqueue.
16
17 [1]
18 [97703.542861] workqueue: WQ_MEM_RECLAIM mlxsw_core_ordered:mlxsw_sp_router_fib6_event_work [mlxsw_spectrum] is flushing !WQ_MEM_RECLAIM events:rht_deferred_worker
19 [97703.542884] WARNING: CPU: 1 PID: 32492 at kernel/workqueue.c:2605 check_flush_dependency+0xb5/0x130
20 ...
21 [97703.542988] Hardware name: Mellanox Technologies Ltd. MSN3700C/VMOD0008, BIOS 5.11 10/10/2018
22 [97703.543049] Workqueue: mlxsw_core_ordered mlxsw_sp_router_fib6_event_work [mlxsw_spectrum]
23 [97703.543061] RIP: 0010:check_flush_dependency+0xb5/0x130
24 ...
25 [97703.543071] RSP: 0018:ffffb3f08137bc00 EFLAGS: 00010086
26 [97703.543076] RAX: 0000000000000000 RBX: ffff96e07740ae00 RCX: 0000000000000000
27 [97703.543080] RDX: 0000000000000094 RSI: ffffffff82dc1934 RDI: 0000000000000046
28 [97703.543084] RBP: ffffb3f08137bc20 R08: ffffffff82dc18a0 R09: 00000000000225c0
29 [97703.543087] R10: 0000000000000000 R11: 0000000000007eec R12: ffffffff816e4ee0
30 [97703.543091] R13: ffff96e06f6a5c00 R14: ffff96e077ba7700 R15: ffffffff812ab0c0
31 [97703.543097] FS: 0000000000000000(0000) GS:ffff96e077a80000(0000) knlGS:0000000000000000
32 [97703.543101] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
33 [97703.543104] CR2: 00007f8cd135b280 CR3: 00000001e860e003 CR4: 00000000003606e0
34 [97703.543109] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
35 [97703.543112] DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
36 [97703.543115] Call Trace:
37 [97703.543129] __flush_work+0xbd/0x1e0
38 [97703.543137] ? __cancel_work_timer+0x136/0x1b0
39 [97703.543145] ? pwq_dec_nr_in_flight+0x49/0xa0
40 [97703.543154] __cancel_work_timer+0x136/0x1b0
41 [97703.543175] ? mlxsw_reg_trans_bulk_wait+0x145/0x400 [mlxsw_core]
42 [97703.543184] cancel_work_sync+0x10/0x20
43 [97703.543191] rhashtable_free_and_destroy+0x23/0x140
44 [97703.543198] rhashtable_destroy+0xd/0x10
45 [97703.543254] mlxsw_sp_fib_destroy+0xb1/0xf0 [mlxsw_spectrum]
46 [97703.543310] mlxsw_sp_vr_put+0xa8/0xc0 [mlxsw_spectrum]
47 [97703.543364] mlxsw_sp_fib_node_put+0xbf/0x140 [mlxsw_spectrum]
48 [97703.543418] ? mlxsw_sp_fib6_entry_destroy+0xe8/0x110 [mlxsw_spectrum]
49 [97703.543475] mlxsw_sp_router_fib6_event_work+0x6cd/0x7f0 [mlxsw_spectrum]
50 [97703.543484] process_one_work+0x1fd/0x400
51 [97703.543493] worker_thread+0x34/0x410
52 [97703.543500] kthread+0x121/0x140
53 [97703.543507] ? process_one_work+0x400/0x400
54 [97703.543512] ? kthread_park+0x90/0x90
55 [97703.543523] ret_from_fork+0x35/0x40
56
57 Fixes: a3832b31898f ("mlxsw: core: Create an ordered workqueue for FIB offload")
58 Signed-off-by: Ido Schimmel <idosch@mellanox.com>
59 Reported-by: Semion Lisyansky <semionl@mellanox.com>
60 Acked-by: Jiri Pirko <jiri@mellanox.com>
61 Signed-off-by: David S. Miller <davem@davemloft.net>
62 Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
63 ---
64 drivers/net/ethernet/mellanox/mlxsw/core.c | 2 +-
65 1 file changed, 1 insertion(+), 1 deletion(-)
66
67 --- a/drivers/net/ethernet/mellanox/mlxsw/core.c
68 +++ b/drivers/net/ethernet/mellanox/mlxsw/core.c
69 @@ -1915,7 +1915,7 @@ static int __init mlxsw_core_module_init
70 mlxsw_wq = alloc_workqueue(mlxsw_core_driver_name, WQ_MEM_RECLAIM, 0);
71 if (!mlxsw_wq)
72 return -ENOMEM;
73 - mlxsw_owq = alloc_ordered_workqueue("%s_ordered", WQ_MEM_RECLAIM,
74 + mlxsw_owq = alloc_ordered_workqueue("%s_ordered", 0,
75 mlxsw_core_driver_name);
76 if (!mlxsw_owq) {
77 err = -ENOMEM;