mirror of
https://chromium.googlesource.com/crosvm/crosvm
synced 2025-02-09 03:57:24 +00:00
gpu: don't use raw descriptors of resource bridges on Windows.
Resource bridges are not supported on Windows, so we shouldn't try to add their raw descriptors in Gpu::keep_rds(). Struct Gpu is updated to hold the ResourceBridges struct rather than the Vec<Tube>. BUG=b:213149288 TEST=presubmit Change-Id: I6b71076d17057728b927d93462e3aee29f3ac8af Reviewed-on: https://chromium-review.googlesource.com/c/crosvm/crosvm/+/3911100 Commit-Queue: Pujun Lun <lunpujun@google.com> Reviewed-by: Alexandre Courbot <acourbot@chromium.org>
This commit is contained in:
parent
572519253d
commit
9a415a2559
3 changed files with 26 additions and 6 deletions
|
@ -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<Box<dyn SharedMemoryMapper>>,
|
||||
resource_bridges: Vec<Tube>,
|
||||
resource_bridges: Option<ResourceBridges>,
|
||||
event_devices: Vec<EventDevice>,
|
||||
kill_evt: Option<Event>,
|
||||
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<RawDescriptor>);
|
||||
|
||||
/// Adds all resource bridges to WaitContext.
|
||||
fn add_to_wait_context(&self, _wait_ctx: &mut WaitContext<WorkerToken>);
|
||||
|
||||
|
|
|
@ -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<RawDescriptor>) {
|
||||
for bridge in &self.resource_bridges {
|
||||
rds.push(bridge.as_raw_descriptor());
|
||||
}
|
||||
}
|
||||
|
||||
fn add_to_wait_context(&self, wait_ctx: &mut WaitContext<WorkerToken>) {
|
||||
for (index, bridge) in self.resource_bridges.iter().enumerate() {
|
||||
if let Err(e) = wait_ctx.add(bridge, WorkerToken::ResourceBridge { index }) {
|
||||
|
|
|
@ -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<RawDescriptor>) {}
|
||||
|
||||
fn add_to_wait_context(&self, _wait_ctx: &mut WaitContext<WorkerToken>) {}
|
||||
|
||||
fn set_should_process(&mut self, _index: usize) {}
|
||||
|
|
Loading…
Reference in a new issue