Skip to content

Commit b00d3e8

Browse files
committed
chore: prepare virtio for multiple transport options
This is just code organization changes. Create a new module under `virtio`, called `transport`. For the time being the only transport supported is `mmio`. Also, move `IrqInterrupt` type within the MMIO transport code, as it is MMIO specific. Signed-off-by: Babis Chalios <bchalios@amazon.es>
1 parent bc5671b commit b00d3e8

File tree

21 files changed

+130
-114
lines changed

21 files changed

+130
-114
lines changed

src/vmm/src/builder.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,9 @@ use crate::devices::legacy::{EventFdTrigger, SerialEventsWrapper, SerialWrapper}
4242
use crate::devices::virtio::balloon::Balloon;
4343
use crate::devices::virtio::block::device::Block;
4444
use crate::devices::virtio::device::VirtioDevice;
45-
use crate::devices::virtio::mmio::MmioTransport;
4645
use crate::devices::virtio::net::Net;
4746
use crate::devices::virtio::rng::Entropy;
47+
use crate::devices::virtio::transport::mmio::MmioTransport;
4848
use crate::devices::virtio::vsock::{Vsock, VsockUnixBackend};
4949
#[cfg(feature = "gdb")]
5050
use crate::gdb;

src/vmm/src/device_manager/mmio.rs

