From 9d66f7f08be3db97799b8fb7dfa7a367fed5e49f Mon Sep 17 00:00:00 2001 From: Dorinda Bassey Date: Wed, 19 Nov 2025 11:13:04 +0100 Subject: [PATCH] vhost-device-gpu: Make Adapter new() return Result Change all GPU adapter new() methods to return io::Result. This allows callers to decide how to handle initialization failures. Signed-off-by: Dorinda Bassey --- vhost-device-gpu/src/backend/gfxstream.rs | 12 ++++++++---- vhost-device-gpu/src/backend/null.rs | 10 ++++++---- vhost-device-gpu/src/backend/virgl.rs | 14 +++++++++----- vhost-device-gpu/src/device.rs | 2 +- 4 files changed, 24 insertions(+), 14 deletions(-) diff --git a/vhost-device-gpu/src/backend/gfxstream.rs b/vhost-device-gpu/src/backend/gfxstream.rs index c1b41ec..f78b62c 100644 --- a/vhost-device-gpu/src/backend/gfxstream.rs +++ b/vhost-device-gpu/src/backend/gfxstream.rs @@ -7,7 +7,7 @@ use std::{ cell::RefCell, collections::BTreeMap, - io::IoSliceMut, + io::{self, IoSliceMut}, os::{fd::FromRawFd, raw::c_void}, sync::{Arc, Mutex}, }; @@ -103,7 +103,11 @@ pub struct GfxstreamAdapter { } impl GfxstreamAdapter { - pub fn new(queue_ctl: &VringRwLock, gpu_config: &GpuConfig, gpu_backend: GpuBackend) -> Self { + pub fn new( + queue_ctl: &VringRwLock, + gpu_config: &GpuConfig, + gpu_backend: GpuBackend, + ) -> io::Result { let fence_state = Arc::new(Mutex::new(FenceState::default())); let fence = Self::create_fence_handler(queue_ctl.clone(), fence_state.clone()); @@ -116,12 +120,12 @@ impl GfxstreamAdapter { } }); - Self { + Ok(Self { gpu_backend, fence_state, resources: BTreeMap::new(), scanouts: Default::default(), - } + }) } fn create_fence_handler( diff --git a/vhost-device-gpu/src/backend/null.rs b/vhost-device-gpu/src/backend/null.rs index 6be1b3e..9fe114e 100644 --- a/vhost-device-gpu/src/backend/null.rs +++ b/vhost-device-gpu/src/backend/null.rs @@ -3,6 +3,8 @@ // // SPDX-License-Identifier: Apache-2.0 or BSD-3-Clause +use std::io; + use log::trace; use rutabaga_gfx::RutabagaFence; use vhost::vhost_user::{ @@ -28,11 +30,11 @@ impl NullAdapter { _queue_ctl: &vhost_user_backend::VringRwLock, _config: &GpuConfig, gpu_backend: GpuBackend, - ) -> Self { + ) -> io::Result { trace!("NullAdapter created"); - Self { + Ok(Self { _gpu_backend: gpu_backend, - } + }) } } @@ -264,7 +266,7 @@ mod tests { let vring = VringRwLock::new(mem, 0x100).unwrap(); let config = GpuConfig::new(GpuMode::Null, None, GpuFlags::default()).unwrap(); - NullAdapter::new(&vring, &config, gpu_backend) + NullAdapter::new(&vring, &config, gpu_backend).unwrap() } #[test] diff --git a/vhost-device-gpu/src/backend/virgl.rs b/vhost-device-gpu/src/backend/virgl.rs index b1b6279..2758c2e 100644 --- a/vhost-device-gpu/src/backend/virgl.rs +++ b/vhost-device-gpu/src/backend/virgl.rs @@ -6,7 +6,7 @@ use std::{ collections::BTreeMap, - io::IoSliceMut, + io::{self, IoSliceMut}, os::fd::{AsFd, FromRawFd, IntoRawFd, RawFd}, sync::{Arc, Mutex}, }; @@ -142,7 +142,11 @@ pub struct VirglRendererAdapter { } impl VirglRendererAdapter { - pub fn new(queue_ctl: &VringRwLock, config: &GpuConfig, gpu_backend: GpuBackend) -> Self { + pub fn new( + queue_ctl: &VringRwLock, + config: &GpuConfig, + gpu_backend: GpuBackend, + ) -> io::Result { let virglrenderer_flags = VirglRendererFlags::new() .use_virgl(true) .use_venus(true) @@ -161,14 +165,14 @@ impl VirglRendererAdapter { let renderer = VirglRenderer::init(virglrenderer_flags, fence_handler, None) .expect("Failed to initialize virglrenderer"); - Self { + Ok(Self { renderer, gpu_backend, fence_state, resources: BTreeMap::new(), contexts: BTreeMap::new(), scanouts: Default::default(), - } + }) } } @@ -758,7 +762,7 @@ mod virgl_cov_tests { create_vring(&mem, &[] as &[TestingDescChainArgs], GuestAddress(0x2000), GuestAddress(0x4000), 64); let backend = dummy_gpu_backend(); - let mut gpu = VirglRendererAdapter::new(&vring, &cfg, backend); + let mut gpu = VirglRendererAdapter::new(&vring, &cfg, backend).unwrap(); gpu.event_poll(); let edid_req = VhostUserGpuEdidRequest { diff --git a/vhost-device-gpu/src/device.rs b/vhost-device-gpu/src/device.rs index fd67fed..434779e 100644 --- a/vhost-device-gpu/src/device.rs +++ b/vhost-device-gpu/src/device.rs @@ -24,7 +24,7 @@ macro_rules! handle_adapter { // Pass $vrings to the call let (control_vring, gpu_backend) = $self.extract_backend_and_vring($vrings)?; - let renderer = $new_adapter(control_vring, gpu_backend); + let renderer = $new_adapter(control_vring, gpu_backend)?; event_poll_fd = renderer.get_event_poll_fd(); maybe_renderer.insert(renderer)