From c03e7055cd0d359a41a2960a56377c8394917051 Mon Sep 17 00:00:00 2001 From: Dylan Reid Date: Fri, 8 May 2026 17:27:31 -0700 Subject: [PATCH] virtio-devices: vhost_user: skip backend reset when disconnected reset() is teardown and must still clean up local state even if the vhost-user backend has already gone away. When the disconnected flag is already set, it skips reset_vhost_user() and proceeds with kill-event, worker-unblock, event logging, and interrupt callback cleanup. Signed-off-by: Dylan Reid --- virtio-devices/src/vhost_user/mod.rs | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/virtio-devices/src/vhost_user/mod.rs b/virtio-devices/src/vhost_user/mod.rs index 5ae917997..bf28fec92 100644 --- a/virtio-devices/src/vhost_user/mod.rs +++ b/virtio-devices/src/vhost_user/mod.rs @@ -10,7 +10,7 @@ use std::{io, thread}; use anyhow::anyhow; use event_monitor::event; -use log::{error, info}; +use log::{error, info, warn}; use serde::{Deserialize, Serialize}; use thiserror::Error; use vhost::Error as VhostError; @@ -538,13 +538,24 @@ impl VhostUserCommon { error!("Failed to resume paused device during reset: {e:?}"); } - if let Some(vu) = &self.vu + // Skip reset_vhost_user if the backend is not connected. + if !self.disconnected.load(Ordering::Relaxed) + && let Some(vu) = &self.vu && let Err(e) = vu.lock().unwrap().reset_vhost_user() { - error!( - "Failed to reset vhost-user daemon for socket {}: {e:?}", - self.socket_path - ); + if e.is_transport_lost() { + warn!( + "Failed to reset vhost-user daemon for socket {}: {e:?}; \ + marking device as disconnected", + self.socket_path + ); + self.disconnected.store(true, Ordering::Relaxed); + } else { + warn!( + "Failed to reset vhost-user daemon for socket {}: {e:?}", + self.socket_path + ); + } } if let Some(kill_evt) = self.virtio_common.kill_evt.take() {