Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

xen-netback: stop the guest rx thread after a fatal error

After commit e9d8b2c2968499c1f96563e6522c56958d5a1d0d (xen-netback:
disable rogue vif in kthread context), a fatal (protocol) error would
leave the guest Rx thread spinning, wasting CPU time. Commit
ecf08d2dbb96d5a4b4bcc53a39e8d29cc8fef02e (xen-netback: reintroduce
guest Rx stall detection) made this even worse by removing a
cond_resched() from this path.

Since a fatal error is non-recoverable, just allow the guest Rx thread
to exit. This requires taking additional refs to the task so the
thread exiting early is handled safely.

Signed-off-by: David Vrabel <david.vrabel@citrix.com>
Reported-by: Julien Grall <julien.grall@linaro.org>
Tested-by: Julien Grall <julien.grall@linaro.org>
Acked-by: Wei Liu <wei.liu2@citrix.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

David Vrabel and committed by
David S. Miller
42b5212f 5a2e87b1

+3 -2
+2
drivers/net/xen-netback/interface.c
··· 578 578 goto err_rx_unbind; 579 579 } 580 580 queue->task = task; 581 + get_task_struct(task); 581 582 582 583 task = kthread_create(xenvif_dealloc_kthread, 583 584 (void *)queue, "%s-dealloc", queue->name); ··· 635 634 636 635 if (queue->task) { 637 636 kthread_stop(queue->task); 637 + put_task_struct(queue->task); 638 638 queue->task = NULL; 639 639 } 640 640
+1 -2
drivers/net/xen-netback/netback.c
··· 2109 2109 */ 2110 2110 if (unlikely(vif->disabled && queue->id == 0)) { 2111 2111 xenvif_carrier_off(vif); 2112 - xenvif_rx_queue_purge(queue); 2113 - continue; 2112 + break; 2114 2113 } 2115 2114 2116 2115 if (!skb_queue_empty(&queue->rx_queue))