vhost-device-gpu: Make Adapter new() return Result

Change all GPU adapter new() methods to return
io::Result<Self>. This allows callers to decide
how to handle initialization failures.

Signed-off-by: Dorinda Bassey <dbassey@redhat.com>
This commit is contained in:
Dorinda Bassey 2025-11-19 11:13:04 +01:00
parent 9191a0c1de
commit 9d66f7f08b
4 changed files with 24 additions and 14 deletions

View File

@ -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<Self> {
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(

View File

@ -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<Self> {
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]

View File

@ -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<Self> {
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 {

View File

@ -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)