diff options
-rw-r--r-- | Makefile | 7 | ||||
-rw-r--r-- | adapter.c | 51 | ||||
-rw-r--r-- | adapter.h | 53 | ||||
-rw-r--r-- | vhost_loopback.c | 19 | ||||
-rw-r--r-- | vhost_user_blk.c | 97 | ||||
-rw-r--r-- | vhost_user_can.c | 33 | ||||
-rw-r--r-- | vhost_user_can.h | 4 | ||||
-rw-r--r-- | vhost_user_console.c | 33 | ||||
-rw-r--r-- | vhost_user_console.h | 4 | ||||
-rw-r--r-- | vhost_user_gpio.c | 30 | ||||
-rw-r--r-- | vhost_user_gpio.h | 4 | ||||
-rw-r--r-- | vhost_user_input.c | 18 | ||||
-rw-r--r-- | vhost_user_input.h | 29 | ||||
-rw-r--r-- | vhost_user_loopback.c | 211 | ||||
-rw-r--r-- | vhost_user_loopback.h | 4 | ||||
-rw-r--r-- | vhost_user_rng.c | 48 | ||||
-rw-r--r-- | vhost_user_rng.h | 2 | ||||
-rw-r--r-- | vhost_user_sound.c | 38 | ||||
-rw-r--r-- | vhost_user_sound.h | 4 | ||||
-rw-r--r-- | virtio_input.c | 101 | ||||
-rw-r--r-- | virtio_loopback.c | 45 | ||||
-rw-r--r-- | virtio_loopback.h | 6 | ||||
-rw-r--r-- | virtio_rng.c | 9 | ||||
-rw-r--r-- | virtio_rng.h | 2 |
24 files changed, 510 insertions, 342 deletions
@@ -18,10 +18,9 @@ # Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -#CFLAGS := -Wall -Wextra -Werror -#CFLAGS := -Wall -Wextra -Wno-unused-variable -Wno-unused-function -CFLAGS := -Wno-unused-variable -Wno-unused-function -D_GNU_SOURCE -CFLAGS = -D_GNU_SOURCE -O2 +#CFLAGS := -Wno-unused-variable -Wno-unused-function -D_GNU_SOURCE +CFLAGS = -D_GNU_SOURCE -O2 -Wall -Wextra -Werror + CC ?= ifeq ($(ARCH), arm64) @@ -1,5 +1,5 @@ /* - * Copyright 2022-2023 Virtual Open Systems SAS + * Copyright 2022-2024 Virtual Open Systems SAS * * Authors: * Timos Ampelikiotis <t.ampelikiotis@virtualopensystems.com> @@ -41,24 +41,7 @@ #include <sys/un.h> /* Project header files */ -#include "virtio_loopback.h" -#include "vhost_user_loopback.h" -#include "virtio_rng.h" -#include "vhost_user_rng.h" -#include "vhost_user_blk.h" -#include "vhost_user_input.h" -#include "vhost_user_gpio.h" -#include "vhost_user_sound.h" -#include "vhost_user_can.h" -#include "vhost_user_console.h" - - -#ifdef DEBUG -#define DBG(...) printf("adapter: " __VA_ARGS__) -#else -#define DBG(...) -#endif /* DEBUG */ - +#include "adapter.h" /* Global variables */ int client_sock; @@ -66,7 +49,6 @@ struct vhost_dev *dev; struct adapter_dev *adev; struct vhost_user *vudev; - void vhost_user_adapter_init(void) { @@ -99,7 +81,6 @@ void vhost_user_adapter_init(void) adev->vbus = global_vbus; } - void client(char *sock_path) { int rc, len; @@ -159,11 +140,7 @@ int find_arg(int argc, char **argv, char *str) int val_device_arg(char *str) { - char *adapter_devices[] = {"vrng", "vhurng", "vhublk", "vhuinput", - "vhusnd", "vhugpio", "vhucan", "vhuconsole"}; - char *vhu_devices[] = {"vhurng", "vhublk", "vhuinput", "vhusnd", - "vhugpio", "vhucan", "vhuconsole"}; - int adapter_devices_num = 8, i; + int adapter_devices_num = ADAPTER_DEVS, i; for (i = 0; i < adapter_devices_num; i++) { if (!strcmp(adapter_devices[i], str)) { @@ -176,9 +153,7 @@ int val_device_arg(char *str) bool check_vhu_device(char *str) { - char *vhu_devices[] = {"vhurng", "vhublk", "vhuinput", "vhusnd", - "vhugpio", "vhucan", "vhuconsole"}; - int vhu_devices_num = 7, i; + int vhu_devices_num = VHU_DEVS, i; for (i = 0; i < vhu_devices_num; i++) { if (!strcmp(vhu_devices[i], str)) { @@ -276,36 +251,38 @@ int main(int argc, char **argv) /* Initialize the adapter data structures */ vhost_user_adapter_init(); + /* Get queue number and size from arguments */ + get_queue_num_size_args(argc, argv, &queue_num, &queue_size); + /* Initialize the virtio/vhost-user device */ /* TODO: Switch numbers with name defs */ switch (device_id) { case 1: - virtio_rng_realize(); + virtio_rng_realize(queue_num, queue_size); break; case 2: - vhost_user_rng_realize(); + vhost_user_rng_realize(queue_num, queue_size); break; case 3: - get_queue_num_size_args(argc, argv, &queue_num, &queue_size); printf("Running vhublk with num %d and size %d\n", queue_num, queue_size); vhost_user_blk_realize(queue_num, queue_size); break; case 4: vhost_user_input_init(global_vdev); - virtio_input_device_realize(); + virtio_input_device_realize(queue_num, queue_size); break; case 5: - vus_device_realize(); + vus_device_realize(queue_num, queue_size); break; case 6: - vu_gpio_device_realize(); + vu_gpio_device_realize(queue_num, queue_size); break; case 7: - vhost_user_can_realize(); + vhost_user_can_realize(queue_num, queue_size); break; case 8: - vhost_user_console_realize(); + vhost_user_console_realize(queue_num, queue_size); break; default: exit(1); diff --git a/adapter.h b/adapter.h new file mode 100644 index 0000000..67a64df --- /dev/null +++ b/adapter.h @@ -0,0 +1,53 @@ +/* + * + * Copyright (c) 2022-2024 Virtual Open Systems SAS. + * + * Author: + * Timos Ampelikiotis <t.ampelikiotis@virtualopensystems.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifndef ADAPTER +#define ADAPTER + +/* Project header files */ +#include "virtio_loopback.h" +#include "vhost_user_loopback.h" +#include "virtio_rng.h" +#include "vhost_user_rng.h" +#include "vhost_user_blk.h" +#include "vhost_user_input.h" +#include "vhost_user_gpio.h" +#include "vhost_user_sound.h" +#include "vhost_user_can.h" +#include "vhost_user_console.h" + +#ifdef DEBUG +#define DBG(...) printf("adapter: " __VA_ARGS__) +#else +#define DBG(...) +#endif /* DEBUG */ + +#define VHU_DEVS 8 +#define ADAPTER_DEVS (VHU_DEVS + 1) + +const char *adapter_devices[] = {"vrng", "vhurng", "vhublk", "vhuinput", + "vhusnd", "vhugpio", "vhucan", + "vhuconsole" }; +const char *vhu_devices[] = {"vhurng", "vhublk", "vhuinput", "vhusnd", + "vhugpio", "vhucan", "vhuconsole"}; + +#endif /* ADAPTER */ diff --git a/vhost_loopback.c b/vhost_loopback.c index e29707e..5fd3b05 100644 --- a/vhost_loopback.c +++ b/vhost_loopback.c @@ -68,7 +68,8 @@ */ int vhost_dev_enable_notifiers(struct vhost_dev *hdev, VirtIODevice *vdev) { - int i, r, e; + unsigned int i; + int r; /* * We will pass the notifiers to the kernel, make sure that QEMU @@ -224,7 +225,6 @@ static int vhost_virtqueue_start(struct vhost_dev *dev, struct vhost_virtqueue *vq, unsigned idx) { - VirtioBus *vbus = vdev->vbus; uint64_t s, l, a; int r; @@ -240,21 +240,21 @@ static int vhost_virtqueue_start(struct vhost_dev *dev, a = virtio_queue_get_desc_addr(vdev, idx); if (a == 0) { /* Queue might not be ready for start */ - DBG("Error: Queue (%d) might not be ready for start\n", idx); + DBG("Warn: Queue (%d) might not be ready for start\n", idx); return 0; } vq->num = state.num = virtio_queue_get_num(vdev, idx); r = vhost_user_set_vring_num(dev, &state); - if (r) { + if (r < 0) { DBG("vhost_set_vring_num failed\n"); return r; } state.num = virtio_queue_get_last_avail_idx(vdev, idx); r = vhost_user_set_vring_base(dev, &state); - if (r) { + if (r < 0) { DBG("vhost_set_vring_base failed\n"); return r; } @@ -300,7 +300,7 @@ static int vhost_virtqueue_start(struct vhost_dev *dev, file.fd = event_notifier_get_fd(virtio_queue_get_host_notifier(vvq)); r = vhost_user_set_vring_kick(&file); - if (r) { + if (r < 0) { DBG("vhost_set_vring_kick failed\n"); return r; } @@ -350,7 +350,8 @@ static int vhost_dev_set_vring_enable(struct vhost_dev *hdev, int enable) /* Host notifiers must be enabled at this point. */ int vhost_dev_start(struct vhost_dev *hdev, VirtIODevice *vdev, bool vrings) { - int i, r; + unsigned int i; + int r; hdev->started = true; hdev->vdev = vdev; @@ -444,9 +445,9 @@ int vhost_dev_set_inflight(struct vhost_dev *dev, if (inflight->addr) { r = vhost_user_set_inflight_fd(dev, inflight); - if (r) { + if (r < 0) { DBG("vhost_set_inflight_fd failed\n"); - return -1; + return r; } } diff --git a/vhost_user_blk.c b/vhost_user_blk.c index d182a74..f0ae3d4 100644 --- a/vhost_user_blk.c +++ b/vhost_user_blk.c @@ -54,7 +54,8 @@ static int vhost_user_blk_start(VirtIODevice *vdev) { VHostUserBlk *s = vdev->vhublk; VirtioBus *k = vdev->vbus; - int i, ret; + unsigned int i; + int ret; DBG("vhost_user_blk_start\n"); @@ -102,7 +103,7 @@ static int vhost_user_blk_start(VirtIODevice *vdev) DBG("After vhost_dev_set_inflight\n"); - ret = vhost_dev_start(s->vhost_dev, vdev, false); + ret = vhost_dev_start(s->vhost_dev, vdev, true); if (ret < 0) { DBG("Error starting vhost\n"); return ret; @@ -110,6 +111,7 @@ static int vhost_user_blk_start(VirtIODevice *vdev) s->started_vu = true; + DBG("vhost_virtqueue_mask\n"); /* * guest_notifier_mask/pending not used yet, so just unmask @@ -125,11 +127,6 @@ static int vhost_user_blk_start(VirtIODevice *vdev) } -static void vhost_user_blk_stop(VirtIODevice *vdev) -{ - DBG("Not yet implemented\n"); -} - static int vhost_user_blk_handle_config_change(struct vhost_dev *dev) { int ret; @@ -156,12 +153,10 @@ static int vhost_user_blk_handle_config_change(struct vhost_dev *dev) return 0; } - const VhostDevConfigOps blk_ops = { .vhost_dev_config_notifier = vhost_user_blk_handle_config_change, }; - static uint64_t vhost_user_blk_get_features(VirtIODevice *vdev, uint64_t features) { @@ -205,7 +200,6 @@ static uint64_t vhost_user_blk_get_features(VirtIODevice *vdev, static int vhost_user_blk_connect(VirtIODevice *vdev) { VHostUserBlk *s = vdev->vhublk; - int ret = 0; DBG("vhost_user_blk_connect(...)\n"); @@ -213,6 +207,7 @@ static int vhost_user_blk_connect(VirtIODevice *vdev) DBG("s->connected\n"); return 0; } + s->connected = true; s->vhost_dev->num_queues = s->num_queues; s->vhost_dev->nvqs = s->num_queues; @@ -220,6 +215,8 @@ static int vhost_user_blk_connect(VirtIODevice *vdev) s->vhost_dev->vq_index = 0; s->vhost_dev->backend_features = 0; + DBG("s->vhost_dev->nvqs: %d\n", s->vhost_dev->nvqs); + vhost_dev_set_config_notifier(s->vhost_dev, &blk_ops); vhost_dev_init(s->vhost_dev); @@ -235,34 +232,39 @@ static int vhost_user_blk_connect(VirtIODevice *vdev) DBG("After init global_vdev->host_features: 0x%lx\n", global_vdev->host_features); - /* Restore vhost state */ - if (virtio_device_started(vdev, vdev->status)) { - ret = vhost_user_blk_start(vdev); - if (ret < 0) { - DBG("vhost_user_blk_start failed\n"); - return ret; - } - } - DBG("vhost_user_blk_connect return successfully!\n"); return 0; } -static void vhost_user_blk_disconnect(VirtIODevice *dev) -{ - DBG("vhost_user_blk_disconnect not yet implemented\n"); -} - -static void vhost_user_blk_chr_closed_bh(void *opaque) -{ - DBG("vhost_user_blk_chr_closed_bh not yet implemented\n"); -} - -static void vhost_user_blk_event(void *opaque) -{ - DBG("vhost_user_blk_event not yet implemented"); -} +/* + * These functions will be used in the future: + * + * static void vhost_user_blk_stop(VirtIODevice *vdev) + * { + * DBG("Not yet implemented\n"); + * (void)vdev; + * } + * + * static void vhost_user_blk_disconnect(VirtIODevice *dev) + * { + * DBG("vhost_user_blk_disconnect not yet implemented\n"); + * (void)dev; + * } + * + * static void vhost_user_blk_chr_closed_bh(void *opaque) + * { + * DBG("vhost_user_blk_chr_closed_bh not yet implemented\n"); + * (void)opaque; + * } + * + * static void vhost_user_blk_event(void *opaque) + * { + * DBG("vhost_user_blk_event not yet implemented"); + * (void)opaque; + * } + * + */ static int vhost_user_blk_realize_connect(VHostUserBlk *s) { @@ -287,24 +289,34 @@ static int vhost_user_blk_realize_connect(VHostUserBlk *s) return ret; } + if (global_vdev->vhublk->config_wce != s->blkcfg.wce) { + s->blkcfg.wce = global_vdev->vhublk->config_wce; + + ret = vhost_dev_set_config(s->vhost_dev, (uint8_t *)&s->blkcfg.wce, + offsetof(struct virtio_blk_config, wce), + sizeof(s->blkcfg.wce), + VHOST_SET_CONFIG_TYPE_MASTER); + if (ret < 0) { + DBG("set device config space failed\n"); + return ret; + } + } + return 0; } - static void vhost_user_blk_device_unrealize(VirtIODevice *vdev) { DBG("vhost_user_blk_device_unrealize not yet implemented\n"); + (void)vdev; } static void vhost_user_blk_reset(VirtIODevice *vdev) { DBG("vhost_user_blk_reset not yet implemented\n"); + (void)vdev; } -static void vhost_user_blk_set_config(VirtIODevice *vdev, - const uint8_t *config); - - static void vhost_user_blk_update_config(VirtIODevice *vdev, uint8_t *config) { VHostUserBlk *s = vdev->vhublk; @@ -334,7 +346,7 @@ static void vhost_user_blk_set_config(VirtIODevice *vdev, const uint8_t *config) offsetof(struct virtio_blk_config, wce), sizeof(blkcfg->wce), VHOST_SET_CONFIG_TYPE_MASTER); - if (ret) { + if (ret < 0) { DBG("set device config space failed\n"); return; } @@ -382,6 +394,7 @@ static void print_config_blk(uint8_t *config_data) struct virtio_blk_config *config_strct = (struct virtio_blk_config *)config_data; + (void)config_strct; DBG("uint64_t capacity: %llu\n", config_strct->capacity); DBG("uint32_t size_max: %u\n", config_strct->size_max); DBG("uint32_t seg_max: %u\n", config_strct->seg_max); @@ -444,7 +457,7 @@ void vhost_user_blk_init(VirtIODevice *vdev) VHostUserBlk *vhublk = (VHostUserBlk *)malloc(sizeof(VHostUserBlk)); vdev->vhublk = vhublk; - vdev->nvqs = &dev->nvqs; + vdev->nvqs = (int *)&dev->nvqs; vhublk->parent = vdev; vhublk->virtqs = vdev->vqs; vhublk->vhost_dev = dev; @@ -460,6 +473,8 @@ static void vhost_user_blk_handle_output(VirtIODevice *vdev, VirtQueue *vq) * however virtio's cleanup path can call this. */ DBG("vhost_user_blk_handle_output not yet implemented\n"); + (void)vdev; + (void)vq; } void vhost_user_blk_realize(int queue_num, int queue_size) @@ -483,8 +498,8 @@ void vhost_user_blk_realize(int queue_num, int queue_size) global_vdev->vhublk->config_wce = 1; + global_vdev->vhublk->vhost_dev->nvqs = queue_num; global_vdev->vhublk->num_queues = queue_num; - global_vdev->vhublk->queue_size = queue_size; /* NOTE: global_vdev->vqs == vhublk->virtqs */ diff --git a/vhost_user_can.c b/vhost_user_can.c index 8a1b1ae..251eba0 100644 --- a/vhost_user_can.c +++ b/vhost_user_can.c @@ -5,7 +5,7 @@ * https://github.com/OpenSynergy/qemu/tree/virtio-can-spec-rfc-v3 * * Copyright (C) 2021-2023 OpenSynergy GmbH - * Copyright (c) 2023 Virtual Open Systems SAS. + * Copyright (c) 2023-2024 Virtual Open Systems SAS. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -73,7 +73,7 @@ static void vhost_user_can_start(VirtIODevice *vdev) VHostUserCan *vhucan = vdev->vhucan; VirtioBus *k = vdev->vbus; int ret; - int i; + unsigned int i; DBG("vhost_user_can_start(...)\n"); @@ -111,9 +111,6 @@ static void vhost_user_can_start(VirtIODevice *vdev) vhost_virtqueue_mask(vhucan->vhost_dev, vdev, i, false); } - /* Wait a bit for the vrings to be set in vhost-user-device */ - sleep(1); - return; err_guest_notifiers: @@ -125,6 +122,7 @@ err_host_notifiers: static void vhost_user_can_stop(VirtIODevice *vdev) { DBG("vhost_user_can_stop: not yet implemented\n"); + (void)vdev; } static void vhost_user_can_set_status(VirtIODevice *vdev, uint8_t status) @@ -162,6 +160,8 @@ static void vhost_user_can_can_handle_output(VirtIODevice *vdev, VirtQueue *vq) * however virtio's cleanup path can call this. */ DBG("vhost_user_can_can_handle_output: Not yet implemented!\n"); + (void)vdev; + (void)vq; } /* @@ -199,12 +199,14 @@ const VhostDevConfigOps can_config_ops = { static void vhost_user_can_init(VirtIODevice *vdev); -void vhost_user_can_realize() +void vhost_user_can_realize(int queue_num, int queue_size) { VirtIODevice *vdev = global_vdev; int ret; DBG("vhost_user_can_device_realize\n"); + (void)queue_num; + (void)queue_size; /* This needs to be added */ proxy = (VirtIOMMIOProxy *)malloc(sizeof(VirtIOMMIOProxy)); @@ -272,22 +274,27 @@ vhost_dev_init_failed: static void vhost_user_can_device_unrealize(VirtIODevice *vdev) { DBG("vhost_user_blk_device_unrealize not yet implemented\n"); + (void)vdev; } -static struct vhost_dev *vhost_user_can_get_vhost(VirtIODevice *vdev) -{ - VHostUserCan *vhucan = vdev->vhucan; - return vhucan->vhost_dev; -} +/* This funciton might be useful in the future + * + * static struct vhost_dev *vhost_user_can_get_vhost(VirtIODevice *vdev) + * { + * VHostUserCan *vhucan = vdev->vhucan; + * return vhucan->vhost_dev; + * } + * + */ static void print_config_can(uint8_t *config_data) { struct virtio_can_config *config_strct = (struct virtio_can_config *)config_data; + (void)config_strct; DBG("print_config_can:\n"); - /* # of available physical jacks */ DBG("\tuint16_t status: %u\n", config_strct->status); } @@ -312,7 +319,7 @@ static void vhost_user_can_init(VirtIODevice *vdev) VHostUserCan *vhucan = (VHostUserCan *)malloc(sizeof(VHostUserCan)); vdev->vhucan = vhucan; - vdev->nvqs = &vdev->vhdev->nvqs; + vdev->nvqs = (int *)&vdev->vhdev->nvqs; vhucan->parent = vdev; vhucan->virtqs = vdev->vqs; vhucan->vhost_dev = vdev->vhdev; diff --git a/vhost_user_can.h b/vhost_user_can.h index 6e2e5d5..4f37b85 100644 --- a/vhost_user_can.h +++ b/vhost_user_can.h @@ -5,7 +5,7 @@ * https://github.com/OpenSynergy/qemu/tree/virtio-can-spec-rfc-v3 * * Copyright (C) 2021-2023 OpenSynergy GmbH - * Copyright (c) 2023 Virtual Open Systems SAS. + * Copyright (c) 2023-2024 Virtual Open Systems SAS. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -52,6 +52,6 @@ typedef struct VHostUserCan { bool support_can_fd; } VHostUserCan; -void vhost_user_can_realize(void); +void vhost_user_can_realize(int queue_num, int queue_size); #endif /* VHOST_USER_CAN */ diff --git a/vhost_user_console.c b/vhost_user_console.c index 8552b91..2997b8d 100644 --- a/vhost_user_console.c +++ b/vhost_user_console.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023 Virtual Open Systems SAS. + * Copyright (c) 2023-2024 Virtual Open Systems SAS. * * This work is licensed under the terms of the GNU GPL, version 2 or * (at your option) any later version. See the COPYING file in the @@ -47,8 +47,8 @@ static void vhost_user_console_start(VirtIODevice *vdev) { VHostUserConsole *vhuconsole = vdev->vhuconsole; VirtioBus *k = vdev->vbus; + unsigned int i; int ret; - int i; DBG("vhost_user_console_start(...)\n"); @@ -86,9 +86,6 @@ static void vhost_user_console_start(VirtIODevice *vdev) vhost_virtqueue_mask(vhuconsole->vhost_dev, vdev, i, false); } - /* Wait a bit for the vrings to be set in vhost-user-device */ - sleep(1); - return; err_guest_notifiers: @@ -100,6 +97,7 @@ err_host_notifiers: static void vhost_user_console_stop(VirtIODevice *vdev) { DBG("vhost_user_console_stop: not yet implemented\n"); + (void)vdev; } static void vhost_user_console_set_status(VirtIODevice *vdev, uint8_t status) @@ -137,6 +135,8 @@ static void vhost_user_console_handle_output(VirtIODevice *vdev, VirtQueue *vq) * however virtio's cleanup path console call this. */ DBG("vhost_user_console_handle_output: Not yet implemented!\n"); + (void)vdev; + (void)vq; } static int vhost_user_console_config_change(struct vhost_dev *dev) @@ -162,12 +162,14 @@ const VhostDevConfigOps console_config_ops = { static void vhost_user_console_init(VirtIODevice *vdev); -void vhost_user_console_realize() +void vhost_user_console_realize(int queue_num, int queue_size) { VirtIODevice *vdev = global_vdev; int ret; DBG("vhost_user_console_device_realize\n"); + (void)queue_num; + (void)queue_size; /* This needs to be added */ proxy = (VirtIOMMIOProxy *)malloc(sizeof(VirtIOMMIOProxy)); @@ -240,19 +242,26 @@ vhost_dev_init_failed: static void vhost_user_console_device_unrealize(VirtIODevice *vdev) { DBG("vhost_user_blk_device_unrealize not yet implemented\n"); + (void)vdev; } -static struct vhost_dev *vhost_user_console_get_vhost(VirtIODevice *vdev) -{ - VHostUserConsole *vhuconsole = vdev->vhuconsole; - return vhuconsole->vhost_dev; -} +/* + * This function might be useful in the future: + * + * static struct vhost_dev *vhost_user_console_get_vhost(VirtIODevice *vdev) + * { + * VHostUserConsole *vhuconsole = vdev->vhuconsole; + * return vhuconsole->vhost_dev; + * } + * + */ static void print_config_console(uint8_t *config_data) { struct virtio_console_config *config_strct = (struct virtio_console_config *)config_data; + (void)config_strct; DBG("print_config_console:\n"); DBG("\tuint16_t cols: %u\n", config_strct->cols); DBG("\tuint16_t rows: %u\n", config_strct->rows); @@ -283,7 +292,7 @@ static void vhost_user_console_init(VirtIODevice *vdev) VHostUserConsole *vhuconsole = (VHostUserConsole *)malloc(sizeof(VHostUserConsole)); vdev->vhuconsole = vhuconsole; - vdev->nvqs = &vdev->vhdev->nvqs; + vdev->nvqs = (int *)&vdev->vhdev->nvqs; vhuconsole->parent = vdev; vhuconsole->virtqs = vdev->vqs; vhuconsole->vhost_dev = vdev->vhdev; diff --git a/vhost_user_console.h b/vhost_user_console.h index 93646c8..e0e40e0 100644 --- a/vhost_user_console.h +++ b/vhost_user_console.h @@ -1,6 +1,6 @@ /* * - * Copyright (c) 2023 Virtual Open Systems SAS. + * Copyright (c) 2023-2024 Virtual Open Systems SAS. * * This work is licensed under the terms of the GNU GPL, version 2 or * (at your option) any later version. See the COPYING file in the @@ -65,6 +65,6 @@ typedef struct VHostUserConsole { VirtQueue *ctrl_tx_vq; } VHostUserConsole; -void vhost_user_console_realize(void); +void vhost_user_console_realize(int queue_num, int queue_size); #endif /* VHOST_USER_CONSOLE */ diff --git a/vhost_user_gpio.c b/vhost_user_gpio.c index 6049bd5..66417ae 100644 --- a/vhost_user_gpio.c +++ b/vhost_user_gpio.c @@ -3,7 +3,7 @@ * * Copyright (c) 2022 Viresh Kumar <viresh.kumar@linaro.org> * - * Copyright (c) 2023 Virtual Open Systems SAS. + * Copyright (c) 2023-2024 Virtual Open Systems SAS. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -56,6 +56,7 @@ static void vu_gpio_get_config(VirtIODevice *vdev, uint8_t *config) VHostUserGPIO *gpio = dev->vdev->vhugpio; DBG("vu_gpio_get_config()\n"); + (void)vdev; memcpy(config, &gpio->config, sizeof(gpio->config)); } @@ -79,7 +80,8 @@ static int vu_gpio_start(VirtIODevice *vdev) { VirtioBus *k = vdev->vbus; VHostUserGPIO *gpio = vdev->vhugpio; - int ret, i; + unsigned int i; + int ret; DBG("vu_gpio_start()\n"); @@ -135,6 +137,7 @@ out_with_err_host_notifiers: static void vu_gpio_stop(VirtIODevice *vdev) { DBG("vu_gpio_stop() not yet implemented\n"); + (void)vdev; } static void vu_gpio_set_status(VirtIODevice *vdev, uint8_t status) @@ -177,6 +180,8 @@ static void vu_gpio_handle_output(VirtIODevice *vdev, VirtQueue *vq) * however virtio's cleanup path can call this. */ DBG("vu_gpio_handle_output not yet implemented\n"); + (void)vdev; + (void)vq; } static void vu_gpio_guest_notifier_mask(VirtIODevice *vdev, int idx, bool mask) @@ -191,12 +196,13 @@ static void vu_gpio_guest_notifier_mask(VirtIODevice *vdev, int idx, bool mask) static void do_vhost_user_cleanup(VirtIODevice *vdev, VHostUserGPIO *gpio) { DBG("do_vhost_user_cleanup() not yet implemented\n"); + (void)vdev; + (void)gpio; } static int vu_gpio_connect(VirtIODevice *vdev) { VHostUserGPIO *gpio = vdev->vhugpio; - int ret; DBG("vu_gpio_connect()\n"); @@ -259,6 +265,7 @@ static int vu_gpio_realize_connect(VHostUserGPIO *gpio) static void vu_gpio_device_unrealize(VirtIODevice *vdev) { DBG("vu_gpio_device_unrealize() not yet implemented\n"); + (void)vdev; } static void print_config_gpio(uint8_t *config_data) @@ -266,6 +273,7 @@ static void print_config_gpio(uint8_t *config_data) struct virtio_gpio_config *config = (struct virtio_gpio_config *)config_data; + (void)config; DBG("ngpio: %hu\n", config->ngpio); DBG("gpio_names_size: %u\n", config->gpio_names_size); } @@ -298,7 +306,7 @@ void vu_gpio_init(VirtIODevice *vdev) } vdev->vhugpio = vhugpio; - vdev->nvqs = &dev->nvqs; + vdev->nvqs = (int *)&dev->nvqs; vhugpio->parent = vdev; vhugpio->vhost_dev = dev; @@ -310,12 +318,13 @@ out: } /* TODO: Add queue_num, queue_size as parameters */ -void vu_gpio_device_realize() +void vu_gpio_device_realize(int queue_num, int queue_size) { int retries, ret; - int i; DBG("vu_gpio_device_realize()\n"); + (void)queue_num; + (void)queue_size; /* This needs to be added */ proxy = (VirtIOMMIOProxy *)malloc(sizeof(VirtIOMMIOProxy)); @@ -368,9 +377,12 @@ void vu_gpio_device_realize() return; - /* TODO: Fix the following considering also do_vhost_user_cleanup() */ -out_with_cmd_vq: - /* free(global_vdev->vhugpio->command_vq); */ + /* + * TODO: Fix the following considering also do_vhost_user_cleanup() + * + * out_with_cmd_vq: + * free(global_vdev->vhugpio->command_vq); + */ out_with_dev: free(global_vdev->vhugpio); out_with_proxy: diff --git a/vhost_user_gpio.h b/vhost_user_gpio.h index 4477ba7..6d80446 100644 --- a/vhost_user_gpio.h +++ b/vhost_user_gpio.h @@ -1,7 +1,7 @@ /* * Based on virtio-gpio.h of QEMU project * - * Copyright (c) 2023 Virtual Open Systems SAS. + * Copyright (c) 2023-2024 Virtual Open Systems SAS. * * This work is licensed under the terms of the GNU GPL, version 2 or * (at your option) any later version. See the COPYING file in the @@ -32,6 +32,6 @@ struct VHostUserGPIO { bool started_vu; }; -void vu_gpio_device_realize(); +void vu_gpio_device_realize(int queue_num, int queue_size); #endif /* VHOST_USER_GPIO */ diff --git a/vhost_user_input.c b/vhost_user_input.c index 9cb2164..5cb4ca6 100644 --- a/vhost_user_input.c +++ b/vhost_user_input.c @@ -29,6 +29,8 @@ static int vhost_input_config_change(struct vhost_dev *dev) { DBG("vhost-user-input: unhandled backend config change\n"); + (void)dev; + return -1; } @@ -40,8 +42,6 @@ static void vhost_input_change_active(VirtIOInput *vinput) { DBG("vhost_input_change_active(...)\n"); - VhostUserInput *vhuinput = global_vdev->vhuinput; - if (vinput->active) { vhost_user_backend_start(global_vdev); } else { @@ -77,7 +77,7 @@ static void vhost_input_set_config(VirtIODevice *vdev, ret = vhost_dev_set_config(vhi->vhost_dev, config_data, 0, sizeof(virtio_input_config), VHOST_SET_CONFIG_TYPE_MASTER); - if (ret) { + if (ret < 0) { DBG("vhost_input_set_config failed\n"); return; } @@ -96,7 +96,9 @@ static void print_config_input(uint8_t *config_data) { struct virtio_input_config *config_strct = (struct virtio_input_config *)config_data; + DBG("print_config_input: Not yet implemented\n"); + (void)config_strct; } static void vhost_input_class_init(VirtIODevice *vdev) @@ -130,7 +132,7 @@ void vhost_user_input_init(VirtIODevice *vdev) vdev->vinput->input_class = input_class; vdev->vhuinput = vhuinput; - vdev->nvqs = &dev->nvqs; + vdev->nvqs = (int*)&dev->nvqs; vhuinput->vdev = vdev; vhuinput->vhost_dev = dev; vhuinput->vdev_input = vinput; @@ -149,11 +151,13 @@ void vhost_user_input_init(VirtIODevice *vdev) } -void vhost_user_input_realize() +void vhost_user_input_realize(int queue_num, int queue_size) { int nvqs = 2; /* qemu choice: 2 */ DBG("vhost_user_input_realize()\n"); + (void)queue_num; + (void)queue_size; vhost_dev_set_config_notifier(global_vdev->vhuinput->vhost_dev, &config_ops); @@ -181,7 +185,8 @@ void vhost_user_input_realize() void vhost_user_backend_start(VirtIODevice *vdev) { VirtioBus *k = vdev->vbus; - int ret, i; + unsigned int i; + int ret; DBG("vhost_user_backend_start(...)\n"); @@ -232,4 +237,5 @@ void vhost_user_backend_start(VirtIODevice *vdev) void vhost_user_backend_stop(VirtIODevice *vdev) { DBG("vhost_user_backend_stop() not yet implemented\n"); + (void)vdev; } diff --git a/vhost_user_input.h b/vhost_user_input.h index 741006e..23f4ddd 100644 --- a/vhost_user_input.h +++ b/vhost_user_input.h @@ -146,39 +146,12 @@ typedef struct VhostUserInput { */ #define KEY_G 34 -static struct virtio_input_config virtio_keyboard_config[] = { - { - .select = VIRTIO_INPUT_CFG_ID_NAME, - .size = sizeof(VIRTIO_ID_NAME_KEYBOARD), - .u.string = VIRTIO_ID_NAME_KEYBOARD, - },{ - .select = VIRTIO_INPUT_CFG_ID_DEVIDS, - .size = sizeof(struct virtio_input_devids), - .u.ids = { - .bustype = (BUS_VIRTUAL), - .vendor = (0x0627), /* same we use for usb hid devices */ - .product = (0x0001), - .version = (0x0001), - }, - },{ - .select = VIRTIO_INPUT_CFG_EV_BITS, - .subsel = EV_KEY, - .size = 1, - .u.bitmap = { - KEY_G, - }, - }, - {}, /* End of list */ -}; - void vhost_user_backend_start(VirtIODevice *vdev); void vhost_user_backend_stop(VirtIODevice *vdev); - void virtio_input_init_config(VirtIOInput *vinput, virtio_input_config *config); void virtio_input_class_init(VirtIODevice *vdev); -void virtio_input_device_realize(); - +void virtio_input_device_realize(int queue_num, int queue_size); void vhost_user_input_init(VirtIODevice *vdev); void vhost_user_input_realize(); diff --git a/vhost_user_loopback.c b/vhost_user_loopback.c index 31830ae..1d52f05 100644 --- a/vhost_user_loopback.c +++ b/vhost_user_loopback.c @@ -84,7 +84,7 @@ void vmsg_close_fds(VhostUserMsg *vmsg) } -bool vu_message_write(int conn_fd, VhostUserMsg *vmsg) +static int vu_message_write(int conn_fd, VhostUserMsg *vmsg) { int rc; uint8_t *p = (uint8_t *)vmsg; @@ -134,16 +134,10 @@ bool vu_message_write(int conn_fd, VhostUserMsg *vmsg) } while (rc < 0 && (errno == EINTR || errno == EAGAIN)); } - if (rc <= 0) { - DBG("Error while writing\n"); - return false; - } - - return true; + return rc; } - -bool vu_message_read(int conn_fd, VhostUserMsg *vmsg) +static int vu_message_read(int conn_fd, VhostUserMsg *vmsg) { char control[CMSG_SPACE(VHOST_MEMORY_BASELINE_NREGIONS * sizeof(int))] = {}; struct iovec iov = { @@ -201,12 +195,9 @@ bool vu_message_read(int conn_fd, VhostUserMsg *vmsg) } } - return true; - fail: vmsg_close_fds(vmsg); - - return false; + return rc; } int vhost_user_set_owner(void) @@ -314,13 +305,14 @@ int enforce_reply(const VhostUserMsg *msg) int vhost_user_set_u64(int request, uint64_t u64, bool wait_for_reply) { + int ret = 0; + VhostUserMsg msg = { .request = request, .flags = VHOST_USER_VERSION, .payload.u64 = u64, .size = sizeof(msg.payload.u64), }; - int ret; print_vhost_user_messages(request); DBG("\tSet value: 0x%lx\n", u64); @@ -343,7 +335,7 @@ int vhost_user_set_u64(int request, uint64_t u64, bool wait_for_reply) return enforce_reply(&msg); } - return 0; + return ret; } int vhost_user_set_features(struct vhost_dev *dev, @@ -420,8 +412,7 @@ int vhost_setup_slave_channel(struct vhost_dev *dev) } ret = vu_message_write(client_sock, &msg); - if (!ret) { - DBG("Go out\n"); + if (ret < 0) { goto out; } @@ -450,9 +441,48 @@ int vhost_user_get_vq_index(struct vhost_dev *dev, int idx) * * assert(idx >= dev->vq_index && idx < dev->vq_index + (int)dev->nvqs); */ + (void)dev; return idx; } +static int vhost_user_write_sync(VhostUserMsg *msg, + bool wait_for_reply) +{ + int ret; + + if (wait_for_reply) { + bool reply_supported = virtio_has_feature(dev->protocol_features, + VHOST_USER_PROTOCOL_F_REPLY_ACK); + if (reply_supported) { + msg->flags |= VHOST_USER_NEED_REPLY_MASK; + } + } + + ret = vu_message_write(client_sock, msg); + if (ret < 0) { + return ret; + } + + if (wait_for_reply) { + uint64_t dummy; + DBG("Wait for reply\n"); + + if (msg->flags & VHOST_USER_NEED_REPLY_MASK) { + return process_message_reply(msg); + } + + /* + * We need to wait for a reply but the backend does not + * support replies for the command we just sent. + * Send VHOST_USER_GET_FEATURES which makes all backends + * send a reply. + */ + return vhost_user_get_features(&dummy); + } + + return 0; +} + int vhost_set_vring_file(VhostUserRequest request, struct vhost_vring_file *file) { @@ -465,6 +495,7 @@ int vhost_set_vring_file(VhostUserRequest request, .size = sizeof(msg.payload.u64), }; + if (ioeventfd_enabled() && file->fd > 0) { fds[fd_num++] = file->fd; } else { @@ -483,7 +514,7 @@ int vhost_set_vring_file(VhostUserRequest request, msg.fd_num = fd_num; memcpy(msg.fds, &fds, fd_num * sizeof(int)); - return !vu_message_write(client_sock, &msg); + return vu_message_write(client_sock, &msg); } int vhost_user_set_vring_kick(struct vhost_vring_file *file) @@ -500,7 +531,8 @@ int vhost_user_set_vring_call(struct vhost_vring_file *file) static int vhost_set_vring(struct vhost_dev *dev, unsigned long int request, - struct vhost_vring_state *ring) + struct vhost_vring_state *ring, + bool wait_for_reply) { VhostUserMsg msg = { .request = request, @@ -508,58 +540,36 @@ static int vhost_set_vring(struct vhost_dev *dev, .payload.state = *ring, .size = sizeof(msg.payload.state), }; + (void)dev; - return !vu_message_write(client_sock, &msg); + return vhost_user_write_sync(&msg, wait_for_reply); } int vhost_user_set_vring_num(struct vhost_dev *dev, struct vhost_vring_state *ring) { - return vhost_set_vring(dev, VHOST_USER_SET_VRING_NUM, ring); + return vhost_set_vring(dev, VHOST_USER_SET_VRING_NUM, ring, false); } int vhost_user_set_vring_base(struct vhost_dev *dev, struct vhost_vring_state *ring) { - return vhost_set_vring(dev, VHOST_USER_SET_VRING_BASE, ring); + return vhost_set_vring(dev, VHOST_USER_SET_VRING_BASE, ring, false); } int vhost_user_set_vring_addr(struct vhost_dev *dev, struct vhost_vring_addr *addr) { - int ret; VhostUserMsg msg = { .request = VHOST_USER_SET_VRING_ADDR, .flags = VHOST_USER_VERSION, .payload.addr = *addr, .size = sizeof(msg.payload.addr), }; + (void)dev; - bool reply_supported = virtio_has_feature(dev->protocol_features, - VHOST_USER_PROTOCOL_F_REPLY_ACK); - - /* - * wait for a reply if logging is enabled to make sure - * backend is actually logging changes - */ - bool wait_for_reply = addr->flags & (1 << VHOST_VRING_F_LOG); - - if (reply_supported && wait_for_reply) { - msg.flags |= VHOST_USER_NEED_REPLY_MASK; - } - - ret = vu_message_write(client_sock, &msg); - if (ret < 0) { - DBG("Fail vhost_user_set_vring_addr\n"); - return ret; - } - - if (wait_for_reply) { - return enforce_reply(&msg); - } - - return 0; + return vhost_user_write_sync(&msg, true); } @@ -580,7 +590,7 @@ int vhost_virtqueue_init(struct vhost_dev *dev, file.fd = event_notifier_get_wfd(&vq->masked_notifier); r = vhost_user_set_vring_call(&file); - if (r) { + if (r < 0) { DBG("vhost_set_vring_call failed\n"); return r; } @@ -615,13 +625,13 @@ int vhost_user_get_config(struct vhost_dev *dev, uint8_t *config, DBG("vu_message_write return: %d\n", ret); if (ret < 0) { DBG("vhost_get_config failed\n"); - return -1; + return ret; } ret = vu_message_read(client_sock, &msg); if (ret < 0) { DBG("vhost_get_config failed\n"); - return -1; + return ret; } if (msg.request != VHOST_USER_GET_CONFIG) { @@ -795,7 +805,7 @@ int vhost_user_set_inflight_fd(struct vhost_dev *dev, msg.fd_num = 1; memcpy(msg.fds, &inflight->fd, msg.fd_num * sizeof(int)); - return !vu_message_write(client_sock, &msg); /* Returns true or false*/ + return vu_message_write(client_sock, &msg); } @@ -807,7 +817,10 @@ static MemoryRegion *vhost_user_get_mr_data(struct vhost_memory_region *reg, { MemoryRegion *mr; + (void)reg; + mr = (MemoryRegion *)malloc(sizeof(MemoryRegion)); *offset = 0; + /* TODO: Dublicate the file descriptor to driscriminate the mmap calls from the driver */ *fd = loopback_fd; return mr; @@ -830,7 +843,8 @@ static int vhost_user_fill_set_mem_table_msg(struct vhost_user *u, int *fds, size_t *fd_num, bool track_ramblocks) { - int i, fd; + uint32_t i; + int fd; ram_addr_t offset; MemoryRegion *mr; struct vhost_memory_region *reg; @@ -894,18 +908,22 @@ static void scrub_shadow_regions(struct vhost_dev *dev, struct vhost_user *u = adev->vudev; bool found[VHOST_USER_MAX_RAM_SLOTS] = {}; struct vhost_memory_region *reg, *shadow_reg; - int i, j, fd, add_idx = 0, rm_idx = 0, fd_num = 0; + int fd, add_idx = 0, rm_idx = 0, fd_num = 0; + uint32_t i, j; ram_addr_t offset; MemoryRegion *mr; bool matching; + (void)mr; + (void)shadow_pcb; + (void)track_ramblocks; /* * Find memory regions present in our shadow state which are not in * the device's current memory state. * * Mark regions in both the shadow and device state as "found". */ - for (i = 0; i < u->num_shadow_regions; i++) { + for (i = 0; i < (uint32_t)u->num_shadow_regions; i++) { shadow_reg = &u->shadow_regions[i]; matching = false; @@ -972,12 +990,14 @@ static int send_remove_regions(struct vhost_dev *dev, int nr_rem_reg, VhostUserMsg *msg, bool reply_supported) { - struct vhost_user *u = adev->vudev; struct vhost_memory_region *shadow_reg; - int i, fd, shadow_reg_idx, ret; + int i, fd, shadow_reg_idx, ret = 0; ram_addr_t offset; VhostUserMemoryRegion region_buffer; + (void)ret; + (void)dev; + (void)shadow_reg_idx; /* * The regions in remove_reg appear in the same order they do in the * shadow table. Therefore we can minimize memory copies by iterating @@ -999,8 +1019,9 @@ static int send_remove_regions(struct vhost_dev *dev, msg->fd_num = 1; memcpy(msg->fds, &loopback_fd, sizeof(int)); - if (vu_message_write(client_sock, msg) < 0) { - return -1; + ret = vu_message_write(client_sock, msg); + if (ret < 0) { + return ret; } if (reply_supported) { @@ -1018,7 +1039,7 @@ static int send_remove_regions(struct vhost_dev *dev, } - return 0; + return ret; } static int send_add_regions(struct vhost_dev *dev, @@ -1027,13 +1048,18 @@ static int send_add_regions(struct vhost_dev *dev, bool reply_supported, bool track_ramblocks) { struct vhost_user *u = adev->vudev; - int i, fd, ret, reg_idx, reg_fd_idx; + int i, fd, ret = 0, reg_idx, reg_fd_idx; struct vhost_memory_region *reg; MemoryRegion *mr; ram_addr_t offset; - VhostUserMsg msg_reply; VhostUserMemoryRegion region_buffer; + (void)dev; + (void)shadow_pcb; + (void)mr; + (void)ret; + (void)reg_fd_idx; + for (i = 0; i < nr_add_reg; i++) { reg = add_reg[i].region; reg_idx = add_reg[i].reg_idx; @@ -1052,9 +1078,10 @@ static int send_add_regions(struct vhost_dev *dev, msg->fd_num = 1; memcpy(msg->fds, &loopback_fd, sizeof(int)); - if (vu_message_write(client_sock, msg) < 0) { + ret = vu_message_write(client_sock, msg); + if (ret < 0) { DBG("send_add_regions -> write failed\n"); - return -1; + return ret; } if (reply_supported) { @@ -1074,7 +1101,7 @@ static int send_add_regions(struct vhost_dev *dev, } } - return 0; + return ret; } static int vhost_user_add_remove_regions(struct vhost_dev *dev, @@ -1127,6 +1154,9 @@ static int vhost_user_set_mem_table_postcopy(struct vhost_dev *dev, bool reply_supported, bool config_mem_slots) { + (void)dev; + (void)reply_supported; + (void)config_mem_slots; DBG("vhost_user_set_mem_table_postcopy(...) not yet implemented\n"); return 0; } @@ -1140,12 +1170,12 @@ int vhost_user_set_mem_table(struct vhost_dev *dev) { int fds[VHOST_MEMORY_BASELINE_NREGIONS]; size_t fd_num = 0; + int ret = 0; bool reply_supported = virtio_has_feature(dev->protocol_features, VHOST_USER_PROTOCOL_F_REPLY_ACK); bool config_mem_slots = virtio_has_feature(dev->protocol_features, VHOST_USER_PROTOCOL_F_CONFIGURE_MEM_SLOTS); - int ret; struct vhost_user *u = adev->vudev; bool do_postcopy = false; @@ -1185,17 +1215,18 @@ int vhost_user_set_mem_table(struct vhost_dev *dev) msg.fd_num = fd_num; memcpy(msg.fds, fds, fd_num * sizeof(int)); - if (vu_message_write(client_sock, &msg) < 0) { + ret = vu_message_write(client_sock, &msg); + if (ret < 0) { DBG("vhost_user_set_mem_table failed write msg\n"); - return -1; + return ret; } if (reply_supported) { - return process_message_reply(&msg); + ret = process_message_reply(&msg); } } - return 0; + return ret; } @@ -1205,6 +1236,7 @@ void print_mem_table(struct vhost_dev *dev) struct vhost_memory_region *cur_vmr; int i; + (void)cur_vmr; DBG("print_mem_table:\n"); for (i = 0; i < dev->n_mem_sections; i++) { @@ -1286,24 +1318,25 @@ int last_avail = -1; void find_add_new_reg(struct vhost_dev *dev) { int sglist_elem_num; - int i; + uint64_t i, j; + (void)sglist_elem_num; DBG("Total nvqs: %d\n", dev->nvqs); - for (int i = 0; i < dev->nvqs; i++) { + for (i = 0; (unsigned int)i < dev->nvqs; i++) { VRing *vring = &dev->vdev->vq[i].vring; uint64_t vring_num = vring->num; - DBG("For vq[%d]:\n", i); - DBG("vqs[%u] hpa 0x%lx\n", i, vring_phys_addrs[i]); - DBG("vq[%d].vring.num: %ld\n", i, vring_num); + DBG("For vq[%lu]:\n", i); + DBG("vqs[%lu] hpa 0x%lx\n", i, vring_phys_addrs[i]); + DBG("vq[%lu].vring.num: %ld\n", i, vring_num); DBG("We got avail buf: %d\n", ((VRingAvail *)(dev->vdev->vq[i].vring.avail))->idx); int avail_diff = ((VRingAvail *)(dev->vdev->vq[i].vring.avail))->idx - last_avail; - for (int j = 0; j < vring_num; j++) { + for (j = 0; j < vring_num; j++) { uint64_t desc_addr = dev->vdev->vq[i].vring.desc; VRingDesc desc_p = ((VRingDesc *)desc_addr)[j]; @@ -1318,10 +1351,10 @@ void find_add_new_reg(struct vhost_dev *dev) break; } - DBG("desc[%u] 0x%lx\n", j, desc_addr); - DBG("desc[%u].addr 0x%lx\n", j, sg_addr); - DBG("desc[%u].len 0x%lu\n", j, sg_len); - DBG("desc[%u].flags 0x%u\n", j, desc_p.flags); + DBG("desc[%lu] 0x%lx\n", j, desc_addr); + DBG("desc[%lu].addr 0x%lx\n", j, sg_addr); + DBG("desc[%lu].len 0x%lu\n", j, sg_len); + DBG("desc[%lu].flags 0x%u\n", j, desc_p.flags); if (!find_reg(dev, sg_addr, sg_len)) { vhost_add_reg(dev, sg_addr, sg_len); @@ -1338,14 +1371,8 @@ void find_add_new_reg(struct vhost_dev *dev) void vhost_commit_init_vqs(struct vhost_dev *dev) { - MemoryRegionSection *old_sections; - int n_old_sections; - uint64_t log_size; size_t regions_size; - int r; - int i; - bool changed = false; - int sglist_elem_num; + unsigned int i; dev->n_mem_sections = dev->nvqs; @@ -1462,7 +1489,7 @@ int vhost_user_backend_init(struct vhost_dev *vhdev) vhdev->max_queues = 1; } - if (vhdev->num_queues && vhdev->max_queues < vhdev->num_queues) { + if (vhdev->num_queues && vhdev->max_queues < (uint64_t)vhdev->num_queues) { DBG("The maximum number of queues supported by the " "backend is %ld\n", vhdev->max_queues); return -EINVAL; @@ -1592,7 +1619,8 @@ void vhost_dev_init(struct vhost_dev *vhdev) int vhost_user_set_vring_enable(struct vhost_dev *dev, int enable) { - int i; + unsigned int i; + int ret; DBG("vhost_user_set_vring_enable:\n"); if (!virtio_has_feature(dev->features, VHOST_USER_F_PROTOCOL_FEATURES)) { @@ -1601,13 +1629,12 @@ int vhost_user_set_vring_enable(struct vhost_dev *dev, int enable) } for (i = 0; i < dev->nvqs; ++i) { - int ret; struct vhost_vring_state state = { .index = dev->vq_index + i, .num = enable, }; - ret = vhost_set_vring(dev, VHOST_USER_SET_VRING_ENABLE, &state); + ret = vhost_set_vring(dev, VHOST_USER_SET_VRING_ENABLE, &state, true); if (ret < 0) { /* * Restoring the previous state is likely infeasible, as well as @@ -1623,6 +1650,7 @@ int vhost_user_set_vring_enable(struct vhost_dev *dev, int enable) static int vhost_user_set_status(struct vhost_dev *dev, uint8_t status) { + (void)dev; return vhost_user_set_u64(VHOST_USER_SET_STATUS, status, false); } @@ -1631,6 +1659,7 @@ static int vhost_user_get_status(struct vhost_dev *dev, uint8_t *status) uint64_t value; int ret; + (void)dev; ret = vhost_user_get_u64(VHOST_USER_GET_STATUS, &value); if (ret < 0) { return ret; @@ -1668,7 +1697,7 @@ int vhost_user_dev_start(struct vhost_dev *dev, bool started) } /* Set device status only for last queue pair */ - if (dev->vq_index + dev->nvqs != dev->vq_index_end) { + if (dev->vq_index + dev->nvqs != (unsigned int)dev->vq_index_end) { return 0; } diff --git a/vhost_user_loopback.h b/vhost_user_loopback.h index 8aa7e05..4a868c6 100644 --- a/vhost_user_loopback.h +++ b/vhost_user_loopback.h @@ -120,7 +120,7 @@ struct vhost_dev { }; -#define VHOST_USER_MAX_RAM_SLOTS 8 +#define VHOST_USER_MAX_RAM_SLOTS 16 typedef uint64_t ram_addr_t; typedef struct RAMBlock RAMBlock; @@ -912,8 +912,6 @@ bool vu_queue_avail_bytes(VuDev *dev, VuVirtq *vq, unsigned int in_bytes, bool vhost_user_one_time_request(VhostUserRequest request); void vmsg_close_fds(VhostUserMsg *vmsg); -bool vu_message_write(int conn_fd, VhostUserMsg *vmsg); -bool vu_message_read(int conn_fd, VhostUserMsg *vmsg); int vhost_user_set_owner(void); int process_message_reply(const VhostUserMsg *msg); int vhost_user_get_u64(int request, uint64_t *u64); diff --git a/vhost_user_rng.c b/vhost_user_rng.c index c727636..96eb13e 100644 --- a/vhost_user_rng.c +++ b/vhost_user_rng.c @@ -77,25 +77,27 @@ static void vu_rng_start(VirtIODevice *vdev) * everything here. virtio-pci will do the right thing by * enabling/disabling irqfd. */ - for (i = 0; i < rng->vhost_dev->nvqs; i++) { + for (i = 0; i < (int)rng->vhost_dev->nvqs; i++) { vhost_virtqueue_mask(rng->vhost_dev, vdev, i, false); } - - /* Wait a bit for the vrings to be set in vhost-user-device */ - sleep(1); - -} - -/* TODO: We need to implement this function in a future release */ -static void vu_rng_stop(VirtIODevice *vdev) -{ - VHostUserRNG *rng = vdev->vhrng; } +/* To be used in future release + * + * static void vu_rng_stop(VirtIODevice *vdev) + * { + * DBG("vu_rng_stop is not yet implemented\n"); + * (void)vdev; + * } + * + */ static uint64_t vu_rng_get_features(VirtIODevice *vdev, uint64_t requested_features) { + DBG("vu_rng_get_features is not yet implemented\n"); + (void)vdev; + /* No feature bits used yet */ return requested_features; } @@ -105,7 +107,13 @@ static void vu_rng_guest_notifier_mask(VirtIODevice *vdev, int idx, bool mask) { VHostUserRNG *rng = vdev->vhrng; - /* vhost_virtqueue_mask(&rng->vhost_dev, vdev, idx, mask); */ + DBG("vu_rng_guest_notifier_mask is not yet implemented\n"); + (void)vdev; + (void)idx; + (void)mask; + (void)rng; + + /* ADD: vhost_virtqueue_mask(&rng->vhost_dev, vdev, idx, mask); */ } /* TODO: We need to implement this function in a future release */ @@ -113,7 +121,12 @@ static bool vu_rng_guest_notifier_pending(VirtIODevice *vdev, int idx) { VHostUserRNG *rng = vdev->vhrng; - /* return vhost_virtqueue_pending(&rng->vhost_dev, idx); */ + DBG("vu_rng_guest_notifier_pending is not yet implemented\n"); + (void)vdev; + (void)idx; + (void)rng; + + /* ADD: return vhost_virtqueue_pending(&rng->vhost_dev, idx); */ return 1; } @@ -151,7 +164,7 @@ void vhost_user_rng_init(VirtIODevice *vdev) { VHostUserRNG *vhrng = (VHostUserRNG *)malloc(sizeof(VHostUserRNG)); vdev->vhrng = vhrng; - vdev->nvqs = &dev->nvqs; + vdev->nvqs = (int *)&dev->nvqs; vhrng->parent = vdev; vhrng->req_vq = vdev->vq; vhrng->vhost_dev = dev; @@ -162,6 +175,8 @@ void vhost_user_rng_init(VirtIODevice *vdev) static void vu_rng_handle_output(VirtIODevice *vdev, VirtQueue *vq) { + (void)vdev; + (void)vq; /* * Not normally called; it's the daemon that handles the queue; * however virtio's cleanup path can call this. @@ -170,8 +185,11 @@ static void vu_rng_handle_output(VirtIODevice *vdev, VirtQueue *vq) } -void vhost_user_rng_realize(void) +void vhost_user_rng_realize(int queue_num, int queue_size) { + (void)queue_num; + (void)queue_size; + /* Initiliaze virtio_dev data structures */ virtio_dev_init(global_vdev, "virtio-rng", 4, 0); diff --git a/vhost_user_rng.h b/vhost_user_rng.h index 69b5916..4627c50 100644 --- a/vhost_user_rng.h +++ b/vhost_user_rng.h @@ -39,6 +39,6 @@ typedef struct VHostUserRNG { bool connected; } VHostUserRNG; -void vhost_user_rng_realize(void); +void vhost_user_rng_realize(int queue_num, int queue_size); #endif /* VHOST_USER_RNG */ diff --git a/vhost_user_sound.c b/vhost_user_sound.c index c444feb..42b424b 100644 --- a/vhost_user_sound.c +++ b/vhost_user_sound.c @@ -3,7 +3,7 @@ * * Copyright 2020 Red Hat, Inc. * - * Copyright (c) 2023 Virtual Open Systems SAS. + * Copyright (c) 2023-2024 Virtual Open Systems SAS. * * This work is licensed under the terms of the GNU GPL, version 2 or * (at your option) any later version. See the COPYING file in the @@ -62,7 +62,7 @@ static void vus_start(VirtIODevice *vdev) VHostUserSound *vhusnd = vdev->vhusnd; VirtioBus *k = vdev->vbus; int ret; - int i; + unsigned int i; DBG("vus_start(...)\n"); @@ -91,9 +91,6 @@ static void vus_start(VirtIODevice *vdev) goto err_guest_notifiers; } - /* Wait a bit before the vrings be set in vhost-user-device */ - sleep(1); - /* * guest_notifier_mask/pending not used yet, so just unmask * everything here. virtio-pci will do the right thing by @@ -103,9 +100,6 @@ static void vus_start(VirtIODevice *vdev) vhost_virtqueue_mask(vhusnd->vhost_dev, vdev, i, false); } - /* Wait a bit for the vrings to be set in vhost-user-device */ - sleep(1); - return; err_guest_notifiers: @@ -117,6 +111,7 @@ err_host_notifiers: static void vus_stop(VirtIODevice *vdev) { DBG("vus_stop: not yet implemented\n"); + (void)vdev; } static void vus_set_status(VirtIODevice *vdev, uint8_t status) @@ -152,6 +147,8 @@ static void vus_snd_handle_output(VirtIODevice *vdev, VirtQueue *vq) * Not normally called; it's the daemon that handles the queue; * however virtio's cleanup path can call this. */ + (void)vdev; + (void)vq; } /* @@ -189,12 +186,14 @@ const VhostDevConfigOps snd_config_ops = { static void vhost_user_snd_init(VirtIODevice *vdev); -void vus_device_realize() +void vus_device_realize(int queue_num, int queue_size) { VirtIODevice *vdev = global_vdev; int ret; DBG("vus_device_realize\n"); + (void)queue_num; + (void)queue_size; /* This needs to be added */ proxy = (VirtIOMMIOProxy *)malloc(sizeof(VirtIOMMIOProxy)); @@ -261,21 +260,28 @@ vhost_dev_init_failed: static void vus_device_unrealize(VirtIODevice *vdev) { DBG("vhost_user_blk_device_unrealize not yet implemented\n"); + (void)vdev; } -static struct vhost_dev *vus_get_vhost(VirtIODevice *vdev) -{ - VHostUserSound *vhusnd = vdev->vhusnd; - return vhusnd->vhost_dev; -} +/* + * This will be might be useful in the future + * + * static struct vhost_dev *vus_get_vhost(VirtIODevice *vdev) + * { + * VHostUserSound *vhusnd = vdev->vhusnd; + * return vhusnd->vhost_dev; + * } + * + */ static void print_config_snd(uint8_t *config_data) { struct virtio_snd_config *config_strct = (struct virtio_snd_config *)config_data; - DBG("print_config_snd:\n"); + (void)config_strct; + DBG("print_config_snd:\n"); /* # of available physical jacks */ DBG("\tuint32_t jacks: %u\n", config_strct->jacks); /* # of available PCM streams */ @@ -306,7 +312,7 @@ static void vhost_user_snd_init(VirtIODevice *vdev) VHostUserSound *vhusnd = (VHostUserSound *)malloc(sizeof(VHostUserSound)); vdev->vhusnd = vhusnd; - vdev->nvqs = &vdev->vhdev->nvqs; + vdev->nvqs = (int *)&vdev->vhdev->nvqs; vhusnd->parent = vdev; vhusnd->virtqs = vdev->vqs; vhusnd->vhost_dev = vdev->vhdev; diff --git a/vhost_user_sound.h b/vhost_user_sound.h index c2dc73f..a31c082 100644 --- a/vhost_user_sound.h +++ b/vhost_user_sound.h @@ -3,7 +3,7 @@ * * Copyright 2020 Red Hat, Inc. * - * Copyright (c) 2023 Virtual Open Systems SAS. + * Copyright (c) 2023-2024 Virtual Open Systems SAS. * * This work is licensed under the terms of the GNU GPL, version 2 or * (at your option) any later version. See the COPYING file in the @@ -35,6 +35,6 @@ typedef struct VHostUserSound { /*< public >*/ } VHostUserSound; -void vus_device_realize(void); +void vus_device_realize(int queue_num, int queue_size); #endif /* VHOST_USER_BLK */ diff --git a/virtio_input.c b/virtio_input.c index c0993ea..668abe6 100644 --- a/virtio_input.c +++ b/virtio_input.c @@ -29,15 +29,47 @@ /* ----------------------------------------------------------------- */ +/* + * Example struct for keyboard + */ +static struct virtio_input_config virtio_keyboard_config[] = { + { + .select = VIRTIO_INPUT_CFG_ID_NAME, + .size = sizeof(VIRTIO_ID_NAME_KEYBOARD), + .u.string = VIRTIO_ID_NAME_KEYBOARD, + },{ + .select = VIRTIO_INPUT_CFG_ID_DEVIDS, + .size = sizeof(struct virtio_input_devids), + .u.ids = { + .bustype = (BUS_VIRTUAL), + .vendor = (0x0627), /* same we use for usb hid devices */ + .product = (0x0001), + .version = (0x0001), + }, + },{ + .select = VIRTIO_INPUT_CFG_EV_BITS, + .subsel = EV_KEY, + .size = 1, + .u.bitmap = { + KEY_G, + }, + }, + {}, /* End of list */ +}; + + void virtio_input_send(VirtIOInput *vinput, virtio_input_event *event) { DBG("virtio_input_send() not yet implemeted\n"); + (void)vinput; + (void)event; } static void virtio_input_handle_evt(VirtIODevice *vdev, VirtQueue *vq) { - DBG("virtio_input_handle_evt(...)\n"); - /* nothing */ + DBG("virtio_input_handle_evt(...) not yet implemeted\n"); + (void)vdev; + (void)vq; } static void virtio_input_handle_sts(VirtIODevice *vdev, VirtQueue *vq) @@ -49,6 +81,7 @@ static void virtio_input_handle_sts(VirtIODevice *vdev, VirtQueue *vq) int len; DBG("virtio_input_handle_sts(...)\n"); + (void)vq; for (;;) { elem = virtqueue_pop(vinput->sts, sizeof(VirtQueueElement)); @@ -166,6 +199,9 @@ static void virtio_input_set_config(VirtIODevice *vdev, static uint64_t virtio_input_get_features(VirtIODevice *vdev, uint64_t f) { DBG("virtio_input_get_features(...)\n"); + (void)vdev; + (void)f; + return f; } @@ -202,22 +238,40 @@ static void virtio_input_reset(VirtIODevice *vdev) } } -static int virtio_input_post_load(void *opaque, int version_id) -{ - VirtIOInput *vinput = global_vdev->vinput; - VirtIOInputClass *vic = global_vdev->vinput->input_class; - VirtIODevice *vdev = global_vdev; - - DBG("virtio_input_post_load(...)\n"); - - vinput->active = vdev->status & VIRTIO_CONFIG_S_DRIVER_OK; - if (vic->change_active) { - vic->change_active(vinput); - } - return 0; -} +/* + * Functions which might be used in the future: + * + * static int virtio_input_post_load(void *opaque, int version_id) + * { + * VirtIOInput *vinput = global_vdev->vinput; + * VirtIOInputClass *vic = global_vdev->vinput->input_class; + * VirtIODevice *vdev = global_vdev; + * + * DBG("virtio_input_post_load(...)\n"); + * (void)opaque; + * (void)version_id; + * + * vinput->active = vdev->status & VIRTIO_CONFIG_S_DRIVER_OK; + * if (vic->change_active) { + * vic->change_active(vinput); + * } + * return 0; + * } + * + * static void virtio_input_finalize(VirtIODevice *vdev) + * { + * DBG("virtio_input_finalize not yet implemented"); + * (void)vdev; + * } + * + * static void virtio_input_device_unrealize(VirtIODevice *vdev) + * { + * DBG("virtio_input_device_unrealize not yet implemented"); + * (void)vdev; + * } + */ -void virtio_input_device_realize() +void virtio_input_device_realize(int queue_num, int queue_size) { VirtIODevice *vdev = global_vdev; struct VirtIOInputClass *vic = vdev->vinput->input_class; @@ -225,6 +279,8 @@ void virtio_input_device_realize() VirtIOInputConfig *cfg; DBG("virtio_input_device_realize(...)\n"); + (void)queue_num; + (void)queue_size; /* This needs to be added */ proxy = (VirtIOMMIOProxy *)malloc(sizeof(VirtIOMMIOProxy)); @@ -259,17 +315,6 @@ void virtio_input_device_realize() DBG("global_vdev->guest_features: 0x%lx\n", global_vdev->guest_features); } -static void virtio_input_finalize(VirtIODevice *vdev) -{ - DBG("virtio_input_finalize not yet implemented"); -} - -static void virtio_input_device_unrealize(VirtIODevice *vdev) -{ - DBG("virtio_input_device_unrealize not yet implemented"); -} - - void virtio_input_class_init(VirtIODevice *vdev) { vdev->vdev_class = (VirtioDeviceClass *)malloc(sizeof(VirtioDeviceClass)); diff --git a/virtio_loopback.c b/virtio_loopback.c index 8b57589..5457f20 100644 --- a/virtio_loopback.c +++ b/virtio_loopback.c @@ -118,6 +118,8 @@ bool virtio_device_started(VirtIODevice *vdev, uint8_t status) DBG("virtio_device_started: %d\n", status & VIRTIO_CONFIG_S_DRIVER_OK); DBG("status: %d\n", status); + (void)vdev; + return status & VIRTIO_CONFIG_S_DRIVER_OK; } @@ -535,7 +537,18 @@ static bool virtqueue_map_desc(VirtIODevice *vdev, unsigned int *p_num_sg, unsigned int max_num_sg, bool is_write, uint64_t pa, size_t sz) { - DBG("Not implemented\n"); + (void)vdev; + (void)p_num_sg; + (void)addr; + (void)iov; + (void)max_num_sg; + (void)is_write; + (void)pa; + (void)sz; + + DBG("virtqueue_map_desc: Not implemented\n"); + + return true; } static void *virtqueue_alloc_element(size_t sz, unsigned out_num, @@ -567,7 +580,6 @@ static void *virtqueue_alloc_element(size_t sz, unsigned out_num, void *virtqueue_split_pop(VirtQueue *vq, size_t sz) { unsigned int i, head, max; - int64_t len; VirtIODevice *vdev = vq->vdev; VirtQueueElement *elem = NULL; unsigned out_num, in_num, elem_entries; @@ -684,9 +696,10 @@ bool virtqueue_get_head(VirtQueue *vq, unsigned int idx, uint32_t get_vqs_max_size(VirtIODevice *vdev) { - uint32_t vq_max_size = VIRTQUEUE_MAX_SIZE; uint32_t total_size, temp_size, total_p2 = 1; - int i, log_res = 0; + int log_res = 0; + + (void)vdev; total_size = VIRTQUEUE_MAX_SIZE * sizeof(VRingDesc); total_size += offsetof(VRingAvail, ring) + @@ -737,6 +750,8 @@ int virtqueue_num_heads(VirtQueue *vq, unsigned int idx) int virtqueue_split_read_next_desc(VirtIODevice *vdev, VRingDesc *desc, unsigned int max, unsigned int *next) { + (void)vdev; + /* If this descriptor says it doesn't chain, we're done. */ if (!(desc->flags & VRING_DESC_F_NEXT)) { return VIRTQUEUE_READ_DESC_DONE; @@ -762,7 +777,6 @@ static void virtqueue_split_get_avail_bytes(VirtQueue *vq, VirtIODevice *vdev = vq->vdev; unsigned int max, idx; unsigned int total_bufs, in_total, out_total; - int64_t len = 0; int rc; idx = vq->last_avail_idx; @@ -1012,7 +1026,6 @@ void *loopback_event_select(void *_e) { int retval; fd_set rfds; - int s; EventNotifier *e = (EventNotifier *)_e; int rfd = e->rfd; VirtQueue *vq = container_of(e, VirtQueue, guest_notifier); @@ -1023,15 +1036,13 @@ void *loopback_event_select(void *_e) FD_SET(rfd, &rfds); while (1) { - retval = select(rfd + 1, &rfds, NULL, NULL, NULL); - if (retval == -1) { DBG("select() error. Exiting...\n"); exit(1); } - if (retval > 0) { + if (retval > 0) { if (pthread_mutex_lock(&interrupt_lock) != 0) { printf("[ERROR] Locking failed\n"); exit(1); @@ -1055,6 +1066,7 @@ void event_notifier_set_handler(EventNotifier *e, { int ret; pthread_t thread_id; + (void)handler; if (e->wfd > 0) { ret = pthread_create(&thread_id, NULL, loopback_event_select, @@ -1092,7 +1104,6 @@ EventNotifier *virtio_queue_get_guest_notifier(VirtQueue *vq) int virtio_loopback_set_guest_notifier(VirtIODevice *vdev, int n, bool assign, bool with_irqfd) { - VirtioDeviceClass *vdc = vdev->vdev_class; VirtQueue *vq = virtio_get_queue(vdev, n); EventNotifier *notifier = virtio_queue_get_guest_notifier(vq); @@ -1219,7 +1230,6 @@ static int int_count; void virtio_loopback_update_irq(VirtIODevice *vdev) { int level, irq_num = 44; - pthread_t my_thread_id; if (!vdev) { return; @@ -1480,10 +1490,11 @@ static uint64_t virtio_loopback_read(VirtIODevice *vdev, uint64_t offset, } } else { /* TODO: To be implemented */ + return 0; } case VIRTIO_MMIO_QUEUE_NUM_MAX: - /* TODO: To be implemented */ - return VIRTQUEUE_MAX_SIZE; + DBG("Return queue_size = %d\n", vdev->vq[vdev->queue_sel].vring.num); + return vdev->vq[vdev->queue_sel].vring.num; case VIRTIO_MMIO_QUEUE_PFN: if (!proxy->legacy) { DBG("VIRTIO_MMIO_QUEUE_PFN: read from legacy register (0x%lx) " @@ -1500,6 +1511,8 @@ static uint64_t virtio_loopback_read(VirtIODevice *vdev, uint64_t offset, return 0; } /* TODO: To be implemented */ + DBG("VIRTIO_MMIO_QUEUE_READY: Not implemented case\n"); + return 0; case VIRTIO_MMIO_INTERRUPT_STATUS: return vdev->isr; case VIRTIO_MMIO_STATUS: @@ -1946,6 +1959,7 @@ void virtio_dev_init(VirtIODevice *vdev, const char *name, static bool virtio_loopback_ioeventfd_enabled(VirtIODevice *d) { + (void)d; return (proxy->flags & VIRTIO_IOMMIO_FLAG_USE_IOEVENTFD) != 0; } @@ -1954,6 +1968,10 @@ static int virtio_loopback_ioeventfd_assign(VirtIOMMIOProxy *d, EventNotifier *notifier, int n, bool assign) { + (void)d; + (void)notifier; + (void)n; + (void)assign; return 0; } @@ -1983,7 +2001,6 @@ int virtio_loopback_start(void) efd_data_t info; pthread_t thread_id; int ret = -1; - int flags; fd = open("/dev/loopback", O_RDWR); if (fd < 0) { diff --git a/virtio_loopback.h b/virtio_loopback.h index 2ece0f9..c348a19 100644 --- a/virtio_loopback.h +++ b/virtio_loopback.h @@ -16,7 +16,7 @@ * * 3) vhost.h of QEMU project * - * Copyright 2022-2023 Virtual Open Systems SAS. + * Copyright 2022-2024 Virtual Open Systems SAS. * * This work is licensed under the terms of the GNU GPL, version 2. See * the COPYING file in the top-level directory. @@ -148,7 +148,7 @@ #define VIRT_VERSION_LEGACY 1 #define VIRT_VENDOR 0x554D4551 /* 'QEMU' */ -#define VIRTQUEUE_MAX_SIZE 64 +#define VIRTQUEUE_MAX_SIZE 1024 #define VIRTIO_QUEUE_MAX VIRTQUEUE_MAX_SIZE #define VIRTIO_NO_VECTOR 0xffff @@ -536,7 +536,7 @@ typedef struct VirtioDeviceClass { void (*set_config)(VirtIODevice *vdev, const uint8_t *config); void (*reset)(VirtIODevice *vdev); void (*set_status)(VirtIODevice *vdev, uint8_t val); - void (*realize)(void); + void (*realize)(int queue_num, int queue_size); void (*unrealize)(VirtIODevice *vdev); /* * For transitional devices, this is a bitmap of features diff --git a/virtio_rng.c b/virtio_rng.c index 6a5b24b..f230b23 100644 --- a/virtio_rng.c +++ b/virtio_rng.c @@ -64,8 +64,7 @@ void chr_read(VirtIORNG *vrng, const void *buf, size_t size) { VirtIODevice *vdev = vrng->parent_obj; VirtQueueElement *elem; - size_t len; - int offset; + size_t len, offset; if (!is_guest_ready(vrng)) { return; @@ -136,6 +135,7 @@ void virtio_rng_process(VirtIORNG *vrng) void handle_input(VirtIODevice *vdev, VirtQueue *vq) { + (void)vq; virtio_rng_process(vdev->vrng); } @@ -159,8 +159,11 @@ void virtio_rng_init(VirtIODevice *vdev) } -void virtio_rng_realize(void) +void virtio_rng_realize(int queue_num, int queue_size) { + (void)queue_num; + (void)queue_size; + /* prepare procy and virtio dev*/ proxy = (VirtIOMMIOProxy *)malloc(sizeof(VirtIOMMIOProxy)); diff --git a/virtio_rng.h b/virtio_rng.h index cf35c29..4264b45 100644 --- a/virtio_rng.h +++ b/virtio_rng.h @@ -49,7 +49,7 @@ size_t get_request_size(VirtQueue *vq, unsigned quota); void virtio_rng_set_status(VirtIODevice *vdev, uint8_t status); void virtio_rng_process(VirtIORNG *vrng); void chr_read(VirtIORNG *vrng, const void *buf, size_t size); -void virtio_rng_realize(void); +void virtio_rng_realize(int queue_num, int queue_size); void virtio_rng_init(VirtIODevice *vdev); #endif /* VIRTIO_RNG */ |