mirror of
https://github.com/izzy2lost/xemu.git
synced 2026-07-06 00:20:22 -07:00
Merge remote-tracking branch 'remotes/kevin/tags/for-upstream' into staging
Block layer patches - vhost-user-blk: Fix error handling during initialisation - Add test cases for the vhost-user-blk export - Fix leaked Transaction objects - qcow2: Expose dirty bit in 'qemu-img info' # gpg: Signature made Tue 18 May 2021 11:57:46 BST # gpg: using RSA key DC3DEB159A9AF95D3D7456FE7F09B272C88F2FD6 # gpg: issuer "kwolf@redhat.com" # gpg: Good signature from "Kevin Wolf <kwolf@redhat.com>" [full] # Primary key fingerprint: DC3D EB15 9A9A F95D 3D74 56FE 7F09 B272 C88F 2FD6 * remotes/kevin/tags/for-upstream: vhost-user-blk: Check that num-queues is supported by backend virtio: Fail if iommu_platform is requested, but unsupported vhost-user-blk: Get more feature flags from vhost device vhost-user-blk: Improve error reporting in realize vhost-user-blk: Don't reconnect during initialisation vhost-user-blk: Make sure to set Error on realize failure vhost-user-blk-test: test discard/write zeroes invalid inputs tests/qtest: add multi-queue test case to vhost-user-blk-test test: new qTest case to test the vhost-user-blk-server block/export: improve vu_blk_sect_range_ok() block: Fix Transaction leak in bdrv_reopen_multiple() block: Fix Transaction leak in bdrv_root_attach_child() qcow2: set bdi->is_dirty Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
@@ -3245,6 +3245,8 @@ F: block/export/vhost-user-blk-server.c
|
||||
F: block/export/vhost-user-blk-server.h
|
||||
F: include/qemu/vhost-user-server.h
|
||||
F: tests/qtest/libqos/vhost-user-blk.c
|
||||
F: tests/qtest/libqos/vhost-user-blk.h
|
||||
F: tests/qtest/vhost-user-blk-test.c
|
||||
F: util/vhost-user-server.c
|
||||
|
||||
FUSE block device exports
|
||||
|
||||
@@ -2916,13 +2916,14 @@ BdrvChild *bdrv_root_attach_child(BlockDriverState *child_bs,
|
||||
child_role, perm, shared_perm, opaque,
|
||||
&child, tran, errp);
|
||||
if (ret < 0) {
|
||||
bdrv_unref(child_bs);
|
||||
return NULL;
|
||||
assert(child == NULL);
|
||||
goto out;
|
||||
}
|
||||
|
||||
ret = bdrv_refresh_perms(child_bs, errp);
|
||||
tran_finalize(tran, ret);
|
||||
|
||||
out:
|
||||
tran_finalize(tran, ret);
|
||||
bdrv_unref(child_bs);
|
||||
return child;
|
||||
}
|
||||
@@ -4049,7 +4050,7 @@ int bdrv_reopen_multiple(BlockReopenQueue *bs_queue, Error **errp)
|
||||
ret = bdrv_flush(bs_entry->state.bs);
|
||||
if (ret < 0) {
|
||||
error_setg_errno(errp, -ret, "Error flushing drive");
|
||||
goto cleanup;
|
||||
goto abort;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -70,9 +70,16 @@ static void vu_blk_req_complete(VuBlkReq *req)
|
||||
static bool vu_blk_sect_range_ok(VuBlkExport *vexp, uint64_t sector,
|
||||
size_t size)
|
||||
{
|
||||
uint64_t nb_sectors = size >> BDRV_SECTOR_BITS;
|
||||
uint64_t nb_sectors;
|
||||
uint64_t total_sectors;
|
||||
|
||||
if (size % VIRTIO_BLK_SECTOR_SIZE) {
|
||||
return false;
|
||||
}
|
||||
|
||||
nb_sectors = size >> VIRTIO_BLK_SECTOR_BITS;
|
||||
|
||||
QEMU_BUILD_BUG_ON(BDRV_SECTOR_SIZE != VIRTIO_BLK_SECTOR_SIZE);
|
||||
if (nb_sectors > BDRV_REQUEST_MAX_SECTORS) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -5089,6 +5089,7 @@ static int qcow2_get_info(BlockDriverState *bs, BlockDriverInfo *bdi)
|
||||
BDRVQcow2State *s = bs->opaque;
|
||||
bdi->cluster_size = s->cluster_size;
|
||||
bdi->vm_state_offset = qcow2_vm_state_offset(s);
|
||||
bdi->is_dirty = s->incompatible_features & QCOW2_INCOMPAT_DIRTY;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
+30
-55
@@ -47,9 +47,13 @@ static const int user_feature_bits[] = {
|
||||
VIRTIO_RING_F_INDIRECT_DESC,
|
||||
VIRTIO_RING_F_EVENT_IDX,
|
||||
VIRTIO_F_NOTIFY_ON_EMPTY,
|
||||
VIRTIO_F_RING_PACKED,
|
||||
VIRTIO_F_IOMMU_PLATFORM,
|
||||
VHOST_INVALID_FEATURE_BIT
|
||||
};
|
||||
|
||||
static void vhost_user_blk_event(void *opaque, QEMUChrEvent event);
|
||||
|
||||
static void vhost_user_blk_update_config(VirtIODevice *vdev, uint8_t *config)
|
||||
{
|
||||
VHostUserBlk *s = VHOST_USER_BLK(vdev);
|
||||
@@ -309,7 +313,7 @@ static void vhost_user_blk_reset(VirtIODevice *vdev)
|
||||
vhost_dev_free_inflight(s->inflight);
|
||||
}
|
||||
|
||||
static int vhost_user_blk_connect(DeviceState *dev)
|
||||
static int vhost_user_blk_connect(DeviceState *dev, Error **errp)
|
||||
{
|
||||
VirtIODevice *vdev = VIRTIO_DEVICE(dev);
|
||||
VHostUserBlk *s = VHOST_USER_BLK(vdev);
|
||||
@@ -320,6 +324,7 @@ static int vhost_user_blk_connect(DeviceState *dev)
|
||||
}
|
||||
s->connected = true;
|
||||
|
||||
s->dev.num_queues = s->num_queues;
|
||||
s->dev.nvqs = s->num_queues;
|
||||
s->dev.vqs = s->vhost_vqs;
|
||||
s->dev.vq_index = 0;
|
||||
@@ -329,8 +334,7 @@ static int vhost_user_blk_connect(DeviceState *dev)
|
||||
|
||||
ret = vhost_dev_init(&s->dev, &s->vhost_user, VHOST_BACKEND_TYPE_USER, 0);
|
||||
if (ret < 0) {
|
||||
error_report("vhost-user-blk: vhost initialization failed: %s",
|
||||
strerror(-ret));
|
||||
error_setg_errno(errp, -ret, "vhost initialization failed");
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -338,8 +342,7 @@ static int vhost_user_blk_connect(DeviceState *dev)
|
||||
if (virtio_device_started(vdev, vdev->status)) {
|
||||
ret = vhost_user_blk_start(vdev);
|
||||
if (ret < 0) {
|
||||
error_report("vhost-user-blk: vhost start failed: %s",
|
||||
strerror(-ret));
|
||||
error_setg_errno(errp, -ret, "vhost start failed");
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
@@ -362,19 +365,6 @@ static void vhost_user_blk_disconnect(DeviceState *dev)
|
||||
vhost_dev_cleanup(&s->dev);
|
||||
}
|
||||
|
||||
static void vhost_user_blk_event(void *opaque, QEMUChrEvent event,
|
||||
bool realized);
|
||||
|
||||
static void vhost_user_blk_event_realize(void *opaque, QEMUChrEvent event)
|
||||
{
|
||||
vhost_user_blk_event(opaque, event, false);
|
||||
}
|
||||
|
||||
static void vhost_user_blk_event_oper(void *opaque, QEMUChrEvent event)
|
||||
{
|
||||
vhost_user_blk_event(opaque, event, true);
|
||||
}
|
||||
|
||||
static void vhost_user_blk_chr_closed_bh(void *opaque)
|
||||
{
|
||||
DeviceState *dev = opaque;
|
||||
@@ -382,36 +372,27 @@ static void vhost_user_blk_chr_closed_bh(void *opaque)
|
||||
VHostUserBlk *s = VHOST_USER_BLK(vdev);
|
||||
|
||||
vhost_user_blk_disconnect(dev);
|
||||
qemu_chr_fe_set_handlers(&s->chardev, NULL, NULL,
|
||||
vhost_user_blk_event_oper, NULL, opaque, NULL, true);
|
||||
qemu_chr_fe_set_handlers(&s->chardev, NULL, NULL, vhost_user_blk_event,
|
||||
NULL, opaque, NULL, true);
|
||||
}
|
||||
|
||||
static void vhost_user_blk_event(void *opaque, QEMUChrEvent event,
|
||||
bool realized)
|
||||
static void vhost_user_blk_event(void *opaque, QEMUChrEvent event)
|
||||
{
|
||||
DeviceState *dev = opaque;
|
||||
VirtIODevice *vdev = VIRTIO_DEVICE(dev);
|
||||
VHostUserBlk *s = VHOST_USER_BLK(vdev);
|
||||
Error *local_err = NULL;
|
||||
|
||||
switch (event) {
|
||||
case CHR_EVENT_OPENED:
|
||||
if (vhost_user_blk_connect(dev) < 0) {
|
||||
if (vhost_user_blk_connect(dev, &local_err) < 0) {
|
||||
error_report_err(local_err);
|
||||
qemu_chr_fe_disconnect(&s->chardev);
|
||||
return;
|
||||
}
|
||||
break;
|
||||
case CHR_EVENT_CLOSED:
|
||||
/*
|
||||
* Closing the connection should happen differently on device
|
||||
* initialization and operation stages.
|
||||
* On initalization, we want to re-start vhost_dev initialization
|
||||
* from the very beginning right away when the connection is closed,
|
||||
* so we clean up vhost_dev on each connection closing.
|
||||
* On operation, we want to postpone vhost_dev cleanup to let the
|
||||
* other code perform its own cleanup sequence using vhost_dev data
|
||||
* (e.g. vhost_dev_set_log).
|
||||
*/
|
||||
if (realized && !runstate_check(RUN_STATE_SHUTDOWN)) {
|
||||
if (!runstate_check(RUN_STATE_SHUTDOWN)) {
|
||||
/*
|
||||
* A close event may happen during a read/write, but vhost
|
||||
* code assumes the vhost_dev remains setup, so delay the
|
||||
@@ -431,8 +412,6 @@ static void vhost_user_blk_event(void *opaque, QEMUChrEvent event,
|
||||
* knowing its type (in this case vhost-user).
|
||||
*/
|
||||
s->dev.started = false;
|
||||
} else {
|
||||
vhost_user_blk_disconnect(dev);
|
||||
}
|
||||
break;
|
||||
case CHR_EVENT_BREAK:
|
||||
@@ -447,11 +426,10 @@ static void vhost_user_blk_device_realize(DeviceState *dev, Error **errp)
|
||||
{
|
||||
VirtIODevice *vdev = VIRTIO_DEVICE(dev);
|
||||
VHostUserBlk *s = VHOST_USER_BLK(vdev);
|
||||
Error *err = NULL;
|
||||
int i, ret;
|
||||
|
||||
if (!s->chardev.chr) {
|
||||
error_setg(errp, "vhost-user-blk: chardev is mandatory");
|
||||
error_setg(errp, "chardev is mandatory");
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -459,16 +437,16 @@ static void vhost_user_blk_device_realize(DeviceState *dev, Error **errp)
|
||||
s->num_queues = 1;
|
||||
}
|
||||
if (!s->num_queues || s->num_queues > VIRTIO_QUEUE_MAX) {
|
||||
error_setg(errp, "vhost-user-blk: invalid number of IO queues");
|
||||
error_setg(errp, "invalid number of IO queues");
|
||||
return;
|
||||
}
|
||||
|
||||
if (!s->queue_size) {
|
||||
error_setg(errp, "vhost-user-blk: queue size must be non-zero");
|
||||
error_setg(errp, "queue size must be non-zero");
|
||||
return;
|
||||
}
|
||||
if (s->queue_size > VIRTQUEUE_MAX_SIZE) {
|
||||
error_setg(errp, "vhost-user-blk: queue size must not exceed %d",
|
||||
error_setg(errp, "queue size must not exceed %d",
|
||||
VIRTQUEUE_MAX_SIZE);
|
||||
return;
|
||||
}
|
||||
@@ -490,34 +468,31 @@ static void vhost_user_blk_device_realize(DeviceState *dev, Error **errp)
|
||||
s->vhost_vqs = g_new0(struct vhost_virtqueue, s->num_queues);
|
||||
s->connected = false;
|
||||
|
||||
qemu_chr_fe_set_handlers(&s->chardev, NULL, NULL,
|
||||
vhost_user_blk_event_realize, NULL, (void *)dev,
|
||||
NULL, true);
|
||||
|
||||
reconnect:
|
||||
if (qemu_chr_fe_wait_connected(&s->chardev, &err) < 0) {
|
||||
error_report_err(err);
|
||||
if (qemu_chr_fe_wait_connected(&s->chardev, errp) < 0) {
|
||||
goto virtio_err;
|
||||
}
|
||||
|
||||
/* check whether vhost_user_blk_connect() failed or not */
|
||||
if (!s->connected) {
|
||||
goto reconnect;
|
||||
if (vhost_user_blk_connect(dev, errp) < 0) {
|
||||
qemu_chr_fe_disconnect(&s->chardev);
|
||||
goto virtio_err;
|
||||
}
|
||||
assert(s->connected);
|
||||
|
||||
ret = vhost_dev_get_config(&s->dev, (uint8_t *)&s->blkcfg,
|
||||
sizeof(struct virtio_blk_config));
|
||||
if (ret < 0) {
|
||||
error_report("vhost-user-blk: get block config failed");
|
||||
goto reconnect;
|
||||
error_setg(errp, "vhost-user-blk: get block config failed");
|
||||
goto vhost_err;
|
||||
}
|
||||
|
||||
/* we're fully initialized, now we can operate, so change the handler */
|
||||
/* we're fully initialized, now we can operate, so add the handler */
|
||||
qemu_chr_fe_set_handlers(&s->chardev, NULL, NULL,
|
||||
vhost_user_blk_event_oper, NULL, (void *)dev,
|
||||
vhost_user_blk_event, NULL, (void *)dev,
|
||||
NULL, true);
|
||||
return;
|
||||
|
||||
vhost_err:
|
||||
vhost_dev_cleanup(&s->dev);
|
||||
virtio_err:
|
||||
g_free(s->vhost_vqs);
|
||||
s->vhost_vqs = NULL;
|
||||
|
||||
@@ -1909,6 +1909,11 @@ static int vhost_user_backend_init(struct vhost_dev *dev, void *opaque)
|
||||
return err;
|
||||
}
|
||||
}
|
||||
if (dev->num_queues && dev->max_queues < dev->num_queues) {
|
||||
error_report("The maximum number of queues supported by the "
|
||||
"backend is %" PRIu64, dev->max_queues);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (virtio_has_feature(features, VIRTIO_F_IOMMU_PLATFORM) &&
|
||||
!(virtio_has_feature(dev->protocol_features,
|
||||
|
||||
@@ -69,6 +69,11 @@ void virtio_bus_device_plugged(VirtIODevice *vdev, Error **errp)
|
||||
return;
|
||||
}
|
||||
|
||||
if (has_iommu && !virtio_host_has_feature(vdev, VIRTIO_F_IOMMU_PLATFORM)) {
|
||||
error_setg(errp, "iommu_platform=true is not supported by the device");
|
||||
return;
|
||||
}
|
||||
|
||||
if (klass->device_plugged != NULL) {
|
||||
klass->device_plugged(qbus->parent, &local_err);
|
||||
}
|
||||
|
||||
@@ -74,6 +74,8 @@ struct vhost_dev {
|
||||
int nvqs;
|
||||
/* the first virtqueue which would be used by this vhost dev */
|
||||
int vq_index;
|
||||
/* if non-zero, minimum required value for max_queues */
|
||||
int num_queues;
|
||||
uint64_t features;
|
||||
uint64_t acked_features;
|
||||
uint64_t backend_features;
|
||||
|
||||
@@ -32,6 +32,7 @@ libqos_srcs = files('../libqtest.c',
|
||||
'virtio-9p.c',
|
||||
'virtio-balloon.c',
|
||||
'virtio-blk.c',
|
||||
'vhost-user-blk.c',
|
||||
'virtio-mmio.c',
|
||||
'virtio-net.c',
|
||||
'virtio-pci.c',
|
||||
|
||||
@@ -0,0 +1,130 @@
|
||||
/*
|
||||
* libqos driver framework
|
||||
*
|
||||
* Based on tests/qtest/libqos/virtio-blk.c
|
||||
*
|
||||
* Copyright (c) 2020 Coiby Xu <coiby.xu@gmail.com>
|
||||
*
|
||||
* Copyright (c) 2018 Emanuele Giuseppe Esposito <e.emanuelegiuseppe@gmail.com>
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License version 2.1 as published by the Free Software Foundation.
|
||||
*
|
||||
* This library 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
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, see <http://www.gnu.org/licenses/>
|
||||
*/
|
||||
|
||||
#include "qemu/osdep.h"
|
||||
#include "libqtest.h"
|
||||
#include "qemu/module.h"
|
||||
#include "standard-headers/linux/virtio_blk.h"
|
||||
#include "vhost-user-blk.h"
|
||||
|
||||
#define PCI_SLOT 0x04
|
||||
#define PCI_FN 0x00
|
||||
|
||||
/* virtio-blk-device */
|
||||
static void *qvhost_user_blk_get_driver(QVhostUserBlk *v_blk,
|
||||
const char *interface)
|
||||
{
|
||||
if (!g_strcmp0(interface, "vhost-user-blk")) {
|
||||
return v_blk;
|
||||
}
|
||||
if (!g_strcmp0(interface, "virtio")) {
|
||||
return v_blk->vdev;
|
||||
}
|
||||
|
||||
fprintf(stderr, "%s not present in vhost-user-blk-device\n", interface);
|
||||
g_assert_not_reached();
|
||||
}
|
||||
|
||||
static void *qvhost_user_blk_device_get_driver(void *object,
|
||||
const char *interface)
|
||||
{
|
||||
QVhostUserBlkDevice *v_blk = object;
|
||||
return qvhost_user_blk_get_driver(&v_blk->blk, interface);
|
||||
}
|
||||
|
||||
static void *vhost_user_blk_device_create(void *virtio_dev,
|
||||
QGuestAllocator *t_alloc,
|
||||
void *addr)
|
||||
{
|
||||
QVhostUserBlkDevice *vhost_user_blk = g_new0(QVhostUserBlkDevice, 1);
|
||||
QVhostUserBlk *interface = &vhost_user_blk->blk;
|
||||
|
||||
interface->vdev = virtio_dev;
|
||||
|
||||
vhost_user_blk->obj.get_driver = qvhost_user_blk_device_get_driver;
|
||||
|
||||
return &vhost_user_blk->obj;
|
||||
}
|
||||
|
||||
/* virtio-blk-pci */
|
||||
static void *qvhost_user_blk_pci_get_driver(void *object, const char *interface)
|
||||
{
|
||||
QVhostUserBlkPCI *v_blk = object;
|
||||
if (!g_strcmp0(interface, "pci-device")) {
|
||||
return v_blk->pci_vdev.pdev;
|
||||
}
|
||||
return qvhost_user_blk_get_driver(&v_blk->blk, interface);
|
||||
}
|
||||
|
||||
static void *vhost_user_blk_pci_create(void *pci_bus, QGuestAllocator *t_alloc,
|
||||
void *addr)
|
||||
{
|
||||
QVhostUserBlkPCI *vhost_user_blk = g_new0(QVhostUserBlkPCI, 1);
|
||||
QVhostUserBlk *interface = &vhost_user_blk->blk;
|
||||
QOSGraphObject *obj = &vhost_user_blk->pci_vdev.obj;
|
||||
|
||||
virtio_pci_init(&vhost_user_blk->pci_vdev, pci_bus, addr);
|
||||
interface->vdev = &vhost_user_blk->pci_vdev.vdev;
|
||||
|
||||
g_assert_cmphex(interface->vdev->device_type, ==, VIRTIO_ID_BLOCK);
|
||||
|
||||
obj->get_driver = qvhost_user_blk_pci_get_driver;
|
||||
|
||||
return obj;
|
||||
}
|
||||
|
||||
static void vhost_user_blk_register_nodes(void)
|
||||
{
|
||||
/*
|
||||
* FIXME: every test using these two nodes needs to setup a
|
||||
* -drive,id=drive0 otherwise QEMU is not going to start.
|
||||
* Therefore, we do not include "produces" edge for virtio
|
||||
* and pci-device yet.
|
||||
*/
|
||||
|
||||
char *arg = g_strdup_printf("id=drv0,chardev=char1,addr=%x.%x",
|
||||
PCI_SLOT, PCI_FN);
|
||||
|
||||
QPCIAddress addr = {
|
||||
.devfn = QPCI_DEVFN(PCI_SLOT, PCI_FN),
|
||||
};
|
||||
|
||||
QOSGraphEdgeOptions opts = { };
|
||||
|
||||
/* virtio-blk-device */
|
||||
/** opts.extra_device_opts = "drive=drive0"; */
|
||||
qos_node_create_driver("vhost-user-blk-device",
|
||||
vhost_user_blk_device_create);
|
||||
qos_node_consumes("vhost-user-blk-device", "virtio-bus", &opts);
|
||||
qos_node_produces("vhost-user-blk-device", "vhost-user-blk");
|
||||
|
||||
/* virtio-blk-pci */
|
||||
opts.extra_device_opts = arg;
|
||||
add_qpci_address(&opts, &addr);
|
||||
qos_node_create_driver("vhost-user-blk-pci", vhost_user_blk_pci_create);
|
||||
qos_node_consumes("vhost-user-blk-pci", "pci-bus", &opts);
|
||||
qos_node_produces("vhost-user-blk-pci", "vhost-user-blk");
|
||||
|
||||
g_free(arg);
|
||||
}
|
||||
|
||||
libqos_init(vhost_user_blk_register_nodes);
|
||||
@@ -0,0 +1,48 @@
|
||||
/*
|
||||
* libqos driver framework
|
||||
*
|
||||
* Based on tests/qtest/libqos/virtio-blk.c
|
||||
*
|
||||
* Copyright (c) 2020 Coiby Xu <coiby.xu@gmail.com>
|
||||
*
|
||||
* Copyright (c) 2018 Emanuele Giuseppe Esposito <e.emanuelegiuseppe@gmail.com>
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License version 2 as published by the Free Software Foundation.
|
||||
*
|
||||
* This library 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
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, see <http://www.gnu.org/licenses/>
|
||||
*/
|
||||
|
||||
#ifndef TESTS_LIBQOS_VHOST_USER_BLK_H
|
||||
#define TESTS_LIBQOS_VHOST_USER_BLK_H
|
||||
|
||||
#include "qgraph.h"
|
||||
#include "virtio.h"
|
||||
#include "virtio-pci.h"
|
||||
|
||||
typedef struct QVhostUserBlk QVhostUserBlk;
|
||||
typedef struct QVhostUserBlkPCI QVhostUserBlkPCI;
|
||||
typedef struct QVhostUserBlkDevice QVhostUserBlkDevice;
|
||||
|
||||
struct QVhostUserBlk {
|
||||
QVirtioDevice *vdev;
|
||||
};
|
||||
|
||||
struct QVhostUserBlkPCI {
|
||||
QVirtioPCIDevice pci_vdev;
|
||||
QVhostUserBlk blk;
|
||||
};
|
||||
|
||||
struct QVhostUserBlkDevice {
|
||||
QOSGraphObject obj;
|
||||
QVhostUserBlk blk;
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -231,6 +231,9 @@ if have_virtfs
|
||||
qos_test_ss.add(files('virtio-9p-test.c'))
|
||||
endif
|
||||
qos_test_ss.add(when: 'CONFIG_VHOST_USER', if_true: files('vhost-user-test.c'))
|
||||
if have_tools and have_vhost_user_blk_server
|
||||
qos_test_ss.add(files('vhost-user-blk-test.c'))
|
||||
endif
|
||||
|
||||
tpmemu_files = ['tpm-emu.c', 'tpm-util.c', 'tpm-tests.c']
|
||||
|
||||
@@ -269,6 +272,7 @@ foreach dir : target_dirs
|
||||
endif
|
||||
qtest_env.set('G_TEST_DBUS_DAEMON', meson.source_root() / 'tests/dbus-vmstate-daemon.sh')
|
||||
qtest_env.set('QTEST_QEMU_BINARY', './qemu-system-' + target_base)
|
||||
qtest_env.set('QTEST_QEMU_STORAGE_DAEMON_BINARY', './storage-daemon/qemu-storage-daemon')
|
||||
|
||||
foreach test : target_qtests
|
||||
# Executables are shared across targets, declare them only the first time we
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user