mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/xiang/erofs.git
synced 2026-10-28 12:53:14 +01:00
vhost_net: fix sleeping with preempt-disabled in vhost_net_busy_poll()
syzbot reported "sleeping function called from invalid context" in vhost_net_busy_poll(). Commit0308813724("vhost_net: basic polling support") introduced a busy-poll loop and preempt_{disable,enable}() around it, where each iteration calls a sleepable function inside the loop. The purpose of disabling preemption was to keep local_clock()-based timeout accounting on a single CPU, rather than as a requirement of busy-poll itself: https://lore.kernel.org/[email protected] From this perspective, migrate_disable() is sufficient here, so replace preempt_disable() with migrate_disable(), avoiding sleepable accesses from a preempt-disabled context. Fixes:0308813724("vhost_net: basic polling support") Tested-by: [email protected] Reported-by: [email protected] Closes: https://lore.kernel.org/all/[email protected]/T/ Signed-off-by: Kohei Enju <[email protected]> Acked-by: Michael S. Tsirkin <[email protected]> Signed-off-by: Jakub Kicinski <[email protected]>
This commit is contained in:
1 parent
076b8cad77
commit
e08a9fac5c
1 file changed
+2
-2
+2
-2
@@ -560,7 +560,7 @@ static void vhost_net_busy_poll(struct vhost_net *net,
|
||||
busyloop_timeout = poll_rx ? rvq->busyloop_timeout:
|
||||
tvq->busyloop_timeout;
|
||||
|
||||
preempt_disable();
|
||||
migrate_disable();
|
||||
endtime = busy_clock() + busyloop_timeout;
|
||||
|
||||
while (vhost_can_busy_poll(endtime)) {
|
||||
@@ -577,7 +577,7 @@ static void vhost_net_busy_poll(struct vhost_net *net,
|
||||
cpu_relax();
|
||||
}
|
||||
|
||||
preempt_enable();
|
||||
migrate_enable();
|
||||
|
||||
if (poll_rx || sock_has_rx_data(sock))
|
||||
vhost_net_busy_poll_try_queue(net, vq);
|
||||
|
||||
Reference in new issue
Block a user