mirror of
https://github.com/cloud-hypervisor/cloud-hypervisor.git
synced 2024-10-01 11:05:46 +00:00
vmm: Remove self-spawning functionality for vhost-user-{net,block}
This also removes the need to lookup up the "exe" symlink for finding the VMM executable path. Fixes: #1925 Signed-off-by: Rob Bradford <robert.bradford@intel.com>
This commit is contained in:
parent
0005d11e32
commit
7b77f1ef90
@ -63,10 +63,8 @@ use std::num::Wrapping;
|
|||||||
use std::os::unix::fs::OpenOptionsExt;
|
use std::os::unix::fs::OpenOptionsExt;
|
||||||
#[cfg(feature = "kvm")]
|
#[cfg(feature = "kvm")]
|
||||||
use std::os::unix::io::FromRawFd;
|
use std::os::unix::io::FromRawFd;
|
||||||
use std::path::PathBuf;
|
|
||||||
use std::result;
|
use std::result;
|
||||||
use std::sync::{Arc, Mutex};
|
use std::sync::{Arc, Mutex};
|
||||||
use tempfile::NamedTempFile;
|
|
||||||
#[cfg(feature = "kvm")]
|
#[cfg(feature = "kvm")]
|
||||||
use vfio_ioctls::{VfioContainer, VfioDevice, VfioDmaMapping};
|
use vfio_ioctls::{VfioContainer, VfioDevice, VfioDmaMapping};
|
||||||
use virtio_devices::transport::VirtioPciDevice;
|
use virtio_devices::transport::VirtioPciDevice;
|
||||||
@ -733,12 +731,6 @@ pub struct DeviceManager {
|
|||||||
// which prevents cyclic dependencies.
|
// which prevents cyclic dependencies.
|
||||||
bus_devices: Vec<Arc<Mutex<dyn BusDevice>>>,
|
bus_devices: Vec<Arc<Mutex<dyn BusDevice>>>,
|
||||||
|
|
||||||
// The path to the VMM for self spawning
|
|
||||||
vmm_path: PathBuf,
|
|
||||||
|
|
||||||
// Backends that have been spawned
|
|
||||||
vhost_user_backends: Vec<ActivatedBackend>,
|
|
||||||
|
|
||||||
// Counter to keep track of the consumed device IDs.
|
// Counter to keep track of the consumed device IDs.
|
||||||
device_id_cnt: Wrapping<usize>,
|
device_id_cnt: Wrapping<usize>,
|
||||||
|
|
||||||
@ -799,7 +791,6 @@ impl DeviceManager {
|
|||||||
memory_manager: Arc<Mutex<MemoryManager>>,
|
memory_manager: Arc<Mutex<MemoryManager>>,
|
||||||
_exit_evt: &EventFd,
|
_exit_evt: &EventFd,
|
||||||
reset_evt: &EventFd,
|
reset_evt: &EventFd,
|
||||||
vmm_path: PathBuf,
|
|
||||||
seccomp_action: SeccompAction,
|
seccomp_action: SeccompAction,
|
||||||
#[cfg(feature = "acpi")] numa_nodes: NumaNodes,
|
#[cfg(feature = "acpi")] numa_nodes: NumaNodes,
|
||||||
) -> DeviceManagerResult<Arc<Mutex<Self>>> {
|
) -> DeviceManagerResult<Arc<Mutex<Self>>> {
|
||||||
@ -839,8 +830,6 @@ impl DeviceManager {
|
|||||||
memory_manager,
|
memory_manager,
|
||||||
virtio_devices: Vec::new(),
|
virtio_devices: Vec::new(),
|
||||||
bus_devices: Vec::new(),
|
bus_devices: Vec::new(),
|
||||||
vmm_path,
|
|
||||||
vhost_user_backends: Vec::new(),
|
|
||||||
device_id_cnt: Wrapping(0),
|
device_id_cnt: Wrapping(0),
|
||||||
pci_bus: None,
|
pci_bus: None,
|
||||||
msi_interrupt_manager,
|
msi_interrupt_manager,
|
||||||
@ -1580,39 +1569,6 @@ impl DeviceManager {
|
|||||||
Ok(devices)
|
Ok(devices)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Launch block backend
|
|
||||||
fn start_block_backend(&mut self, disk_cfg: &DiskConfig) -> DeviceManagerResult<String> {
|
|
||||||
let _socket_file = NamedTempFile::new().map_err(DeviceManagerError::CreateSocketFile)?;
|
|
||||||
let socket = _socket_file.path().to_str().unwrap().to_owned();
|
|
||||||
|
|
||||||
let child = std::process::Command::new(&self.vmm_path)
|
|
||||||
.args(&[
|
|
||||||
"--block-backend",
|
|
||||||
&format!(
|
|
||||||
"path={},socket={},num_queues={},queue_size={}",
|
|
||||||
disk_cfg
|
|
||||||
.path
|
|
||||||
.as_ref()
|
|
||||||
.ok_or(DeviceManagerError::NoDiskPath)?
|
|
||||||
.to_str()
|
|
||||||
.unwrap(),
|
|
||||||
&socket,
|
|
||||||
disk_cfg.num_queues,
|
|
||||||
disk_cfg.queue_size
|
|
||||||
),
|
|
||||||
])
|
|
||||||
.spawn()
|
|
||||||
.map_err(DeviceManagerError::SpawnBlockBackend)?;
|
|
||||||
|
|
||||||
// The ActivatedBackend::drop() will automatically reap the child
|
|
||||||
self.vhost_user_backends.push(ActivatedBackend {
|
|
||||||
child,
|
|
||||||
_socket_file,
|
|
||||||
});
|
|
||||||
|
|
||||||
Ok(socket)
|
|
||||||
}
|
|
||||||
|
|
||||||
fn make_virtio_block_device(
|
fn make_virtio_block_device(
|
||||||
&mut self,
|
&mut self,
|
||||||
disk_cfg: &mut DiskConfig,
|
disk_cfg: &mut DiskConfig,
|
||||||
@ -1626,14 +1582,9 @@ impl DeviceManager {
|
|||||||
};
|
};
|
||||||
|
|
||||||
if disk_cfg.vhost_user {
|
if disk_cfg.vhost_user {
|
||||||
let socket = if let Some(socket) = disk_cfg.vhost_socket.clone() {
|
let socket = disk_cfg.vhost_socket.as_ref().unwrap().clone();
|
||||||
socket
|
|
||||||
} else {
|
|
||||||
warn!("Self-spawning of vhost-user block backend is deprecated and will be removed in a future release.");
|
|
||||||
self.start_block_backend(disk_cfg)?
|
|
||||||
};
|
|
||||||
let vu_cfg = VhostUserConfig {
|
let vu_cfg = VhostUserConfig {
|
||||||
socket: socket.clone(),
|
socket,
|
||||||
num_queues: disk_cfg.num_queues,
|
num_queues: disk_cfg.num_queues,
|
||||||
queue_size: disk_cfg.queue_size,
|
queue_size: disk_cfg.queue_size,
|
||||||
};
|
};
|
||||||
@ -1645,11 +1596,6 @@ impl DeviceManager {
|
|||||||
) {
|
) {
|
||||||
Ok(vub_device) => vub_device,
|
Ok(vub_device) => vub_device,
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
for vub in self.vhost_user_backends.iter_mut() {
|
|
||||||
if vub._socket_file.path().to_str().unwrap() == socket {
|
|
||||||
let _ = vub.child.kill();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return Err(DeviceManagerError::CreateVhostUserBlk(e));
|
return Err(DeviceManagerError::CreateVhostUserBlk(e));
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -1797,40 +1743,6 @@ impl DeviceManager {
|
|||||||
Ok(devices)
|
Ok(devices)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Launch network backend
|
|
||||||
fn start_net_backend(&mut self, net_cfg: &NetConfig) -> DeviceManagerResult<String> {
|
|
||||||
let _socket_file = NamedTempFile::new().map_err(DeviceManagerError::CreateSocketFile)?;
|
|
||||||
let socket = _socket_file.path().to_str().unwrap().to_owned();
|
|
||||||
|
|
||||||
let child = std::process::Command::new(&self.vmm_path)
|
|
||||||
.args(&[
|
|
||||||
"--net-backend",
|
|
||||||
&format!(
|
|
||||||
"ip={},mask={},socket={},num_queues={},queue_size={}{}",
|
|
||||||
net_cfg.ip,
|
|
||||||
net_cfg.mask,
|
|
||||||
&socket,
|
|
||||||
net_cfg.num_queues,
|
|
||||||
net_cfg.queue_size,
|
|
||||||
if let Some(mac) = net_cfg.host_mac {
|
|
||||||
format!(",host_mac={:}", mac)
|
|
||||||
} else {
|
|
||||||
"".to_owned()
|
|
||||||
}
|
|
||||||
),
|
|
||||||
])
|
|
||||||
.spawn()
|
|
||||||
.map_err(DeviceManagerError::SpawnNetBackend)?;
|
|
||||||
|
|
||||||
// The ActivatedBackend::drop() will automatically reap the child
|
|
||||||
self.vhost_user_backends.push(ActivatedBackend {
|
|
||||||
child,
|
|
||||||
_socket_file,
|
|
||||||
});
|
|
||||||
|
|
||||||
Ok(socket)
|
|
||||||
}
|
|
||||||
|
|
||||||
fn make_virtio_net_device(
|
fn make_virtio_net_device(
|
||||||
&mut self,
|
&mut self,
|
||||||
net_cfg: &mut NetConfig,
|
net_cfg: &mut NetConfig,
|
||||||
@ -1844,14 +1756,9 @@ impl DeviceManager {
|
|||||||
};
|
};
|
||||||
|
|
||||||
if net_cfg.vhost_user {
|
if net_cfg.vhost_user {
|
||||||
let socket = if let Some(socket) = net_cfg.vhost_socket.clone() {
|
let socket = net_cfg.vhost_socket.as_ref().unwrap().clone();
|
||||||
socket
|
|
||||||
} else {
|
|
||||||
warn!("Self-spawning of vhost-user net backend is deprecated and will be removed in a future release.");
|
|
||||||
self.start_net_backend(net_cfg)?
|
|
||||||
};
|
|
||||||
let vu_cfg = VhostUserConfig {
|
let vu_cfg = VhostUserConfig {
|
||||||
socket: socket.clone(),
|
socket,
|
||||||
num_queues: net_cfg.num_queues,
|
num_queues: net_cfg.num_queues,
|
||||||
queue_size: net_cfg.queue_size,
|
queue_size: net_cfg.queue_size,
|
||||||
};
|
};
|
||||||
@ -1864,11 +1771,6 @@ impl DeviceManager {
|
|||||||
) {
|
) {
|
||||||
Ok(vun_device) => vun_device,
|
Ok(vun_device) => vun_device,
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
for vun in self.vhost_user_backends.iter_mut() {
|
|
||||||
if vun._socket_file.path().to_str().unwrap() == socket {
|
|
||||||
let _ = vun.child.kill();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return Err(DeviceManagerError::CreateVhostUserNet(e));
|
return Err(DeviceManagerError::CreateVhostUserNet(e));
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -35,7 +35,6 @@ use serde::ser::{Serialize, SerializeStruct, Serializer};
|
|||||||
use std::fs::File;
|
use std::fs::File;
|
||||||
use std::io;
|
use std::io;
|
||||||
use std::os::unix::io::{AsRawFd, FromRawFd, RawFd};
|
use std::os::unix::io::{AsRawFd, FromRawFd, RawFd};
|
||||||
use std::path::PathBuf;
|
|
||||||
use std::sync::mpsc::{Receiver, RecvError, SendError, Sender};
|
use std::sync::mpsc::{Receiver, RecvError, SendError, Sender};
|
||||||
use std::sync::{Arc, Mutex};
|
use std::sync::{Arc, Mutex};
|
||||||
use std::{result, thread};
|
use std::{result, thread};
|
||||||
@ -240,12 +239,6 @@ pub fn start_vmm_thread(
|
|||||||
let vmm_seccomp_filter =
|
let vmm_seccomp_filter =
|
||||||
get_seccomp_filter(seccomp_action, Thread::Vmm).map_err(Error::CreateSeccompFilter)?;
|
get_seccomp_filter(seccomp_action, Thread::Vmm).map_err(Error::CreateSeccompFilter)?;
|
||||||
|
|
||||||
// Find the path that the "/proc/<pid>/exe" symlink points to. Must be done before spawning
|
|
||||||
// a thread as Rust does not put the child threads in the same thread group which prevents the
|
|
||||||
// link from being followed as per PTRACE_MODE_READ_FSCREDS (see proc(5) and ptrace(2)). The
|
|
||||||
// alternative is to run always with CAP_SYS_PTRACE but that is not a good idea.
|
|
||||||
let self_path = format!("/proc/{}/exe", std::process::id());
|
|
||||||
let vmm_path = std::fs::read_link(PathBuf::from(self_path)).map_err(Error::ExePathReadLink)?;
|
|
||||||
let vmm_seccomp_action = seccomp_action.clone();
|
let vmm_seccomp_action = seccomp_action.clone();
|
||||||
let thread = thread::Builder::new()
|
let thread = thread::Builder::new()
|
||||||
.name("vmm".to_string())
|
.name("vmm".to_string())
|
||||||
@ -256,7 +249,6 @@ pub fn start_vmm_thread(
|
|||||||
let mut vmm = Vmm::new(
|
let mut vmm = Vmm::new(
|
||||||
vmm_version.to_string(),
|
vmm_version.to_string(),
|
||||||
api_event,
|
api_event,
|
||||||
vmm_path,
|
|
||||||
vmm_seccomp_action,
|
vmm_seccomp_action,
|
||||||
hypervisor,
|
hypervisor,
|
||||||
)?;
|
)?;
|
||||||
@ -279,7 +271,6 @@ pub struct Vmm {
|
|||||||
version: String,
|
version: String,
|
||||||
vm: Option<Vm>,
|
vm: Option<Vm>,
|
||||||
vm_config: Option<Arc<Mutex<VmConfig>>>,
|
vm_config: Option<Arc<Mutex<VmConfig>>>,
|
||||||
vmm_path: PathBuf,
|
|
||||||
seccomp_action: SeccompAction,
|
seccomp_action: SeccompAction,
|
||||||
hypervisor: Arc<dyn hypervisor::Hypervisor>,
|
hypervisor: Arc<dyn hypervisor::Hypervisor>,
|
||||||
}
|
}
|
||||||
@ -288,7 +279,6 @@ impl Vmm {
|
|||||||
fn new(
|
fn new(
|
||||||
vmm_version: String,
|
vmm_version: String,
|
||||||
api_evt: EventFd,
|
api_evt: EventFd,
|
||||||
vmm_path: PathBuf,
|
|
||||||
seccomp_action: SeccompAction,
|
seccomp_action: SeccompAction,
|
||||||
hypervisor: Arc<dyn hypervisor::Hypervisor>,
|
hypervisor: Arc<dyn hypervisor::Hypervisor>,
|
||||||
) -> Result<Self> {
|
) -> Result<Self> {
|
||||||
@ -320,7 +310,6 @@ impl Vmm {
|
|||||||
version: vmm_version,
|
version: vmm_version,
|
||||||
vm: None,
|
vm: None,
|
||||||
vm_config: None,
|
vm_config: None,
|
||||||
vmm_path,
|
|
||||||
seccomp_action,
|
seccomp_action,
|
||||||
hypervisor,
|
hypervisor,
|
||||||
})
|
})
|
||||||
@ -337,7 +326,6 @@ impl Vmm {
|
|||||||
Arc::clone(vm_config),
|
Arc::clone(vm_config),
|
||||||
exit_evt,
|
exit_evt,
|
||||||
reset_evt,
|
reset_evt,
|
||||||
self.vmm_path.clone(),
|
|
||||||
&self.seccomp_action,
|
&self.seccomp_action,
|
||||||
self.hypervisor.clone(),
|
self.hypervisor.clone(),
|
||||||
)?;
|
)?;
|
||||||
@ -406,7 +394,6 @@ impl Vmm {
|
|||||||
&snapshot,
|
&snapshot,
|
||||||
exit_evt,
|
exit_evt,
|
||||||
reset_evt,
|
reset_evt,
|
||||||
self.vmm_path.clone(),
|
|
||||||
source_url,
|
source_url,
|
||||||
restore_cfg.prefault,
|
restore_cfg.prefault,
|
||||||
&self.seccomp_action,
|
&self.seccomp_action,
|
||||||
@ -459,7 +446,6 @@ impl Vmm {
|
|||||||
config,
|
config,
|
||||||
exit_evt,
|
exit_evt,
|
||||||
reset_evt,
|
reset_evt,
|
||||||
self.vmm_path.clone(),
|
|
||||||
&self.seccomp_action,
|
&self.seccomp_action,
|
||||||
self.hypervisor.clone(),
|
self.hypervisor.clone(),
|
||||||
)?);
|
)?);
|
||||||
|
@ -62,7 +62,6 @@ use std::io::{self, Write};
|
|||||||
use std::io::{Seek, SeekFrom};
|
use std::io::{Seek, SeekFrom};
|
||||||
use std::num::Wrapping;
|
use std::num::Wrapping;
|
||||||
use std::ops::Deref;
|
use std::ops::Deref;
|
||||||
use std::path::PathBuf;
|
|
||||||
use std::sync::{Arc, Mutex, RwLock};
|
use std::sync::{Arc, Mutex, RwLock};
|
||||||
use std::{result, str, thread};
|
use std::{result, str, thread};
|
||||||
use url::Url;
|
use url::Url;
|
||||||
@ -467,7 +466,6 @@ impl Vm {
|
|||||||
vm: Arc<dyn hypervisor::Vm>,
|
vm: Arc<dyn hypervisor::Vm>,
|
||||||
exit_evt: EventFd,
|
exit_evt: EventFd,
|
||||||
reset_evt: EventFd,
|
reset_evt: EventFd,
|
||||||
vmm_path: PathBuf,
|
|
||||||
seccomp_action: &SeccompAction,
|
seccomp_action: &SeccompAction,
|
||||||
hypervisor: Arc<dyn hypervisor::Hypervisor>,
|
hypervisor: Arc<dyn hypervisor::Hypervisor>,
|
||||||
_saved_clock: Option<hypervisor::ClockData>,
|
_saved_clock: Option<hypervisor::ClockData>,
|
||||||
@ -489,7 +487,6 @@ impl Vm {
|
|||||||
memory_manager.clone(),
|
memory_manager.clone(),
|
||||||
&exit_evt,
|
&exit_evt,
|
||||||
&reset_evt,
|
&reset_evt,
|
||||||
vmm_path,
|
|
||||||
seccomp_action.clone(),
|
seccomp_action.clone(),
|
||||||
#[cfg(feature = "acpi")]
|
#[cfg(feature = "acpi")]
|
||||||
numa_nodes.clone(),
|
numa_nodes.clone(),
|
||||||
@ -628,7 +625,6 @@ impl Vm {
|
|||||||
config: Arc<Mutex<VmConfig>>,
|
config: Arc<Mutex<VmConfig>>,
|
||||||
exit_evt: EventFd,
|
exit_evt: EventFd,
|
||||||
reset_evt: EventFd,
|
reset_evt: EventFd,
|
||||||
vmm_path: PathBuf,
|
|
||||||
seccomp_action: &SeccompAction,
|
seccomp_action: &SeccompAction,
|
||||||
hypervisor: Arc<dyn hypervisor::Hypervisor>,
|
hypervisor: Arc<dyn hypervisor::Hypervisor>,
|
||||||
) -> Result<Self> {
|
) -> Result<Self> {
|
||||||
@ -663,7 +659,6 @@ impl Vm {
|
|||||||
vm,
|
vm,
|
||||||
exit_evt,
|
exit_evt,
|
||||||
reset_evt,
|
reset_evt,
|
||||||
vmm_path,
|
|
||||||
seccomp_action,
|
seccomp_action,
|
||||||
hypervisor,
|
hypervisor,
|
||||||
None,
|
None,
|
||||||
@ -685,7 +680,6 @@ impl Vm {
|
|||||||
snapshot: &Snapshot,
|
snapshot: &Snapshot,
|
||||||
exit_evt: EventFd,
|
exit_evt: EventFd,
|
||||||
reset_evt: EventFd,
|
reset_evt: EventFd,
|
||||||
vmm_path: PathBuf,
|
|
||||||
source_url: &str,
|
source_url: &str,
|
||||||
prefault: bool,
|
prefault: bool,
|
||||||
seccomp_action: &SeccompAction,
|
seccomp_action: &SeccompAction,
|
||||||
@ -728,7 +722,6 @@ impl Vm {
|
|||||||
vm,
|
vm,
|
||||||
exit_evt,
|
exit_evt,
|
||||||
reset_evt,
|
reset_evt,
|
||||||
vmm_path,
|
|
||||||
seccomp_action,
|
seccomp_action,
|
||||||
hypervisor,
|
hypervisor,
|
||||||
#[cfg(target_arch = "x86_64")]
|
#[cfg(target_arch = "x86_64")]
|
||||||
|
Loading…
Reference in New Issue
Block a user