+4-3
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,9 @@ use crate::devices::pseudo::BootTimer;
3030
use crate::devices::virtio::balloon::Balloon;
3131
use crate::devices::virtio::block::device::Block;
3232
use crate::devices::virtio::device::VirtioDevice;
33-
use crate::devices::virtio::mmio::MmioTransport;
3433
use crate::devices::virtio::net::Net;
3534
use crate::devices::virtio::rng::Entropy;
35+
use crate::devices::virtio::transport::mmio::MmioTransport;
3636
use crate::devices::virtio::vsock::{TYPE_VSOCK, Vsock, VsockUnixBackend};
3737
use crate::devices::virtio::{TYPE_BALLOON, TYPE_BLOCK, TYPE_NET, TYPE_RNG};
3838
#[cfg(target_arch = "x86_64")]
@@ -223,7 +223,7 @@ impl MMIODeviceManager {
223223
device_info: &MMIODeviceInfo,
224224
) -> Result<(), MmioError> {
225225
// as per doc, [virtio_mmio.]device=<size>@<baseaddr>:<irq> needs to be appended
226-
// to kernel command line for virtio mmio devices to get recongnized
226+
// to kernel command line for virtio mmio devices to get recognized
227227
// the size parameter has to be transformed to KiB, so dividing hexadecimal value in
228228
// bytes to 1024; further, the '{}' formatting rust construct will automatically
229229
// transform it to decimal
@@ -530,8 +530,9 @@ mod tests {
530530
use super::*;
531531
use crate::Vm;
532532
use crate::devices::virtio::ActivateError;
533-
use crate::devices::virtio::device::{IrqTrigger, VirtioDevice};
533+
use crate::devices::virtio::device::VirtioDevice;
534534
use crate::devices::virtio::queue::Queue;
535+
use crate::devices::virtio::transport::mmio::IrqTrigger;
535536
use crate::test_utils::multi_region_mem_raw;
536537
use crate::vstate::kvm::Kvm;
537538
use crate::vstate::memory::{GuestAddress, GuestMemoryMmap};

src/vmm/src/device_manager/persist.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ use crate::devices::virtio::block::BlockError;
2525
use crate::devices::virtio::block::device::Block;
2626
use crate::devices::virtio::block::persist::{BlockConstructorArgs, BlockState};
2727
use crate::devices::virtio::device::VirtioDevice;
28-
use crate::devices::virtio::mmio::MmioTransport;
2928
use crate::devices::virtio::net::Net;
3029
use crate::devices::virtio::net::persist::{
3130
NetConstructorArgs, NetPersistError as NetError, NetState,
@@ -35,6 +34,7 @@ use crate::devices::virtio::rng::Entropy;
3534
use crate::devices::virtio::rng::persist::{
3635
EntropyConstructorArgs, EntropyPersistError as EntropyError, EntropyState,
3736
};
37+
use crate::devices::virtio::transport::mmio::MmioTransport;
3838
use crate::devices::virtio::vsock::persist::{
3939
VsockConstructorArgs, VsockState, VsockUdsConstructorArgs,
4040
};

src/vmm/src/devices/bus.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ use event_manager::{EventOps, Events, MutEventSubscriber};
5656
use super::legacy::RTCDevice;
5757
use super::legacy::{I8042Device, SerialDevice};
5858
use super::pseudo::BootTimer;
59-
use super::virtio::mmio::MmioTransport;
59+
use super::virtio::transport::mmio::MmioTransport;
6060

6161
#[derive(Debug)]
6262
pub enum BusDevice {

src/vmm/src/devices/virtio/balloon/device.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@ use super::{
2424
VIRTIO_BALLOON_S_SWAP_OUT,
2525
};
2626
use crate::devices::virtio::balloon::BalloonError;
27-
use crate::devices::virtio::device::{IrqTrigger, IrqType};
2827
use crate::devices::virtio::generated::virtio_config::VIRTIO_F_VERSION_1;
28+
use crate::devices::virtio::transport::mmio::{IrqTrigger, IrqType};
2929
use crate::logger::IncMetric;
3030
use crate::utils::u64_to_usize;
3131
use crate::vstate::memory::{Address, ByteValued, Bytes, GuestAddress, GuestMemoryMmap};

src/vmm/src/devices/virtio/balloon/test_utils.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ use crate::devices::virtio::{balloon::BALLOON_NUM_QUEUES, balloon::Balloon};
1010
#[cfg(test)]
1111
pub fn invoke_handler_for_queue_event(b: &mut Balloon, queue_index: usize) {
1212
use crate::devices::virtio::balloon::{DEFLATE_INDEX, INFLATE_INDEX, STATS_INDEX};
13-
use crate::devices::virtio::device::IrqType;
13+
use crate::devices::virtio::transport::mmio::IrqType;
1414

1515
assert!(queue_index < BALLOON_NUM_QUEUES);
1616
// Trigger the queue event.

src/vmm/src/devices/virtio/block/device.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,9 @@ use super::BlockError;
88
use super::persist::{BlockConstructorArgs, BlockState};
99
use super::vhost_user::device::{VhostUserBlock, VhostUserBlockConfig};
1010
use super::virtio::device::{VirtioBlock, VirtioBlockConfig};
11-
use crate::devices::virtio::device::{IrqTrigger, VirtioDevice};
11+
use crate::devices::virtio::device::VirtioDevice;
1212
use crate::devices::virtio::queue::Queue;
13+
use crate::devices::virtio::transport::mmio::IrqTrigger;
1314
use crate::devices::virtio::{ActivateError, TYPE_BLOCK};
1415
use crate::rate_limiter::BucketUpdate;
1516
use crate::snapshot::Persist;

src/vmm/src/devices/virtio/block/vhost_user/device.rs

+4-3
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,12 @@ use vmm_sys_util::eventfd::EventFd;
1414

1515
use super::{NUM_QUEUES, QUEUE_SIZE, VhostUserBlockError};
1616
use crate::devices::virtio::block::CacheType;
17-
use crate::devices::virtio::device::{DeviceState, IrqTrigger, IrqType, VirtioDevice};
17+
use crate::devices::virtio::device::{DeviceState, VirtioDevice};
1818
use crate::devices::virtio::generated::virtio_blk::{VIRTIO_BLK_F_FLUSH, VIRTIO_BLK_F_RO};
1919
use crate::devices::virtio::generated::virtio_config::VIRTIO_F_VERSION_1;
2020
use crate::devices::virtio::generated::virtio_ring::VIRTIO_RING_F_EVENT_IDX;
2121
use crate::devices::virtio::queue::Queue;
22+
use crate::devices::virtio::transport::mmio::{IrqTrigger, IrqType};
2223
use crate::devices::virtio::vhost_user::{VhostUserHandleBackend, VhostUserHandleImpl};
2324
use crate::devices::virtio::vhost_user_metrics::{
2425
VhostUserDeviceMetrics, VhostUserMetricsPerDevice,
@@ -34,7 +35,7 @@ const BLOCK_CONFIG_SPACE_SIZE: u32 = 60;
3435

3536
const AVAILABLE_FEATURES: u64 = (1 << VIRTIO_F_VERSION_1)
3637
| (1 << VIRTIO_RING_F_EVENT_IDX)
37-
// vhost-user specific bit. Not defined in standart virtio spec.
38+
// vhost-user specific bit. Not defined in standard virtio spec.
3839
// Specifies ability of frontend to negotiate protocol features.
3940
| VhostUserVirtioFeatures::PROTOCOL_FEATURES.bits()
4041
// We always try to negotiate readonly with the backend.
@@ -375,7 +376,7 @@ mod tests {
375376

376377
use super::*;
377378
use crate::devices::virtio::block::virtio::device::FileEngineType;
378-
use crate::devices::virtio::mmio::VIRTIO_MMIO_INT_CONFIG;
379+
use crate::devices::virtio::transport::mmio::VIRTIO_MMIO_INT_CONFIG;
379380
use crate::devices::virtio::vhost_user::tests::create_mem;
380381
use crate::test_utils::create_tmp_socket;
381382
use crate::vstate::memory::GuestAddress;

src/vmm/src/devices/virtio/block/virtio/device.rs

+3-2
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,14 @@ use super::request::*;
2323
use super::{BLOCK_QUEUE_SIZES, SECTOR_SHIFT, SECTOR_SIZE, VirtioBlockError, io as block_io};
2424
use crate::devices::virtio::block::CacheType;
2525
use crate::devices::virtio::block::virtio::metrics::{BlockDeviceMetrics, BlockMetricsPerDevice};
26-
use crate::devices::virtio::device::{DeviceState, IrqTrigger, IrqType, VirtioDevice};
26+
use crate::devices::virtio::device::{DeviceState, VirtioDevice};
2727
use crate::devices::virtio::generated::virtio_blk::{
2828
VIRTIO_BLK_F_FLUSH, VIRTIO_BLK_F_RO, VIRTIO_BLK_ID_BYTES,
2929
};
3030
use crate::devices::virtio::generated::virtio_config::VIRTIO_F_VERSION_1;
3131
use crate::devices::virtio::generated::virtio_ring::VIRTIO_RING_F_EVENT_IDX;
3232
use crate::devices::virtio::queue::Queue;
33+
use crate::devices::virtio::transport::mmio::{IrqTrigger, IrqType};
3334
use crate::devices::virtio::{ActivateError, TYPE_BLOCK};
3435
use crate::logger::{IncMetric, error, warn};
3536
use crate::rate_limiter::{BucketUpdate, RateLimiter};
@@ -826,7 +827,7 @@ mod tests {
826827
block.read_config(0, actual_config_space.as_mut_slice());
827828
assert_eq!(actual_config_space, expected_config_space);
828829

829-
// If priviledged user writes to `/dev/mem`, in block config space - byte by byte.
830+
// If privileged user writes to `/dev/mem`, in block config space - byte by byte.
830831
let expected_config_space = ConfigSpace {
831832
capacity: 0x1122334455667788,
832833
};

src/vmm/src/devices/virtio/block/virtio/persist.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,10 @@ use crate::devices::virtio::TYPE_BLOCK;
1616
use crate::devices::virtio::block::persist::BlockConstructorArgs;
1717
use crate::devices::virtio::block::virtio::device::FileEngineType;
1818
use crate::devices::virtio::block::virtio::metrics::BlockMetricsPerDevice;
19-
use crate::devices::virtio::device::{DeviceState, IrqTrigger};
19+
use crate::devices::virtio::device::DeviceState;
2020
use crate::devices::virtio::generated::virtio_blk::VIRTIO_BLK_F_RO;
2121
use crate::devices::virtio::persist::VirtioDeviceState;
22+
use crate::devices::virtio::transport::mmio::IrqTrigger;
2223
use crate::rate_limiter::RateLimiter;
2324
use crate::rate_limiter::persist::RateLimiterState;
2425
use crate::snapshot::Persist;

src/vmm/src/devices/virtio/block/virtio/test_utils.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,10 @@ use crate::devices::virtio::block::virtio::device::FileEngineType;
1616
#[cfg(test)]
1717
use crate::devices::virtio::block::virtio::io::FileEngine;
1818
use crate::devices::virtio::block::virtio::{CacheType, VirtioBlock};
19-
#[cfg(test)]
20-
use crate::devices::virtio::device::IrqType;
2119
use crate::devices::virtio::queue::{Queue, VIRTQ_DESC_F_NEXT, VIRTQ_DESC_F_WRITE};
2220
use crate::devices::virtio::test_utils::{VirtQueue, VirtqDesc};
21+
#[cfg(test)]
22+
use crate::devices::virtio::transport::mmio::IrqType;
2323
use crate::rate_limiter::RateLimiter;
2424
use crate::vmm_config::{RateLimiterConfig, TokenBucketConfig};
2525
use crate::vstate::memory::{Bytes, GuestAddress};

src/vmm/src/devices/virtio/device.rs

+3-84
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,15 @@
77

88
use std::fmt;
99
use std::sync::Arc;
10-
use std::sync::atomic::{AtomicU32, Ordering};
10+
use std::sync::atomic::AtomicU32;
1111

1212
use vmm_sys_util::eventfd::EventFd;
1313

1414
use super::ActivateError;
15-
use super::mmio::{VIRTIO_MMIO_INT_CONFIG, VIRTIO_MMIO_INT_VRING};
1615
use super::queue::{Queue, QueueError};
16+
use super::transport::mmio::IrqTrigger;
1717
use crate::devices::virtio::AsAny;
18-
use crate::logger::{error, warn};
18+
use crate::logger::warn;
1919
use crate::vstate::memory::GuestMemoryMmap;
2020

2121
/// Enum that indicates if a VirtioDevice is inactive or has been activated
@@ -44,46 +44,6 @@ impl DeviceState {
4444
}
4545
}
4646

47-
/// The 2 types of interrupt sources in MMIO transport.
48-
#[derive(Debug)]
49-
pub enum IrqType {
50-
/// Interrupt triggered by change in config.
51-
Config,
52-
/// Interrupt triggered by used vring buffers.
53-
Vring,
54-
}
55-
56-
/// Helper struct that is responsible for triggering guest IRQs
57-
#[derive(Debug)]
58-
pub struct IrqTrigger {
59-
pub(crate) irq_status: Arc<AtomicU32>,
60-
pub(crate) irq_evt: EventFd,
61-
}
62-
63-
impl IrqTrigger {
64-
pub fn new() -> std::io::Result<Self> {
65-
Ok(Self {
66-
irq_status: Arc::new(AtomicU32::new(0)),
67-
irq_evt: EventFd::new(libc::EFD_NONBLOCK)?,
68-
})
69-
}
70-
71-
pub fn trigger_irq(&self, irq_type: IrqType) -> Result<(), std::io::Error> {
72-
let irq = match irq_type {
73-
IrqType::Config => VIRTIO_MMIO_INT_CONFIG,
74-
IrqType::Vring => VIRTIO_MMIO_INT_VRING,
75-
};
76-
self.irq_status.fetch_or(irq, Ordering::SeqCst);
77-
78-
self.irq_evt.write(1).map_err(|err| {
79-
error!("Failed to send irq to the guest: {:?}", err);
80-
err
81-
})?;
82-
83-
Ok(())
84-
}
85-
}
86-
8747
/// Trait for virtio devices to be driven by a virtio transport.
8848
///
8949
/// The lifecycle of a virtio device is to be moved to a virtio transport, which will then query the
@@ -200,47 +160,6 @@ impl fmt::Debug for dyn VirtioDevice {
200160
pub(crate) mod tests {
201161
use super::*;
202162

203-
impl IrqTrigger {
204-
pub fn has_pending_irq(&self, irq_type: IrqType) -> bool {
205-
if let Ok(num_irqs) = self.irq_evt.read() {
206-
if num_irqs == 0 {
207-
return false;
208-
}
209-
210-
let irq_status = self.irq_status.load(Ordering::SeqCst);
211-
return matches!(
212-
(irq_status, irq_type),
213-
(VIRTIO_MMIO_INT_CONFIG, IrqType::Config)
214-
| (VIRTIO_MMIO_INT_VRING, IrqType::Vring)
215-
);
216-
}
217-
218-
false
219-
}
220-
}
221-
222-
#[test]
223-
fn irq_trigger() {
224-
let irq_trigger = IrqTrigger::new().unwrap();
225-
assert_eq!(irq_trigger.irq_status.load(Ordering::SeqCst), 0);
226-
227-
// Check that there are no pending irqs.
228-
assert!(!irq_trigger.has_pending_irq(IrqType::Config));
229-
assert!(!irq_trigger.has_pending_irq(IrqType::Vring));
230-
231-
// Check that trigger_irq() correctly generates irqs.
232-
irq_trigger.trigger_irq(IrqType::Config).unwrap();
233-
assert!(irq_trigger.has_pending_irq(IrqType::Config));
234-
irq_trigger.irq_status.store(0, Ordering::SeqCst);
235-
irq_trigger.trigger_irq(IrqType::Vring).unwrap();
236-
assert!(irq_trigger.has_pending_irq(IrqType::Vring));
237-
238-
// Check trigger_irq() failure case (irq_evt is full).
239-
irq_trigger.irq_evt.write(u64::MAX - 1).unwrap();
240-
irq_trigger.trigger_irq(IrqType::Config).unwrap_err();
241-
irq_trigger.trigger_irq(IrqType::Vring).unwrap_err();
242-
}
243-
244163
#[derive(Debug)]
245164
struct MockVirtioDevice {
246165
acked_features: u64,

src/vmm/src/devices/virtio/mod.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,12 @@ pub mod device;
1818
pub mod generated;
1919
mod iov_deque;
2020
pub mod iovec;
21-
pub mod mmio;
2221
pub mod net;
2322
pub mod persist;
2423
pub mod queue;
2524
pub mod rng;
2625
pub mod test_utils;
26+
pub mod transport;
2727
pub mod vhost_user;
2828
pub mod vhost_user_metrics;
2929
pub mod vsock;

src/vmm/src/devices/virtio/net/device.rs

+3-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ use log::error;
1515
use vmm_sys_util::eventfd::EventFd;
1616

1717
use super::NET_QUEUE_MAX_SIZE;
18-
use crate::devices::virtio::device::{DeviceState, IrqTrigger, IrqType, VirtioDevice};
18+
use crate::devices::virtio::device::{DeviceState, VirtioDevice};
1919
use crate::devices::virtio::generated::virtio_config::VIRTIO_F_VERSION_1;
2020
use crate::devices::virtio::generated::virtio_net::{
2121
VIRTIO_NET_F_CSUM, VIRTIO_NET_F_GUEST_CSUM, VIRTIO_NET_F_GUEST_TSO4, VIRTIO_NET_F_GUEST_TSO6,
@@ -32,6 +32,7 @@ use crate::devices::virtio::net::{
3232
MAX_BUFFER_SIZE, NET_QUEUE_SIZES, NetError, NetQueue, RX_INDEX, TX_INDEX, generated,
3333
};
3434
use crate::devices::virtio::queue::{DescriptorChain, Queue};
35+
use crate::devices::virtio::transport::mmio::{IrqTrigger, IrqType};
3536
use crate::devices::virtio::{ActivateError, TYPE_NET};
3637
use crate::devices::{DeviceError, report_net_event_fail};
3738
use crate::dumbo::pdu::arp::ETH_IPV4_FRAME_LEN;
@@ -1053,6 +1054,7 @@ pub mod tests {
10531054
};
10541055
use crate::devices::virtio::queue::VIRTQ_DESC_F_WRITE;
10551056
use crate::devices::virtio::test_utils::VirtQueue;
1057+
use crate::devices::virtio::transport::mmio::IrqType;
10561058
use crate::dumbo::EthernetFrame;
10571059
use crate::dumbo::pdu::arp::{ETH_IPV4_FRAME_LEN, EthIPv4ArpFrame};
10581060
use crate::dumbo::pdu::ethernet::ETHERTYPE_ARP;

src/vmm/src/devices/virtio/net/test_utils.rs

+4-3
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ impl TapTrafficSimulator {
104104

105105
let send_addr_ptr = &mut storage as *mut libc::sockaddr_storage;
106106

107-
// SAFETY: `sock_addr` is a valid pointer and safe to derference.
107+
// SAFETY: `sock_addr` is a valid pointer and safe to dereference.
108108
unsafe {
109109
let sock_addr: *mut libc::sockaddr_ll = send_addr_ptr.cast::<libc::sockaddr_ll>();
110110
(*sock_addr).sll_family = libc::sa_family_t::try_from(libc::AF_PACKET).unwrap();
@@ -223,7 +223,7 @@ pub fn if_index(tap: &Tap) -> i32 {
223223

224224
/// Enable the tap interface.
225225
pub fn enable(tap: &Tap) {
226-
// Disable IPv6 router advertisment requests
226+
// Disable IPv6 router advertisement requests
227227
Command::new("sh")
228228
.arg("-c")
229229
.arg(format!(
@@ -311,7 +311,7 @@ pub mod test {
311311
use event_manager::{EventManager, SubscriberId, SubscriberOps};
312312

313313
use crate::check_metric_after_block;
314-
use crate::devices::virtio::device::{IrqType, VirtioDevice};
314+
use crate::devices::virtio::device::VirtioDevice;
315315
use crate::devices::virtio::net::device::vnet_hdr_len;
316316
use crate::devices::virtio::net::generated::ETH_HLEN;
317317
use crate::devices::virtio::net::test_utils::{
@@ -320,6 +320,7 @@ pub mod test {
320320
use crate::devices::virtio::net::{MAX_BUFFER_SIZE, Net, RX_INDEX, TX_INDEX};
321321
use crate::devices::virtio::queue::{VIRTQ_DESC_F_NEXT, VIRTQ_DESC_F_WRITE};
322322
use crate::devices::virtio::test_utils::{VirtQueue, VirtqDesc};
323+
use crate::devices::virtio::transport::mmio::IrqType;
323324
use crate::logger::IncMetric;
324325
use crate::vstate::memory::{Address, Bytes, GuestAddress, GuestMemoryMmap};
325326

src/vmm/src/devices/virtio/persist.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@ use serde::{Deserialize, Serialize};
1212
use super::queue::QueueError;
1313
use crate::devices::virtio::device::VirtioDevice;
1414
use crate::devices::virtio::generated::virtio_ring::VIRTIO_RING_F_EVENT_IDX;
15-
use crate::devices::virtio::mmio::MmioTransport;
1615
use crate::devices::virtio::queue::Queue;
16+
use crate::devices::virtio::transport::mmio::MmioTransport;
1717
use crate::snapshot::Persist;
1818
use crate::vstate::memory::{GuestAddress, GuestMemoryMmap};
1919

@@ -261,10 +261,10 @@ mod tests {
261261
use crate::devices::virtio::block::virtio::VirtioBlock;
262262
use crate::devices::virtio::block::virtio::device::FileEngineType;
263263
use crate::devices::virtio::block::virtio::test_utils::default_block_with_path;
264-
use crate::devices::virtio::mmio::tests::DummyDevice;
265264
use crate::devices::virtio::net::Net;
266265
use crate::devices::virtio::net::test_utils::default_net;
267266
use crate::devices::virtio::test_utils::default_mem;
267+
use crate::devices::virtio::transport::mmio::tests::DummyDevice;
268268
use crate::devices::virtio::vsock::{Vsock, VsockUnixBackend};
269269
use crate::snapshot::Snapshot;
270270

0 commit comments

Comments
 (0)