Commit 01be597e authored by Eric Dumazet's avatar Eric Dumazet Committed by Liu Jian
Browse files

net: linkwatch: use system_unbound_wq

stable inclusion
from stable-v4.19.320
commit 3840189e4619af11f558e6faff80813f008246a6
category: bugfix
bugzilla: https://gitee.com/openeuler/kernel/issues/IAYZ0U

Reference: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?id=3840189e4619af11f558e6faff80813f008246a6



-------------------------------------------------

[ Upstream commit 3e7917c0cdad835a5121520fc5686d954b7a61ab ]

linkwatch_event() grabs possibly very contended RTNL mutex.

system_wq is not suitable for such work.

Inspired by many noisy syzbot reports.

3 locks held by kworker/0:7/5266:
 #0: ffff888015480948 ((wq_completion)events){+.+.}-{0:0}, at: process_one_work kernel/workqueue.c:3206 [inline]
 #0: ffff888015480948 ((wq_completion)events){+.+.}-{0:0}, at: process_scheduled_works+0x90a/0x1830 kernel/workqueue.c:3312
 #1: ffffc90003f6fd00 ((linkwatch_work).work){+.+.}-{0:0}, at: process_one_work kernel/workqueue.c:3207 [inline]
 , at: process_scheduled_works+0x945/0x1830 kernel/workqueue.c:3312
 #2: ffffffff8fa6f208 (rtnl_mutex){+.+.}-{3:3}, at: linkwatch_event+0xe/0x60 net/core/link_watch.c:276

Reported-by: default avatarsyzbot <syzkaller@googlegroups.com>
Fixes: 1da177e4 ("Linux-2.6.12-rc2")
Signed-off-by: default avatarEric Dumazet <edumazet@google.com>
Reviewed-by: default avatarKuniyuki Iwashima <kuniyu@amazon.com>
Link: https://patch.msgid.link/20240805085821.1616528-1-edumazet@google.com


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
Signed-off-by: default avatarLiu Jian <liujian56@huawei.com>
parent edb6b9ec
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -135,9 +135,9 @@ static void linkwatch_schedule_work(int urgent)
	 * override the existing timer.
	 */
	if (test_bit(LW_URGENT, &linkwatch_flags))
		mod_delayed_work(system_wq, &linkwatch_work, 0);
		mod_delayed_work(system_unbound_wq, &linkwatch_work, 0);
	else
		schedule_delayed_work(&linkwatch_work, delay);
		queue_delayed_work(system_unbound_wq, &linkwatch_work, delay);
}