From: Alexander Atanasov <alexander.atana...@virtuozzo.com>

vhost_net_release() calls vhost_net_flush() after vhost_dev_cleanup(),
trying to flush already flushed vhost_worker.

vhost_net_release()
 vhost_dev_cleanup()
  vhost_cleanup_workers()
   vhost_worker_reset()
    w->worker = NULL;   // !!!
 vhost_net_flush()
  vhost_net_flush_vq()
   vhost_poll_flush()
    vhost_work_flush_vq()
     if (!w)            // w != NULL, but w->worker == NULL
        return;
     vhost_worker_flush(w)
      vhost_work_queue_at_worker(w)
       wake_up_process(w->worker)       // crash

https://jira.sw.ru/browse/PSBM-142058

Fixes: f45287479ce4 ("drivers/vhost: add API to queue work at virtqueue
worker")

Signed-off-by: Alexander Atanasov <alexander.atana...@virtuozzo.com>
Signed-off-by: Konstantin Khorenko <khore...@virtuozzo.com>
---
 drivers/vhost/vhost.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/vhost/vhost.c b/drivers/vhost/vhost.c
index cac369ca6f0c..6f40018adda5 100644
--- a/drivers/vhost/vhost.c
+++ b/drivers/vhost/vhost.c
@@ -284,7 +284,7 @@ void vhost_work_flush_vq(struct vhost_virtqueue *vq)
 {
        struct vhost_worker *w = READ_ONCE(vq->worker);
 
-       if (!w)
+       if (!w || !w->worker)
                return;
 
        vhost_worker_flush(w);
-- 
2.31.1

_______________________________________________
Devel mailing list
Devel@openvz.org
https://lists.openvz.org/mailman/listinfo/devel

Reply via email to