devices: virtio: use QueueConfig in Queue::restore()
Use the negotiated feature bits in QueueConfig to determine the queue
type for activated queues when restoring from a snapshot. This also
means that VirtioDevice::queue_type() is unused, so it can be removed.
BUG=b:243621596
TEST=tools/dev_container tools/presubmit
Change-Id: I15be4c0a0794f28ff36cb3c0e6149b45ea90e2ad
Reviewed-on: https://chromium-review.googlesource.com/c/crosvm/crosvm/+/4735113
Reviewed-by: Keiichi Watanabe <keiichiw@chromium.org>
Commit-Queue: Daniel Verkamp <dverkamp@chromium.org>
Reviewed-by: Yuan Yao <yuanyaogoog@chromium.org>
diff --git a/devices/src/virtio/mod.rs b/devices/src/virtio/mod.rs
index c564190..7c3125a 100644
--- a/devices/src/virtio/mod.rs
+++ b/devices/src/virtio/mod.rs
@@ -76,7 +76,6 @@
pub use self::queue::split_descriptor_chain::SplitDescriptorChain;
pub use self::queue::Queue;
pub use self::queue::QueueConfig;
-pub use self::queue::QueueType;
pub use self::rng::Rng;
#[cfg(any(feature = "tpm", feature = "vtpm"))]
pub use self::tpm::Tpm;
diff --git a/devices/src/virtio/queue.rs b/devices/src/virtio/queue.rs
index c5884d6..e72ac83 100644
--- a/devices/src/virtio/queue.rs
+++ b/devices/src/virtio/queue.rs
@@ -390,14 +390,6 @@
PackedVirtQueue(PackedQueue),
}
-/// This enum is used to specify the type of virtqueue (split or packed).
-pub enum QueueType {
- /// Split Virtqueue type
- Split,
- /// Packed Virtqueue type
- Packed,
-}
-
impl Queue {
/// Asynchronously read the next descriptor chain from the queue.
/// Returns a `DescriptorChain` when it is `await`ed.
@@ -451,10 +443,14 @@
}
/// Restore queue from snapshot
- pub fn restore(queue_type: QueueType, queue_value: serde_json::Value) -> anyhow::Result<Queue> {
- match queue_type {
- QueueType::Split => SplitQueue::restore(queue_value).map(Queue::SplitVirtQueue),
- QueueType::Packed => PackedQueue::restore(queue_value).map(Queue::PackedVirtQueue),
+ pub fn restore(
+ queue_config: &QueueConfig,
+ queue_value: serde_json::Value,
+ ) -> anyhow::Result<Queue> {
+ if queue_config.acked_features & 1 << VIRTIO_F_RING_PACKED != 0 {
+ PackedQueue::restore(queue_value).map(Queue::PackedVirtQueue)
+ } else {
+ SplitQueue::restore(queue_value).map(Queue::SplitVirtQueue)
}
}
diff --git a/devices/src/virtio/vhost/user/device/handler.rs b/devices/src/virtio/vhost/user/device/handler.rs
index 4eb82ac..deb5436 100644
--- a/devices/src/virtio/vhost/user/device/handler.rs
+++ b/devices/src/virtio/vhost/user/device/handler.rs
@@ -101,7 +101,6 @@
use crate::virtio::Interrupt;
use crate::virtio::Queue;
use crate::virtio::QueueConfig;
-use crate::virtio::QueueType::Split;
use crate::virtio::SharedMemoryMapper;
use crate::virtio::SharedMemoryRegion;
@@ -267,7 +266,7 @@
self.enabled = vring_snapshot.enabled;
self.paused_queue = vring_snapshot
.paused_queue
- .map(|value| Queue::restore(Split, value))
+ .map(|value| Queue::restore(&self.queue, value))
.transpose()?;
Ok(())
}
diff --git a/devices/src/virtio/virtio_device.rs b/devices/src/virtio/virtio_device.rs
index cdb4e8b..d6e1f91 100644
--- a/devices/src/virtio/virtio_device.rs
+++ b/devices/src/virtio/virtio_device.rs
@@ -24,8 +24,6 @@
use crate::pci::{MsixConfig, MsixStatus};
use crate::virtio::ipc_memory_mapper::IpcMemoryMapper;
use crate::virtio::queue::QueueConfig;
-use crate::virtio::queue::QueueType;
-use virtio_sys::virtio_config::VIRTIO_F_RING_PACKED;
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum VirtioTransportType {
@@ -264,13 +262,4 @@
self.debug_label()
);
}
-
- /// Returns the queue type to use for this device based on the negotiated virtio features.
- /// Used for queue's restore from snapshot
- fn queue_type(&self) -> QueueType {
- if ((self.features() >> VIRTIO_F_RING_PACKED) & 1) != 0 {
- return QueueType::Packed;
- }
- QueueType::Split
- }
}
diff --git a/devices/src/virtio/virtio_pci_device.rs b/devices/src/virtio/virtio_pci_device.rs
index f9f44a8..f1fb7a8 100644
--- a/devices/src/virtio/virtio_pci_device.rs
+++ b/devices/src/virtio/virtio_pci_device.rs
@@ -1231,10 +1231,11 @@
if let Some(activated_queues_snapshot) = deser.activated_queues {
let mut activated_queues = BTreeMap::new();
for (index, queue_snapshot) in activated_queues_snapshot {
- activated_queues.insert(
- index,
- Queue::restore(self.device.queue_type(), queue_snapshot)?,
- );
+ let queue_config = self
+ .queues
+ .get(index)
+ .with_context(|| format!("missing queue config for activated queue {index}"))?;
+ activated_queues.insert(index, Queue::restore(queue_config, queue_snapshot)?);
}
// Restore the activated queues.