mirror of
https://github.com/cloud-hypervisor/cloud-hypervisor.git
synced 2026-08-05 02:19:16 +00:00
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 <dgreid@fb.com>
This commit is contained in:
@@ -10,7 +10,7 @@ use std::{io, thread};
|
|||||||
|
|
||||||
use anyhow::anyhow;
|
use anyhow::anyhow;
|
||||||
use event_monitor::event;
|
use event_monitor::event;
|
||||||
use log::{error, info};
|
use log::{error, info, warn};
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
use thiserror::Error;
|
use thiserror::Error;
|
||||||
use vhost::Error as VhostError;
|
use vhost::Error as VhostError;
|
||||||
@@ -538,13 +538,24 @@ impl VhostUserCommon {
|
|||||||
error!("Failed to resume paused device during reset: {e:?}");
|
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()
|
&& let Err(e) = vu.lock().unwrap().reset_vhost_user()
|
||||||
{
|
{
|
||||||
error!(
|
if e.is_transport_lost() {
|
||||||
"Failed to reset vhost-user daemon for socket {}: {e:?}",
|
warn!(
|
||||||
self.socket_path
|
"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() {
|
if let Some(kill_evt) = self.virtio_common.kill_evt.take() {
|
||||||
|
|||||||
Reference in New Issue
Block a user