| From foo@baz Sun 09 Feb 2020 10:47:54 PM CET |
| From: Ido Schimmel <idosch@mellanox.com> |
| Date: Fri, 7 Feb 2020 19:29:28 +0200 |
| Subject: drop_monitor: Do not cancel uninitialized work item |
| |
| From: Ido Schimmel <idosch@mellanox.com> |
| |
| [ Upstream commit dfa7f709596be5ca46c070d4f8acbb344322056a ] |
| |
| Drop monitor uses a work item that takes care of constructing and |
| sending netlink notifications to user space. In case drop monitor never |
| started to monitor, then the work item is uninitialized and not |
| associated with a function. |
| |
| Therefore, a stop command from user space results in canceling an |
| uninitialized work item which leads to the following warning [1]. |
| |
| Fix this by not processing a stop command if drop monitor is not |
| currently monitoring. |
| |
| [1] |
| [ 31.735402] ------------[ cut here ]------------ |
| [ 31.736470] WARNING: CPU: 0 PID: 143 at kernel/workqueue.c:3032 __flush_work+0x89f/0x9f0 |
| ... |
| [ 31.738120] CPU: 0 PID: 143 Comm: dwdump Not tainted 5.5.0-custom-09491-g16d4077796b8 #727 |
| [ 31.741968] RIP: 0010:__flush_work+0x89f/0x9f0 |
| ... |
| [ 31.760526] Call Trace: |
| [ 31.771689] __cancel_work_timer+0x2a6/0x3b0 |
| [ 31.776809] net_dm_cmd_trace+0x300/0xef0 |
| [ 31.777549] genl_rcv_msg+0x5c6/0xd50 |
| [ 31.781005] netlink_rcv_skb+0x13b/0x3a0 |
| [ 31.784114] genl_rcv+0x29/0x40 |
| [ 31.784720] netlink_unicast+0x49f/0x6a0 |
| [ 31.787148] netlink_sendmsg+0x7cf/0xc80 |
| [ 31.790426] ____sys_sendmsg+0x620/0x770 |
| [ 31.793458] ___sys_sendmsg+0xfd/0x170 |
| [ 31.802216] __sys_sendmsg+0xdf/0x1a0 |
| [ 31.806195] do_syscall_64+0xa0/0x540 |
| [ 31.806885] entry_SYSCALL_64_after_hwframe+0x49/0xbe |
| |
| Fixes: 8e94c3bc922e ("drop_monitor: Allow user to start monitoring hardware drops") |
| Signed-off-by: Ido Schimmel <idosch@mellanox.com> |
| Reviewed-by: Jiri Pirko <jiri@mellanox.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| net/core/drop_monitor.c | 4 +++- |
| 1 file changed, 3 insertions(+), 1 deletion(-) |
| |
| --- a/net/core/drop_monitor.c |
| +++ b/net/core/drop_monitor.c |
| @@ -1004,8 +1004,10 @@ static void net_dm_hw_monitor_stop(struc |
| { |
| int cpu; |
| |
| - if (!monitor_hw) |
| + if (!monitor_hw) { |
| NL_SET_ERR_MSG_MOD(extack, "Hardware monitoring already disabled"); |
| + return; |
| + } |
| |
| monitor_hw = false; |
| |