Skip to content

Commit 96ee096

Browse files
elmarcokraxel
authored andcommitted
vhost-user-gpu: fix vugbm_device_init fallback
vugbm implements GBM device wrapping, udmabuf and memory fallback. However, the fallback/detection logic is flawed, as if "/dev/udmabuf" failed to be opened, it will not initialize vugbm and crash later. Rework the vugbm_device_init() logic to initialize correctly in all cases. Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com> Message-Id: <20210312100108.2706195-4-marcandre.lureau@redhat.com> Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
1 parent 0c27b9c commit 96ee096

File tree

3 files changed

+22
-30
lines changed

3 files changed

+22
-30
lines changed

contrib/vhost-user-gpu/vhost-user-gpu.c

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1186,11 +1186,7 @@ main(int argc, char *argv[])
11861186
exit(EXIT_FAILURE);
11871187
}
11881188

1189-
if (g.drm_rnode_fd >= 0) {
1190-
if (!vugbm_device_init(&g.gdev, g.drm_rnode_fd)) {
1191-
g_warning("Failed to init DRM device, using fallback path");
1192-
}
1193-
}
1189+
vugbm_device_init(&g.gdev, g.drm_rnode_fd);
11941190

11951191
if ((!!opt_socket_path + (opt_fdnum != -1)) != 1) {
11961192
g_printerr("Please specify either --fd or --socket-path\n");

contrib/vhost-user-gpu/vugbm.c

Lines changed: 20 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -199,55 +199,51 @@ vugbm_device_destroy(struct vugbm_device *dev)
199199
dev->device_destroy(dev);
200200
}
201201

202-
bool
202+
void
203203
vugbm_device_init(struct vugbm_device *dev, int fd)
204204
{
205-
dev->fd = fd;
205+
assert(!dev->inited);
206206

207207
#ifdef CONFIG_GBM
208-
dev->dev = gbm_create_device(fd);
209-
#endif
210-
211-
if (0) {
212-
/* nothing */
208+
if (fd >= 0) {
209+
dev->dev = gbm_create_device(fd);
213210
}
214-
#ifdef CONFIG_GBM
215-
else if (dev->dev != NULL) {
211+
if (dev->dev != NULL) {
212+
dev->fd = fd;
216213
dev->alloc_bo = alloc_bo;
217214
dev->free_bo = free_bo;
218215
dev->get_fd = get_fd;
219216
dev->map_bo = map_bo;
220217
dev->unmap_bo = unmap_bo;
221218
dev->device_destroy = device_destroy;
219+
dev->inited = true;
222220
}
223221
#endif
224222
#ifdef CONFIG_MEMFD
225-
else if (g_file_test("/dev/udmabuf", G_FILE_TEST_EXISTS)) {
223+
if (!dev->inited && g_file_test("/dev/udmabuf", G_FILE_TEST_EXISTS)) {
226224
dev->fd = open("/dev/udmabuf", O_RDWR);
227-
if (dev->fd < 0) {
228-
return false;
225+
if (dev->fd >= 0) {
226+
g_debug("Using experimental udmabuf backend");
227+
dev->alloc_bo = udmabuf_alloc_bo;
228+
dev->free_bo = udmabuf_free_bo;
229+
dev->get_fd = udmabuf_get_fd;
230+
dev->map_bo = udmabuf_map_bo;
231+
dev->unmap_bo = udmabuf_unmap_bo;
232+
dev->device_destroy = udmabuf_device_destroy;
233+
dev->inited = true;
229234
}
230-
g_debug("Using experimental udmabuf backend");
231-
dev->alloc_bo = udmabuf_alloc_bo;
232-
dev->free_bo = udmabuf_free_bo;
233-
dev->get_fd = udmabuf_get_fd;
234-
dev->map_bo = udmabuf_map_bo;
235-
dev->unmap_bo = udmabuf_unmap_bo;
236-
dev->device_destroy = udmabuf_device_destroy;
237235
}
238236
#endif
239-
else {
237+
if (!dev->inited) {
240238
g_debug("Using mem fallback");
241239
dev->alloc_bo = mem_alloc_bo;
242240
dev->free_bo = mem_free_bo;
243241
dev->map_bo = mem_map_bo;
244242
dev->unmap_bo = mem_unmap_bo;
245243
dev->device_destroy = mem_device_destroy;
246-
return false;
244+
dev->inited = true;
247245
}
248-
249-
dev->inited = true;
250-
return true;
246+
assert(dev->inited);
251247
}
252248

253249
static bool

contrib/vhost-user-gpu/vugbm.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ struct vugbm_buffer {
5454
uint32_t format;
5555
};
5656

57-
bool vugbm_device_init(struct vugbm_device *dev, int fd);
57+
void vugbm_device_init(struct vugbm_device *dev, int fd);
5858
void vugbm_device_destroy(struct vugbm_device *dev);
5959

6060
bool vugbm_buffer_create(struct vugbm_buffer *buffer, struct vugbm_device *dev,

0 commit comments

Comments
 (0)