mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-01 06:43:53 -06:00
libvhost-user: support many virtqueues
Currently libvhost-user is hardcoded to at most 8 virtqueues. The device backend should decide the number of virtqueues, not libvhost-user. This is important for multiqueue device backends where the guest driver needs an accurate number of virtqueues. This change breaks libvhost-user and libvhost-user-glib API stability. There is no stability guarantee yet, so make this change now and update all in-tree library users. This patch touches up vhost-user-blk, vhost-user-gpu, vhost-user-input, vhost-user-scsi, and vhost-user-bridge. If the device has a fixed number of queues that exact number is used. Otherwise the previous default of 8 virtqueues is used. vu_init() and vug_init() can now fail if malloc() returns NULL. I considered aborting with an error in libvhost-user but it should be safe to instantiate new vhost-user instances at runtime without risk of terminating the process. Therefore callers need to handle the vu_init() failure now. vhost-user-blk and vhost-user-scsi duplicate virtqueue index checks that are already performed by libvhost-user. This code would need to be modified to use max_queues but remove it completely instead since it's redundant. Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com> Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com> Message-Id: <20190626074815.19994-3-stefanha@redhat.com> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
This commit is contained in:
parent
db68f4ff06
commit
6f5fd83788
9 changed files with 105 additions and 51 deletions
|
@ -25,7 +25,6 @@
|
|||
#define VHOST_USER_F_PROTOCOL_FEATURES 30
|
||||
#define VHOST_LOG_PAGE 4096
|
||||
|
||||
#define VHOST_MAX_NR_VIRTQUEUE 8
|
||||
#define VIRTQUEUE_MAX_SIZE 1024
|
||||
|
||||
#define VHOST_MEMORY_MAX_NREGIONS 8
|
||||
|
@ -353,7 +352,7 @@ struct VuDev {
|
|||
int sock;
|
||||
uint32_t nregions;
|
||||
VuDevRegion regions[VHOST_MEMORY_MAX_NREGIONS];
|
||||
VuVirtq vq[VHOST_MAX_NR_VIRTQUEUE];
|
||||
VuVirtq *vq;
|
||||
VuDevInflightInfo inflight_info;
|
||||
int log_call_fd;
|
||||
int slave_fd;
|
||||
|
@ -362,6 +361,7 @@ struct VuDev {
|
|||
uint64_t features;
|
||||
uint64_t protocol_features;
|
||||
bool broken;
|
||||
uint16_t max_queues;
|
||||
|
||||
/* @set_watch: add or update the given fd to the watch set,
|
||||
* call cb when condition is met */
|
||||
|
@ -391,6 +391,7 @@ typedef struct VuVirtqElement {
|
|||
/**
|
||||
* vu_init:
|
||||
* @dev: a VuDev context
|
||||
* @max_queues: maximum number of virtqueues
|
||||
* @socket: the socket connected to vhost-user master
|
||||
* @panic: a panic callback
|
||||
* @set_watch: a set_watch callback
|
||||
|
@ -398,8 +399,11 @@ typedef struct VuVirtqElement {
|
|||
* @iface: a VuDevIface structure with vhost-user device callbacks
|
||||
*
|
||||
* Intializes a VuDev vhost-user context.
|
||||
*
|
||||
* Returns: true on success, false on failure.
|
||||
**/
|
||||
void vu_init(VuDev *dev,
|
||||
bool vu_init(VuDev *dev,
|
||||
uint16_t max_queues,
|
||||
int socket,
|
||||
vu_panic_cb panic,
|
||||
vu_set_watch_cb set_watch,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue