mirror of
https://github.com/cloud-hypervisor/cloud-hypervisor.git
synced 2024-12-22 21:55:20 +00:00
vmm: Always generate the next device name
Even in the context of "mmio" feature, we need the next device name to be generated as we need to identify virtio-mmio devices to support snapshot and restore functionalities. Signed-off-by: Sebastien Boeuf <sebastien.boeuf@intel.com>
This commit is contained in:
parent
8183141399
commit
ff9c8b847f
@ -40,7 +40,6 @@ use std::any::Any;
|
|||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
use std::fs::{File, OpenOptions};
|
use std::fs::{File, OpenOptions};
|
||||||
use std::io::{self, sink, stdout, Seek, SeekFrom};
|
use std::io::{self, sink, stdout, Seek, SeekFrom};
|
||||||
#[cfg(feature = "pci_support")]
|
|
||||||
use std::num::Wrapping;
|
use std::num::Wrapping;
|
||||||
use std::os::unix::fs::OpenOptionsExt;
|
use std::os::unix::fs::OpenOptionsExt;
|
||||||
use std::path::PathBuf;
|
use std::path::PathBuf;
|
||||||
@ -582,6 +581,9 @@ pub struct DeviceManager {
|
|||||||
// Backends that have been spawned
|
// Backends that have been spawned
|
||||||
vhost_user_backends: Vec<ActivatedBackend>,
|
vhost_user_backends: Vec<ActivatedBackend>,
|
||||||
|
|
||||||
|
// Counter to keep track of the consumed device IDs.
|
||||||
|
device_id_cnt: Wrapping<usize>,
|
||||||
|
|
||||||
// Keep a reference to the PCI bus
|
// Keep a reference to the PCI bus
|
||||||
#[cfg(feature = "pci_support")]
|
#[cfg(feature = "pci_support")]
|
||||||
pci_bus: Option<Arc<Mutex<PciBus>>>,
|
pci_bus: Option<Arc<Mutex<PciBus>>>,
|
||||||
@ -610,10 +612,6 @@ pub struct DeviceManager {
|
|||||||
#[cfg(feature = "pci_support")]
|
#[cfg(feature = "pci_support")]
|
||||||
pci_id_list: HashMap<String, u32>,
|
pci_id_list: HashMap<String, u32>,
|
||||||
|
|
||||||
// Counter to keep track of the consumed device IDs.
|
|
||||||
#[cfg(feature = "pci_support")]
|
|
||||||
device_id_cnt: Wrapping<usize>,
|
|
||||||
|
|
||||||
// Hashmap of PCI b/d/f to their corresponding Arc<Mutex<dyn PciDevice>>.
|
// Hashmap of PCI b/d/f to their corresponding Arc<Mutex<dyn PciDevice>>.
|
||||||
#[cfg(feature = "pci_support")]
|
#[cfg(feature = "pci_support")]
|
||||||
pci_devices: HashMap<u32, Arc<dyn Any + Send + Sync>>,
|
pci_devices: HashMap<u32, Arc<dyn Any + Send + Sync>>,
|
||||||
@ -702,6 +700,7 @@ impl DeviceManager {
|
|||||||
bus_devices,
|
bus_devices,
|
||||||
vmm_path,
|
vmm_path,
|
||||||
vhost_user_backends: Vec::new(),
|
vhost_user_backends: Vec::new(),
|
||||||
|
device_id_cnt: Wrapping(0),
|
||||||
#[cfg(feature = "pci_support")]
|
#[cfg(feature = "pci_support")]
|
||||||
pci_bus: None,
|
pci_bus: None,
|
||||||
#[cfg(feature = "pci_support")]
|
#[cfg(feature = "pci_support")]
|
||||||
@ -717,8 +716,6 @@ impl DeviceManager {
|
|||||||
#[cfg(feature = "pci_support")]
|
#[cfg(feature = "pci_support")]
|
||||||
pci_id_list: HashMap::new(),
|
pci_id_list: HashMap::new(),
|
||||||
#[cfg(feature = "pci_support")]
|
#[cfg(feature = "pci_support")]
|
||||||
device_id_cnt: Wrapping(0),
|
|
||||||
#[cfg(feature = "pci_support")]
|
|
||||||
pci_devices: HashMap::new(),
|
pci_devices: HashMap::new(),
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -1185,7 +1182,7 @@ impl DeviceManager {
|
|||||||
disk_cfg: &mut DiskConfig,
|
disk_cfg: &mut DiskConfig,
|
||||||
) -> DeviceManagerResult<(VirtioDeviceArc, bool, Option<String>)> {
|
) -> DeviceManagerResult<(VirtioDeviceArc, bool, Option<String>)> {
|
||||||
if disk_cfg.id.is_none() {
|
if disk_cfg.id.is_none() {
|
||||||
disk_cfg.id = self.next_device_name(DISK_DEVICE_NAME_PREFIX)?;
|
disk_cfg.id = Some(self.next_device_name(DISK_DEVICE_NAME_PREFIX)?);
|
||||||
}
|
}
|
||||||
|
|
||||||
if disk_cfg.vhost_user {
|
if disk_cfg.vhost_user {
|
||||||
@ -1338,7 +1335,7 @@ impl DeviceManager {
|
|||||||
net_cfg: &mut NetConfig,
|
net_cfg: &mut NetConfig,
|
||||||
) -> DeviceManagerResult<(VirtioDeviceArc, bool, Option<String>)> {
|
) -> DeviceManagerResult<(VirtioDeviceArc, bool, Option<String>)> {
|
||||||
if net_cfg.id.is_none() {
|
if net_cfg.id.is_none() {
|
||||||
net_cfg.id = self.next_device_name(NET_DEVICE_NAME_PREFIX)?;
|
net_cfg.id = Some(self.next_device_name(NET_DEVICE_NAME_PREFIX)?);
|
||||||
}
|
}
|
||||||
|
|
||||||
if net_cfg.vhost_user {
|
if net_cfg.vhost_user {
|
||||||
@ -1450,7 +1447,7 @@ impl DeviceManager {
|
|||||||
fs_cfg: &mut FsConfig,
|
fs_cfg: &mut FsConfig,
|
||||||
) -> DeviceManagerResult<(VirtioDeviceArc, bool, Option<String>)> {
|
) -> DeviceManagerResult<(VirtioDeviceArc, bool, Option<String>)> {
|
||||||
if fs_cfg.id.is_none() {
|
if fs_cfg.id.is_none() {
|
||||||
fs_cfg.id = self.next_device_name(FS_DEVICE_NAME_PREFIX)?;
|
fs_cfg.id = Some(self.next_device_name(FS_DEVICE_NAME_PREFIX)?);
|
||||||
}
|
}
|
||||||
|
|
||||||
if let Some(fs_sock) = fs_cfg.sock.to_str() {
|
if let Some(fs_sock) = fs_cfg.sock.to_str() {
|
||||||
@ -1552,7 +1549,7 @@ impl DeviceManager {
|
|||||||
pmem_cfg: &mut PmemConfig,
|
pmem_cfg: &mut PmemConfig,
|
||||||
) -> DeviceManagerResult<(VirtioDeviceArc, bool, Option<String>)> {
|
) -> DeviceManagerResult<(VirtioDeviceArc, bool, Option<String>)> {
|
||||||
if pmem_cfg.id.is_none() {
|
if pmem_cfg.id.is_none() {
|
||||||
pmem_cfg.id = self.next_device_name(PMEM_DEVICE_NAME_PREFIX)?;
|
pmem_cfg.id = Some(self.next_device_name(PMEM_DEVICE_NAME_PREFIX)?);
|
||||||
}
|
}
|
||||||
|
|
||||||
let (custom_flags, set_len) = if pmem_cfg.file.is_dir() {
|
let (custom_flags, set_len) = if pmem_cfg.file.is_dir() {
|
||||||
@ -1673,7 +1670,7 @@ impl DeviceManager {
|
|||||||
vsock_cfg: &mut VsockConfig,
|
vsock_cfg: &mut VsockConfig,
|
||||||
) -> DeviceManagerResult<(VirtioDeviceArc, bool, Option<String>)> {
|
) -> DeviceManagerResult<(VirtioDeviceArc, bool, Option<String>)> {
|
||||||
if vsock_cfg.id.is_none() {
|
if vsock_cfg.id.is_none() {
|
||||||
vsock_cfg.id = self.next_device_name(VSOCK_DEVICE_NAME_PREFIX)?;
|
vsock_cfg.id = Some(self.next_device_name(VSOCK_DEVICE_NAME_PREFIX)?);
|
||||||
}
|
}
|
||||||
|
|
||||||
let socket_path = vsock_cfg
|
let socket_path = vsock_cfg
|
||||||
@ -1758,12 +1755,17 @@ impl DeviceManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(not(feature = "pci_support"))]
|
#[cfg(not(feature = "pci_support"))]
|
||||||
fn next_device_name(&mut self, _prefix: &str) -> DeviceManagerResult<Option<String>> {
|
fn next_device_name(&mut self, prefix: &str) -> DeviceManagerResult<String> {
|
||||||
Ok(None)
|
// Generate the temporary name.
|
||||||
|
let name = format!("{}{}", prefix, self.device_id_cnt);
|
||||||
|
// Increment the counter.
|
||||||
|
self.device_id_cnt += Wrapping(1);
|
||||||
|
|
||||||
|
Ok(name)
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(feature = "pci_support")]
|
#[cfg(feature = "pci_support")]
|
||||||
fn next_device_name(&mut self, prefix: &str) -> DeviceManagerResult<Option<String>> {
|
fn next_device_name(&mut self, prefix: &str) -> DeviceManagerResult<String> {
|
||||||
let start_id = self.device_id_cnt;
|
let start_id = self.device_id_cnt;
|
||||||
loop {
|
loop {
|
||||||
// Generate the temporary name.
|
// Generate the temporary name.
|
||||||
@ -1772,7 +1774,7 @@ impl DeviceManager {
|
|||||||
self.device_id_cnt += Wrapping(1);
|
self.device_id_cnt += Wrapping(1);
|
||||||
// Check if the name is already in use.
|
// Check if the name is already in use.
|
||||||
if !self.pci_id_list.contains_key(&name) {
|
if !self.pci_id_list.contains_key(&name) {
|
||||||
return Ok(Some(name));
|
return Ok(name);
|
||||||
}
|
}
|
||||||
|
|
||||||
if self.device_id_cnt == start_id {
|
if self.device_id_cnt == start_id {
|
||||||
@ -1868,8 +1870,8 @@ impl DeviceManager {
|
|||||||
id.clone()
|
id.clone()
|
||||||
} else {
|
} else {
|
||||||
let id = self.next_device_name(VFIO_DEVICE_NAME_PREFIX)?;
|
let id = self.next_device_name(VFIO_DEVICE_NAME_PREFIX)?;
|
||||||
device_cfg.id = id.clone();
|
device_cfg.id = Some(id.clone());
|
||||||
id.unwrap()
|
id
|
||||||
};
|
};
|
||||||
self.pci_id_list.insert(vfio_name, pci_device_bdf);
|
self.pci_id_list.insert(vfio_name, pci_device_bdf);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user