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.