Skip to content

Commit 2adb53c

Browse files
committed
test(vhost-user-blk): preparation for unit testsing
Made `VhostUserBlock` generic on `VhostUserHandleBackend`. This will allow us to write unit tests. Signed-off-by: Egor Lazarchuk <[email protected]>
1 parent dc5c11c commit 2adb53c

File tree

1 file changed

+35
-7
lines changed
  • src/vmm/src/devices/virtio/vhost_user_block

1 file changed

+35
-7
lines changed

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

Lines changed: 35 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ use log::error;
1313
use utils::eventfd::EventFd;
1414
use utils::u64_to_usize;
1515
use vhost::vhost_user::message::*;
16-
use vhost::vhost_user::VhostUserMaster;
16+
use vhost::vhost_user::Master;
1717

1818
use super::{VhostUserBlockError, NUM_QUEUES, QUEUE_SIZE};
1919
use crate::devices::virtio::block_common::CacheType;
@@ -23,7 +23,8 @@ use crate::devices::virtio::gen::virtio_blk::{
2323
};
2424
use crate::devices::virtio::gen::virtio_ring::VIRTIO_RING_F_EVENT_IDX;
2525
use crate::devices::virtio::queue::Queue;
26-
use crate::devices::virtio::vhost_user::VhostUserHandle;
26+
use crate::devices::virtio::vhost_user::VhostUserHandleBackend;
27+
use crate::devices::virtio::vhost_user::VhostUserHandleImpl;
2728
use crate::devices::virtio::{ActivateError, TYPE_BLOCK};
2829
use crate::logger::{IncMetric, METRICS};
2930
use crate::vmm_config::drive::BlockDeviceConfig;
@@ -93,9 +94,10 @@ impl From<VhostUserBlockConfig> for BlockDeviceConfig {
9394
}
9495
}
9596

97+
pub type VhostUserBlock = VhostUserBlockImpl<Master>;
98+
9699
/// vhost-user block device.
97-
#[derive(Debug)]
98-
pub struct VhostUserBlock {
100+
pub struct VhostUserBlockImpl<T: VhostUserHandleBackend> {
99101
// Virtio fields.
100102
pub avail_features: u64,
101103
pub acked_features: u64,
@@ -116,11 +118,37 @@ pub struct VhostUserBlock {
116118
pub read_only: bool,
117119

118120
// Vhost user protocol handle
119-
pub vu_handle: VhostUserHandle,
121+
pub vu_handle: VhostUserHandleImpl<T>,
120122
pub vu_acked_protocol_features: u64,
121123
}
122124

123-
impl VhostUserBlock {
125+
// Need custom implementation because otherwise `Debug` is required for `vhost::Master`
126+
impl<T: VhostUserHandleBackend> std::fmt::Debug for VhostUserBlockImpl<T> {
127+
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
128+
f.debug_struct("VhostUserBlockImpl")
129+
.field("avail_features", &self.avail_features)
130+
.field("acked_features", &self.acked_features)
131+
.field("config_space", &self.config_space)
132+
.field("activate_evt", &self.activate_evt)
133+
.field("queues", &self.queues)
134+
.field("queue_evts", &self.queue_evts)
135+
.field("device_state", &self.device_state)
136+
.field("irq_trigger", &self.irq_trigger)
137+
.field("id", &self.id)
138+
.field("partuuid", &self.partuuid)
139+
.field("cache_type", &self.cache_type)
140+
.field("root_device", &self.root_device)
141+
.field("read_only", &self.read_only)
142+
.field("vu_handle", &self.vu_handle)
143+
.field(
144+
"vu_acked_protocol_features",
145+
&self.vu_acked_protocol_features,
146+
)
147+
.finish()
148+
}
149+
}
150+
151+
impl<T: VhostUserHandleBackend> VhostUserBlockImpl<T> {
124152
pub fn new(config: VhostUserBlockConfig) -> Result<Self, VhostUserBlockError> {
125153
let mut requested_features = (1 << VIRTIO_F_VERSION_1)
126154
| (1 << VIRTIO_RING_F_EVENT_IDX)
@@ -137,7 +165,7 @@ impl VhostUserBlock {
137165

138166
let requested_protocol_features = VhostUserProtocolFeatures::CONFIG;
139167

140-
let mut vu_handle = VhostUserHandle::new(&config.socket, NUM_QUEUES)
168+
let mut vu_handle = VhostUserHandleImpl::<T>::new(&config.socket, NUM_QUEUES)
141169
.map_err(VhostUserBlockError::VhostUser)?;
142170
let (acked_features, acked_protocol_features) = vu_handle
143171
.negotiate_features(requested_features, requested_protocol_features)

0 commit comments

Comments
 (0)