diff --git a/devices/src/virtio/gpu/mod.rs b/devices/src/virtio/gpu/mod.rs index 7408d4925c..b7736e13f9 100644 --- a/devices/src/virtio/gpu/mod.rs +++ b/devices/src/virtio/gpu/mod.rs @@ -12,7 +12,6 @@ use std::cell::RefCell; use std::collections::BTreeMap; use std::collections::VecDeque; use std::io::Read; -use std::mem; use std::mem::size_of; use std::path::PathBuf; use std::rc::Rc; @@ -920,7 +919,7 @@ impl DisplayBackend { pub struct Gpu { exit_evt_wrtube: SendTube, mapper: Option>, - resource_bridges: Vec, + resource_bridges: Option, event_devices: Vec, kill_evt: Option, config_event: bool, @@ -1001,7 +1000,7 @@ impl Gpu { Gpu { exit_evt_wrtube, mapper: None, - resource_bridges, + resource_bridges: Some(ResourceBridges::new(resource_bridges)), event_devices, config_event: false, kill_evt: None, @@ -1130,8 +1129,9 @@ impl VirtioDevice for Gpu { } keep_rds.push(self.exit_evt_wrtube.as_raw_descriptor()); - for bridge in &self.resource_bridges { - keep_rds.push(bridge.as_raw_descriptor()); + + if let Some(resource_bridges) = &self.resource_bridges { + resource_bridges.append_raw_descriptors(&mut keep_rds); } keep_rds @@ -1213,7 +1213,13 @@ impl VirtioDevice for Gpu { }; self.kill_evt = Some(self_kill_evt); - let resource_bridges = ResourceBridges::new(mem::take(&mut self.resource_bridges)); + let resource_bridges = match self.resource_bridges.take() { + Some(bridges) => bridges, + None => { + error!("resource_bridges is none"); + return; + } + }; let irq = Arc::new(interrupt); let ctrl_queue = SharedQueueReader::new(queues.remove(0), &irq); @@ -1302,6 +1308,9 @@ impl VirtioDevice for Gpu { /// Trait that the platform-specific type `ResourceBridges` needs to implement. trait ResourceBridgesTrait { + // Appends raw descriptors of all resource bridges to the given vector. + fn append_raw_descriptors(&self, _rds: &mut Vec); + /// Adds all resource bridges to WaitContext. fn add_to_wait_context(&self, _wait_ctx: &mut WaitContext); diff --git a/devices/src/virtio/gpu/sys/unix.rs b/devices/src/virtio/gpu/sys/unix.rs index 68d827f7a1..8a4e2702b4 100644 --- a/devices/src/virtio/gpu/sys/unix.rs +++ b/devices/src/virtio/gpu/sys/unix.rs @@ -4,6 +4,8 @@ use anyhow::Context; use base::error; +use base::AsRawDescriptor; +use base::RawDescriptor; use base::Tube; use base::WaitContext; use serde::Deserialize; @@ -88,6 +90,12 @@ impl UnixResourceBridges { } impl ResourceBridgesTrait for UnixResourceBridges { + fn append_raw_descriptors(&self, rds: &mut Vec) { + for bridge in &self.resource_bridges { + rds.push(bridge.as_raw_descriptor()); + } + } + fn add_to_wait_context(&self, wait_ctx: &mut WaitContext) { for (index, bridge) in self.resource_bridges.iter().enumerate() { if let Err(e) = wait_ctx.add(bridge, WorkerToken::ResourceBridge { index }) { diff --git a/devices/src/virtio/gpu/sys/windows.rs b/devices/src/virtio/gpu/sys/windows.rs index 40b62642e1..cc107b26a5 100644 --- a/devices/src/virtio/gpu/sys/windows.rs +++ b/devices/src/virtio/gpu/sys/windows.rs @@ -5,6 +5,7 @@ use std::marker::PhantomData; use base::info; +use base::RawDescriptor; use base::Tube; use base::WaitContext; use serde::Deserialize; @@ -103,6 +104,8 @@ impl WinResourceBridges { } impl ResourceBridgesTrait for WinResourceBridges { + fn append_raw_descriptors(&self, _rds: &mut Vec) {} + fn add_to_wait_context(&self, _wait_ctx: &mut WaitContext) {} fn set_should_process(&mut self, _index: usize) {}