mirror of
https://github.com/cloud-hypervisor/cloud-hypervisor.git
synced 2024-10-02 11:35:46 +00:00
vmm: Create vsock backend
This commit relies on the new vsock::unix module to create the backend that will be used from the virtio-vsock device. The concept of backend is interesting here as it would allow for a vhost kernel backend to be plugged if that was needed someday. Signed-off-by: Sebastien Boeuf <sebastien.boeuf@intel.com>
This commit is contained in:
parent
434a5d0edf
commit
475e487ac3
@ -27,7 +27,7 @@ pub mod net;
|
|||||||
mod pmem;
|
mod pmem;
|
||||||
mod queue;
|
mod queue;
|
||||||
mod rng;
|
mod rng;
|
||||||
mod vsock;
|
pub mod vsock;
|
||||||
|
|
||||||
pub mod transport;
|
pub mod transport;
|
||||||
pub mod vhost_user;
|
pub mod vhost_user;
|
||||||
@ -49,6 +49,7 @@ const DEVICE_FEATURES_OK: u32 = 0x08;
|
|||||||
const DEVICE_FAILED: u32 = 0x80;
|
const DEVICE_FAILED: u32 = 0x80;
|
||||||
|
|
||||||
const VIRTIO_F_VERSION_1: u32 = 32;
|
const VIRTIO_F_VERSION_1: u32 = 32;
|
||||||
|
const VIRTIO_F_IN_ORDER: u32 = 35;
|
||||||
|
|
||||||
// Types taken from linux/virtio_ids.h
|
// Types taken from linux/virtio_ids.h
|
||||||
#[derive(Copy, Clone)]
|
#[derive(Copy, Clone)]
|
||||||
|
@ -36,11 +36,12 @@ use std::result;
|
|||||||
use std::sync::{Arc, RwLock};
|
use std::sync::{Arc, RwLock};
|
||||||
use std::thread;
|
use std::thread;
|
||||||
|
|
||||||
|
use super::VsockBackend;
|
||||||
use crate::Error as DeviceError;
|
use crate::Error as DeviceError;
|
||||||
use crate::VirtioInterrupt;
|
use crate::VirtioInterrupt;
|
||||||
use crate::{
|
use crate::{
|
||||||
ActivateError, ActivateResult, DeviceEventT, Queue, VirtioDevice, VirtioDeviceType,
|
ActivateError, ActivateResult, DeviceEventT, Queue, VirtioDevice, VirtioDeviceType,
|
||||||
VIRTIO_F_VERSION_1,
|
VIRTIO_F_IN_ORDER, VIRTIO_F_VERSION_1,
|
||||||
};
|
};
|
||||||
use byteorder::{ByteOrder, LittleEndian};
|
use byteorder::{ByteOrder, LittleEndian};
|
||||||
use vm_memory::GuestMemoryMmap;
|
use vm_memory::GuestMemoryMmap;
|
||||||
@ -167,19 +168,26 @@ impl VsockEpollHandler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Virtio device exposing virtual socket to the guest.
|
/// Virtio device exposing virtual socket to the guest.
|
||||||
pub struct Vsock {
|
pub struct Vsock<B: VsockBackend> {
|
||||||
cid: u64,
|
cid: u64,
|
||||||
|
_backend: Option<B>,
|
||||||
kill_evt: Option<EventFd>,
|
kill_evt: Option<EventFd>,
|
||||||
avail_features: u64,
|
avail_features: u64,
|
||||||
acked_features: u64,
|
acked_features: u64,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Vsock {
|
impl<B> Vsock<B>
|
||||||
pub fn new(cid: u64) -> io::Result<Vsock> {
|
where
|
||||||
let avail_features = 1u64 << VIRTIO_F_VERSION_1;
|
B: VsockBackend,
|
||||||
|
{
|
||||||
|
/// Create a new virtio-vsock device with the given VM CID and vsock
|
||||||
|
/// backend.
|
||||||
|
pub fn new(cid: u64, backend: B) -> io::Result<Vsock<B>> {
|
||||||
|
let avail_features = 1u64 << VIRTIO_F_VERSION_1 | 1u64 << VIRTIO_F_IN_ORDER;
|
||||||
|
|
||||||
Ok(Vsock {
|
Ok(Vsock {
|
||||||
cid,
|
cid,
|
||||||
|
_backend: Some(backend),
|
||||||
kill_evt: None,
|
kill_evt: None,
|
||||||
avail_features,
|
avail_features,
|
||||||
acked_features: 0u64,
|
acked_features: 0u64,
|
||||||
@ -187,7 +195,10 @@ impl Vsock {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Drop for Vsock {
|
impl<B> Drop for Vsock<B>
|
||||||
|
where
|
||||||
|
B: VsockBackend,
|
||||||
|
{
|
||||||
fn drop(&mut self) {
|
fn drop(&mut self) {
|
||||||
if let Some(kill_evt) = self.kill_evt.take() {
|
if let Some(kill_evt) = self.kill_evt.take() {
|
||||||
// Ignore the result because there is nothing we can do about it.
|
// Ignore the result because there is nothing we can do about it.
|
||||||
@ -196,7 +207,10 @@ impl Drop for Vsock {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl VirtioDevice for Vsock {
|
impl<B> VirtioDevice for Vsock<B>
|
||||||
|
where
|
||||||
|
B: VsockBackend,
|
||||||
|
{
|
||||||
fn device_type(&self) -> u32 {
|
fn device_type(&self) -> u32 {
|
||||||
VirtioDeviceType::TYPE_VSOCK as u32
|
VirtioDeviceType::TYPE_VSOCK as u32
|
||||||
}
|
}
|
||||||
|
@ -14,6 +14,8 @@ mod packet;
|
|||||||
mod unix;
|
mod unix;
|
||||||
|
|
||||||
pub use self::device::Vsock;
|
pub use self::device::Vsock;
|
||||||
|
pub use self::unix::VsockUnixBackend;
|
||||||
|
pub use self::unix::VsockUnixError;
|
||||||
|
|
||||||
use std::os::unix::io::RawFd;
|
use std::os::unix::io::RawFd;
|
||||||
|
|
||||||
|
@ -13,6 +13,7 @@ mod muxer_killq;
|
|||||||
mod muxer_rxq;
|
mod muxer_rxq;
|
||||||
|
|
||||||
pub use muxer::VsockMuxer as VsockUnixBackend;
|
pub use muxer::VsockMuxer as VsockUnixBackend;
|
||||||
|
pub use Error as VsockUnixError;
|
||||||
|
|
||||||
mod defs {
|
mod defs {
|
||||||
/// Maximum number of established connections that we can handle.
|
/// Maximum number of established connections that we can handle.
|
||||||
|
@ -76,6 +76,12 @@ pub enum DeviceManagerError {
|
|||||||
/// Cannot create virtio-vsock device
|
/// Cannot create virtio-vsock device
|
||||||
CreateVirtioVsock(io::Error),
|
CreateVirtioVsock(io::Error),
|
||||||
|
|
||||||
|
/// Failed converting Path to &str for the virtio-vsock device.
|
||||||
|
CreateVsockConvertPath,
|
||||||
|
|
||||||
|
/// Cannot create virtio-vsock backend
|
||||||
|
CreateVsockBackend(vm_virtio::vsock::VsockUnixError),
|
||||||
|
|
||||||
/// Failed parsing disk image format
|
/// Failed parsing disk image format
|
||||||
DetectImageType(qcow::Error),
|
DetectImageType(qcow::Error),
|
||||||
|
|
||||||
@ -801,7 +807,15 @@ impl DeviceManager {
|
|||||||
// Add vsock if required
|
// Add vsock if required
|
||||||
if let Some(vsock_list_cfg) = &vm_info.vm_cfg.vsock {
|
if let Some(vsock_list_cfg) = &vm_info.vm_cfg.vsock {
|
||||||
for vsock_cfg in vsock_list_cfg.iter() {
|
for vsock_cfg in vsock_list_cfg.iter() {
|
||||||
let vsock_device = vm_virtio::Vsock::new(vsock_cfg.cid)
|
let socket_path = vsock_cfg
|
||||||
|
.sock
|
||||||
|
.to_str()
|
||||||
|
.ok_or(DeviceManagerError::CreateVsockConvertPath)?;
|
||||||
|
let backend =
|
||||||
|
vm_virtio::vsock::VsockUnixBackend::new(vsock_cfg.cid, socket_path.to_string())
|
||||||
|
.map_err(DeviceManagerError::CreateVsockBackend)?;
|
||||||
|
|
||||||
|
let vsock_device = vm_virtio::Vsock::new(vsock_cfg.cid, backend)
|
||||||
.map_err(DeviceManagerError::CreateVirtioVsock)?;
|
.map_err(DeviceManagerError::CreateVirtioVsock)?;
|
||||||
|
|
||||||
DeviceManager::add_virtio_pci_device(
|
DeviceManager::add_virtio_pci_device(
|
||||||
|
Loading…
Reference in New Issue
Block a user