- hw/arm/fsl-imx: Do not ignore Error argument - hw/net/cadence_gem.c: spelling fixes: Octects - tests/qtest: check the return value - libvhost-user: Fix VHOST_USER_GET_MAX_MEM_SLOTS reply mainline inclusion commit 69a5daec06f423843ce1bb9be5fb049314996f78 category: bugfix - io_uring: fix short read slow path mainline inclusion commit c06fc7ce147e57ab493bad9263f1601b8298484b category: bugfix - libvhost-user: Fix VHOST_USER_ADD_MEM_REG reply mainline inclusion commit 7f27d20ded2f480f3e66d03f90ea71507b834276 category: bugfix - qsd: Unlink absolute PID file path mainline inclusion commit 9d8f8233b9fa525a7e37350fbc18877051128c5d category: bugfix - net: Fix a misleading error message - vdpa: stop all svq on device deletion - vhost: release virtqueue objects in error path - vhost: fix the fd leak - virtio: i2c: Check notifier helpers for VIRTIO_CONFIG_IRQ_IDX - hw/virtio: fix typo in VIRTIO_CONFIG_IRQ_IDX comments - virtio-net: clear guest_announce feature if no cvq backend - vdpa: fix VHOST_BACKEND_F_IOTLB_ASID flag check - vdpa: do not block migration if device has cvq and x-svq=on - vdpa net: block migration if the device has CVQ - vdpa: Return -EIO if device ack is VIRTIO_NET_ERR in _load_mq() - vdpa: Return -EIO if device ack is VIRTIO_NET_ERR in _load_mac() - vdpa: fix not using CVQ buffer in case of error - vdpa: Fix possible use-after-free for VirtQueueElement - hw/virtio: fix vhost_user_read tracepoint - vhost: Fix false positive out-of-bounds - vhost: fix possible wrap in SVQ descriptor ring - vhost: move iova_tree set to vhost_svq_start - vhost: Always store new kick fd on vhost_svq_set_svq_kick_fd - virtio-crypto: verify src&dst buffer length for sym request - vdpa: commit all host notifier MRs in a single MR transaction - vdpa: harden the error path if get_iova_range failed - vdpa-dev: get iova range explicitly - virtio-pci: add support for configure interrupt - virtio-mmio: add support for configure interrupt - virtio-net: add support for configure interrupt - vhost: add support for configure interrupt - virtio: add support for configure interrupt - vhost-vdpa: add support for config interrupt - vhost: introduce new VhostOps vhost_set_config_call - virtio-pci: decouple the single vector from the interrupt process - virtio-pci: decouple notifier from interrupt process - virtio: introduce macro VIRTIO_CONFIG_IRQ_IDX - vdpa: do not handle VIRTIO_NET_F_GUEST_ANNOUNCE in vhost-vdpa - vdpa: handle VIRTIO_NET_CTRL_ANNOUNCE in vhost_vdpa_net_handle_ctrl_avail - vhost: fix vq dirty bitmap syncing when vIOMMU is enabled - hw/virtio: gracefully handle unset vhost_dev vdev - hw/virtio/vhost: Fix typo in comment. - vdpa: always start CVQ in SVQ mode if possible - vdpa: add shadow_data to vhost_vdpa - vdpa: store x-svq parameter in VhostVDPAState - vdpa: add asid parameter to vhost_vdpa_dma_map/unmap - vdpa: allocate SVQ array unconditionally - vdpa: move SVQ vring features check to net/ - vdpa: request iova_range only once - vdpa: add vhost_vdpa_net_valid_svq_features - vhost: allocate SVQ device file descriptors at device start - vhost: set SVQ device call handler at SVQ start - vdpa: use v->shadow_vqs_enabled in vhost_vdpa_svqs_start & stop - vhost: enable vrings in vhost_dev_start() for vhost-user devices - vhost-vdpa: fix assert !virtio_net_get_subqueue(nc)->async_tx.elem in virtio_net_reset - net/vhost-vdpa.c: Fix clang compilation failure - vhost-vdpa: allow passing opened vhostfd to vhost-vdpa - vdpa: Remove shadow CVQ command check - vdpa: Delete duplicated vdpa_feature_bits entry - hw/virtio: add some vhost-user trace events - vdpa: Allow MQ feature in SVQ - virtio-net: Update virtio-net curr_queue_pairs in vdpa backends - vdpa: validate MQ CVQ commands - vdpa: Add vhost_vdpa_net_load_mq - vdpa: extract vhost_vdpa_net_load_mac from vhost_vdpa_net_load - vdpa: Make VhostVDPAState cvq_cmd_in_buffer control ack type - vdpa: Delete CVQ migration blocker - vdpa: Add virtio-net mac address via CVQ at start - vhost_net: add NetClientState->load() callback - vdpa: extract vhost_vdpa_net_cvq_add from vhost_vdpa_net_handle_ctrl_avail - vdpa: Move command buffers map to start of net device - vdpa: add net_vhost_vdpa_cvq_info NetClientInfo - vhost_net: Add NetClientInfo stop callback - vhost_net: Add NetClientInfo start callback - vdpa: Use ring hwaddr at vhost_vdpa_svq_unmap_ring - vdpa: Make SVQ vring unmapping return void - vdpa: Remove SVQ vring from iova_tree at shutdown - util: accept iova_tree_remove_parameter by value - vdpa: do not save failed dma maps in SVQ iova tree - vdpa: Skip the maps not in the iova tree - vdpa: Fix file descriptor leak on get features error - vdpa: Fix memory listener deletions of iova tree - vhost: Get vring base from vq, not svq - vdpa: Add x-svq to NetdevVhostVDPAOptions - vdpa: Add device migration blocker - vdpa: Extract get features part from vhost_vdpa_get_max_queue_pairs - vdpa: Buffer CVQ support on shadow virtqueue - vdpa: manual forward CVQ buffers - vdpa: Export vhost_vdpa_dma_map and unmap calls - vhost: Add svq avail_handler callback - vhost: add vhost_svq_poll - vhost: Expose vhost_svq_add - vhost: add vhost_svq_push_elem - vhost: Track number of descs in SVQDescState - vhost: Add SVQDescState - vhost: Decouple vhost_svq_add from VirtQueueElement - vhost: Check for queue full at vhost_svq_add - vhost: Move vhost_svq_kick call to vhost_svq_add - vhost: Reorder vhost_svq_kick - vdpa: Avoid compiler to squash reads to used idx - virtio-net: Expose ctrl virtqueue logic - virtio-net: Expose MAC_TABLE_ENTRIES - vhost: move descriptor translation to vhost_svq_vring_write_descs - util: Return void on iova_tree_remove - virtio-net: don't handle mq request in userspace handler for vhost-vdpa - vhost-vdpa: change name and polarity for vhost_vdpa_one_time_request() - vhost-vdpa: backend feature should set only once - vhost-vdpa: fix improper cleanup in net_init_vhost_vdpa - virtio-net: align ctrl_vq index for non-mq guest for vhost_vdpa - virtio: add vhost support for virtio devices - include/hw: start documenting the vhost API - hw/virtio: add vhost_user_[read|write] trace points - vhost: Fix element in vhost_svq_add failure - vdpa: Fix index calculus at vhost_vdpa_svqs_start - vdpa: Fix bad index calculus at vhost_vdpa_get_vring_base - vhost: Fix device's used descriptor dequeue - vhost: Track descriptor chain in private at SVQ - vdpa: Add missing tracing to batch mapping functions - vhost-vdpa: fix typo in a comment - virtio: fix --enable-vhost-user build on non-Linux - vdpa: Expose VHOST_F_LOG_ALL on SVQ - vdpa: Never set log_base addr if SVQ is enabled - vdpa: Adapt vhost_vdpa_get_vring_base to SVQ - vdpa: Add custom IOTLB translations to SVQ - vhost: Add VhostIOVATree - util: add iova_tree_find_iova - util: Add iova_tree_alloc_map - vhost: Shadow virtqueue buffers forwarding - vdpa: adapt vhost_ops callbacks to svq - virtio: Add vhost_svq_get_vring_addr - vhost: Add vhost_svq_valid_features to shadow vq - vhost: Add Shadow VirtQueue call forwarding capabilities - vhost: Add Shadow VirtQueue kick forwarding capabilities - vhost: Add VhostShadowVirtqueue - vdpa: Make ncs autofree - Revert "virtio: introduce macro IRTIO_CONFIG_IRQ_IDX" - Revert "virtio-pci: decouple notifier from interrupt process" - Revert "virtio-pci: decouple the single vector from the interrupt process" - Revert "vhost-vdpa: add support for config interrupt" - Revert "virtio: add support for configure interrupt" - Revert "vhost: add support for configure interrupt" - Revert "virtio-net: add support for configure interrupt" - Revert "virtio-mmio: add support for configure interrupt" - Revert "virtio-pci: add support for configure interrupt" - Revert "vhost: introduce new VhostOps vhost_set_config_call" - virtio: signal after wrapping packed used_idx - target/i386: Adjust feature level according to FEAT_7_1_EDX - target/i386: Add new CPU model GraniteRapids - target/i386: Add support for PREFETCHIT0/1 in CPUID enumeration - target/i386: Add support for AVX-NE-CONVERT in CPUID enumeration - target/i386: Add support for AVX-VNNI-INT8 in CPUID enumeration - target/i386: Add support for AVX-IFMA in CPUID enumeration - target/i386: Add support for AMX-FP16 in CPUID enumeration - target/i386: Add support for CMPCCXADD in CPUID enumeration - tracetool: avoid invalid escape in Python string - hw/pvrdma: Protect against buggy or malicious guest driver - vga: avoid crash if no default vga card mainline inclusion commit 6985d8ede92494f3b791de01e8ee9306eb6d5e4a category: bugfix - qom/object: Remove circular include dependency mainline inclusion commit 5bba9bcfbb42e7c016626420e148a1bf1b080835 category: bugfix - artist: set memory region owners for buffers to the artist device mainline inclusion commit 39fbaeca096a9bf6cbe2af88572c1cb2aa62aa8c category: bugfix - virtio-iommu: Fix the partial copy of probe request mainline inclusion commit 45461aace83d961e933b27519b81d17b4c690514 category: bugfix - e1000: set RX descriptor status in a separate operation mainline inclusion commit 034d00d4858161e1d4cff82d8d230bce874a04d3 category: bugfix - vhost: introduce new VhostOps vhost_set_config_call - vhost: stick to -errno error return convention - vhost-user: stick to -errno error return convention - vhost-vdpa: stick to -errno error return convention - virtio-pci: add support for configure interrupt - virtio-mmio: add support for configure interrupt - virtio-net: add support for configure interrupt - vhost: add support for configure interrupt - virtio: add support for configure interrupt - vhost-vdpa: add support for config interrupt - virtio-pci: decouple the single vector from the interrupt process - virtio-pci: decouple notifier from interrupt process - virtio: introduce macro IRTIO_CONFIG_IRQ_IDX - pci: Fix the update of interrupt disable bit in PCI_COMMAND register - hw/timer/npcm7xx_timer: Prevent timer from counting down past zero - tpm_crb: mark command buffer as dirty on request completion mainline inclusion commit e37a0ef4605e5d2041785ff3fc89ca6021faf7a0 category: bugfix - pci: fix overflow in snprintf string formatting mainline inclusion commit 36f18c6989a3d1ff1d7a0e50b0868ef3958299b4 category: bugfix - hw/usb/hcd-ehci: fix writeback order mainline inclusion commit f471e8b060798f26a7fc339c6152f82f22a7b33d category: bugfix - qemu-timer: Skip empty timer lists before locking in qemu_clock_deadline_ns_all mainline inclusion commit 3f42906c9ab2c777a895b48b87b8107167e4a275 category: bugfix - semihosting/config: Merge --semihosting-config option groups mainline inclusion commit 90c072e063737e9e8f431489bbd334452f89056e category: bugfix - semihosting: fix memleak at semihosting_arg_fallback - target/i386: Export GDS_NO bit to guests Signed-off-by: Jiabo Feng <fengjiabo1@huawei.com>
1101 lines
36 KiB
Diff
1101 lines
36 KiB
Diff
From f6c384a73aaaa7dfc52ed3ceb8ec135f33551629 Mon Sep 17 00:00:00 2001
|
|
From: fangyi <eric.fangyi@huawei.com>
|
|
Date: Thu, 16 Nov 2023 09:54:55 +0800
|
|
Subject: [PATCH] vhost-user: stick to -errno error return convention
|
|
|
|
VhostOps methods in user_ops are not very consistent in their error
|
|
returns: some return negated errno while others just -1.
|
|
|
|
Make sure all of them consistently return negated errno. This also
|
|
helps error propagation from the functions being called inside.
|
|
Besides, this synchronizes the error return convention with the other
|
|
two vhost backends, kernel and vdpa, and will therefore allow for
|
|
consistent error propagation in the generic vhost code (in a followup
|
|
patch).
|
|
|
|
Signed-off-by: Roman Kagan <rvkagan@yandex-team.ru>
|
|
Message-Id: <20211111153354.18807-9-rvkagan@yandex-team.ru>
|
|
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
|
|
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
|
|
Signed-off-by: fangyi <eric.fangyi@huawei.com>
|
|
---
|
|
hw/virtio/vhost-user.c | 401 +++++++++++++++++++++++------------------
|
|
1 file changed, 223 insertions(+), 178 deletions(-)
|
|
|
|
diff --git a/hw/virtio/vhost-user.c b/hw/virtio/vhost-user.c
|
|
index 24f80d5d18..358dc82010 100644
|
|
--- a/hw/virtio/vhost-user.c
|
|
+++ b/hw/virtio/vhost-user.c
|
|
@@ -283,9 +283,10 @@ static int vhost_user_read_header(struct vhost_dev *dev, VhostUserMsg *msg)
|
|
|
|
r = qemu_chr_fe_read_all(chr, p, size);
|
|
if (r != size) {
|
|
+ int saved_errno = errno;
|
|
error_report("Failed to read msg header. Read %d instead of %d."
|
|
" Original request %d.", r, size, msg->hdr.request);
|
|
- return -1;
|
|
+ return r < 0 ? -saved_errno : -EIO;
|
|
}
|
|
|
|
/* validate received flags */
|
|
@@ -293,7 +294,7 @@ static int vhost_user_read_header(struct vhost_dev *dev, VhostUserMsg *msg)
|
|
error_report("Failed to read msg header."
|
|
" Flags 0x%x instead of 0x%x.", msg->hdr.flags,
|
|
VHOST_USER_REPLY_MASK | VHOST_USER_VERSION);
|
|
- return -1;
|
|
+ return -EPROTO;
|
|
}
|
|
|
|
return 0;
|
|
@@ -317,8 +318,9 @@ static gboolean vhost_user_read_cb(void *do_not_use, GIOCondition condition,
|
|
uint8_t *p = (uint8_t *) msg;
|
|
int r, size;
|
|
|
|
- if (vhost_user_read_header(dev, msg) < 0) {
|
|
- data->ret = -1;
|
|
+ r = vhost_user_read_header(dev, msg);
|
|
+ if (r < 0) {
|
|
+ data->ret = r;
|
|
goto end;
|
|
}
|
|
|
|
@@ -327,7 +329,7 @@ static gboolean vhost_user_read_cb(void *do_not_use, GIOCondition condition,
|
|
error_report("Failed to read msg header."
|
|
" Size %d exceeds the maximum %zu.", msg->hdr.size,
|
|
VHOST_USER_PAYLOAD_SIZE);
|
|
- data->ret = -1;
|
|
+ data->ret = -EPROTO;
|
|
goto end;
|
|
}
|
|
|
|
@@ -336,9 +338,10 @@ static gboolean vhost_user_read_cb(void *do_not_use, GIOCondition condition,
|
|
size = msg->hdr.size;
|
|
r = qemu_chr_fe_read_all(chr, p, size);
|
|
if (r != size) {
|
|
+ int saved_errno = errno;
|
|
error_report("Failed to read msg payload."
|
|
" Read %d instead of %d.", r, msg->hdr.size);
|
|
- data->ret = -1;
|
|
+ data->ret = r < 0 ? -saved_errno : -EIO;
|
|
goto end;
|
|
}
|
|
}
|
|
@@ -421,24 +424,26 @@ static int vhost_user_read(struct vhost_dev *dev, VhostUserMsg *msg)
|
|
static int process_message_reply(struct vhost_dev *dev,
|
|
const VhostUserMsg *msg)
|
|
{
|
|
+ int ret;
|
|
VhostUserMsg msg_reply;
|
|
|
|
if ((msg->hdr.flags & VHOST_USER_NEED_REPLY_MASK) == 0) {
|
|
return 0;
|
|
}
|
|
|
|
- if (vhost_user_read(dev, &msg_reply) < 0) {
|
|
- return -1;
|
|
+ ret = vhost_user_read(dev, &msg_reply);
|
|
+ if (ret < 0) {
|
|
+ return ret;
|
|
}
|
|
|
|
if (msg_reply.hdr.request != msg->hdr.request) {
|
|
error_report("Received unexpected msg type. "
|
|
"Expected %d received %d",
|
|
msg->hdr.request, msg_reply.hdr.request);
|
|
- return -1;
|
|
+ return -EPROTO;
|
|
}
|
|
|
|
- return msg_reply.payload.u64 ? -1 : 0;
|
|
+ return msg_reply.payload.u64 ? -EIO : 0;
|
|
}
|
|
|
|
static bool vhost_user_one_time_request(VhostUserRequest request)
|
|
@@ -475,14 +480,15 @@ static int vhost_user_write(struct vhost_dev *dev, VhostUserMsg *msg,
|
|
|
|
if (qemu_chr_fe_set_msgfds(chr, fds, fd_num) < 0) {
|
|
error_report("Failed to set msg fds.");
|
|
- return -1;
|
|
+ return -EINVAL;
|
|
}
|
|
|
|
ret = qemu_chr_fe_write_all(chr, (const uint8_t *) msg, size);
|
|
if (ret != size) {
|
|
+ int saved_errno = errno;
|
|
error_report("Failed to write msg."
|
|
" Wrote %d instead of %d.", ret, size);
|
|
- return -1;
|
|
+ return ret < 0 ? -saved_errno : -EIO;
|
|
}
|
|
|
|
return 0;
|
|
@@ -505,6 +511,7 @@ static int vhost_user_set_log_base(struct vhost_dev *dev, uint64_t base,
|
|
size_t fd_num = 0;
|
|
bool shmfd = virtio_has_feature(dev->protocol_features,
|
|
VHOST_USER_PROTOCOL_F_LOG_SHMFD);
|
|
+ int ret;
|
|
VhostUserMsg msg = {
|
|
.hdr.request = VHOST_USER_SET_LOG_BASE,
|
|
.hdr.flags = VHOST_USER_VERSION,
|
|
@@ -517,21 +524,23 @@ static int vhost_user_set_log_base(struct vhost_dev *dev, uint64_t base,
|
|
fds[fd_num++] = log->fd;
|
|
}
|
|
|
|
- if (vhost_user_write(dev, &msg, fds, fd_num) < 0) {
|
|
- return -1;
|
|
+ ret = vhost_user_write(dev, &msg, fds, fd_num);
|
|
+ if (ret < 0) {
|
|
+ return ret;
|
|
}
|
|
|
|
if (shmfd) {
|
|
msg.hdr.size = 0;
|
|
- if (vhost_user_read(dev, &msg) < 0) {
|
|
- return -1;
|
|
+ ret = vhost_user_read(dev, &msg);
|
|
+ if (ret < 0) {
|
|
+ return ret;
|
|
}
|
|
|
|
if (msg.hdr.request != VHOST_USER_SET_LOG_BASE) {
|
|
error_report("Received unexpected msg type. "
|
|
"Expected %d received %d",
|
|
VHOST_USER_SET_LOG_BASE, msg.hdr.request);
|
|
- return -1;
|
|
+ return -EPROTO;
|
|
}
|
|
}
|
|
|
|
@@ -591,7 +600,7 @@ static int vhost_user_fill_set_mem_table_msg(struct vhost_user *u,
|
|
u->region_rb[i] = mr->ram_block;
|
|
} else if (*fd_num == VHOST_MEMORY_BASELINE_NREGIONS) {
|
|
error_report("Failed preparing vhost-user memory table msg");
|
|
- return -1;
|
|
+ return -ENOBUFS;
|
|
}
|
|
vhost_user_fill_msg_region(®ion_buffer, reg, offset);
|
|
msg->payload.memory.regions[*fd_num] = region_buffer;
|
|
@@ -607,14 +616,14 @@ static int vhost_user_fill_set_mem_table_msg(struct vhost_user *u,
|
|
if (!*fd_num) {
|
|
error_report("Failed initializing vhost-user memory map, "
|
|
"consider using -object memory-backend-file share=on");
|
|
- return -1;
|
|
+ return -EINVAL;
|
|
}
|
|
|
|
msg->hdr.size = sizeof(msg->payload.memory.nregions);
|
|
msg->hdr.size += sizeof(msg->payload.memory.padding);
|
|
msg->hdr.size += *fd_num * sizeof(VhostUserMemoryRegion);
|
|
|
|
- return 1;
|
|
+ return 0;
|
|
}
|
|
|
|
static inline bool reg_equal(struct vhost_memory_region *shadow_reg,
|
|
@@ -744,8 +753,9 @@ static int send_remove_regions(struct vhost_dev *dev,
|
|
vhost_user_fill_msg_region(®ion_buffer, shadow_reg, 0);
|
|
msg->payload.mem_reg.region = region_buffer;
|
|
|
|
- if (vhost_user_write(dev, msg, &fd, 1) < 0) {
|
|
- return -1;
|
|
+ ret = vhost_user_write(dev, msg, &fd, 1);
|
|
+ if (ret < 0) {
|
|
+ return ret;
|
|
}
|
|
|
|
if (reply_supported) {
|
|
@@ -804,15 +814,17 @@ static int send_add_regions(struct vhost_dev *dev,
|
|
vhost_user_fill_msg_region(®ion_buffer, reg, offset);
|
|
msg->payload.mem_reg.region = region_buffer;
|
|
|
|
- if (vhost_user_write(dev, msg, &fd, 1) < 0) {
|
|
- return -1;
|
|
+ ret = vhost_user_write(dev, msg, &fd, 1);
|
|
+ if (ret < 0) {
|
|
+ return ret;
|
|
}
|
|
|
|
if (track_ramblocks) {
|
|
uint64_t reply_gpa;
|
|
|
|
- if (vhost_user_read(dev, &msg_reply) < 0) {
|
|
- return -1;
|
|
+ ret = vhost_user_read(dev, &msg_reply);
|
|
+ if (ret < 0) {
|
|
+ return ret;
|
|
}
|
|
|
|
reply_gpa = msg_reply.payload.mem_reg.region.guest_phys_addr;
|
|
@@ -822,7 +834,7 @@ static int send_add_regions(struct vhost_dev *dev,
|
|
"Expected %d received %d", __func__,
|
|
VHOST_USER_ADD_MEM_REG,
|
|
msg_reply.hdr.request);
|
|
- return -1;
|
|
+ return -EPROTO;
|
|
}
|
|
|
|
/*
|
|
@@ -833,7 +845,7 @@ static int send_add_regions(struct vhost_dev *dev,
|
|
error_report("%s: Unexpected size for postcopy reply "
|
|
"%d vs %d", __func__, msg_reply.hdr.size,
|
|
msg->hdr.size);
|
|
- return -1;
|
|
+ return -EPROTO;
|
|
}
|
|
|
|
/* Get the postcopy client base from the backend's reply. */
|
|
@@ -849,7 +861,7 @@ static int send_add_regions(struct vhost_dev *dev,
|
|
"Got guest physical address %" PRIX64 ", expected "
|
|
"%" PRIX64, __func__, reply_gpa,
|
|
dev->mem->regions[reg_idx].guest_phys_addr);
|
|
- return -1;
|
|
+ return -EPROTO;
|
|
}
|
|
} else if (reply_supported) {
|
|
ret = process_message_reply(dev, msg);
|
|
@@ -890,6 +902,7 @@ static int vhost_user_add_remove_regions(struct vhost_dev *dev,
|
|
struct scrub_regions rem_reg[VHOST_USER_MAX_RAM_SLOTS];
|
|
uint64_t shadow_pcb[VHOST_USER_MAX_RAM_SLOTS] = {};
|
|
int nr_add_reg, nr_rem_reg;
|
|
+ int ret;
|
|
|
|
msg->hdr.size = sizeof(msg->payload.mem_reg);
|
|
|
|
@@ -897,16 +910,20 @@ static int vhost_user_add_remove_regions(struct vhost_dev *dev,
|
|
scrub_shadow_regions(dev, add_reg, &nr_add_reg, rem_reg, &nr_rem_reg,
|
|
shadow_pcb, track_ramblocks);
|
|
|
|
- if (nr_rem_reg && send_remove_regions(dev, rem_reg, nr_rem_reg, msg,
|
|
- reply_supported) < 0)
|
|
- {
|
|
- goto err;
|
|
+ if (nr_rem_reg) {
|
|
+ ret = send_remove_regions(dev, rem_reg, nr_rem_reg, msg,
|
|
+ reply_supported);
|
|
+ if (ret < 0) {
|
|
+ goto err;
|
|
+ }
|
|
}
|
|
|
|
- if (nr_add_reg && send_add_regions(dev, add_reg, nr_add_reg, msg,
|
|
- shadow_pcb, reply_supported, track_ramblocks) < 0)
|
|
- {
|
|
- goto err;
|
|
+ if (nr_add_reg) {
|
|
+ ret = send_add_regions(dev, add_reg, nr_add_reg, msg, shadow_pcb,
|
|
+ reply_supported, track_ramblocks);
|
|
+ if (ret < 0) {
|
|
+ goto err;
|
|
+ }
|
|
}
|
|
|
|
if (track_ramblocks) {
|
|
@@ -921,8 +938,9 @@ static int vhost_user_add_remove_regions(struct vhost_dev *dev,
|
|
msg->hdr.size = sizeof(msg->payload.u64);
|
|
msg->payload.u64 = 0; /* OK */
|
|
|
|
- if (vhost_user_write(dev, msg, NULL, 0) < 0) {
|
|
- return -1;
|
|
+ ret = vhost_user_write(dev, msg, NULL, 0);
|
|
+ if (ret < 0) {
|
|
+ return ret;
|
|
}
|
|
}
|
|
|
|
@@ -934,7 +952,7 @@ err:
|
|
sizeof(uint64_t) * VHOST_USER_MAX_RAM_SLOTS);
|
|
}
|
|
|
|
- return -1;
|
|
+ return ret;
|
|
}
|
|
|
|
static int vhost_user_set_mem_table_postcopy(struct vhost_dev *dev,
|
|
@@ -947,6 +965,7 @@ static int vhost_user_set_mem_table_postcopy(struct vhost_dev *dev,
|
|
size_t fd_num = 0;
|
|
VhostUserMsg msg_reply;
|
|
int region_i, msg_i;
|
|
+ int ret;
|
|
|
|
VhostUserMsg msg = {
|
|
.hdr.flags = VHOST_USER_VERSION,
|
|
@@ -964,29 +983,32 @@ static int vhost_user_set_mem_table_postcopy(struct vhost_dev *dev,
|
|
}
|
|
|
|
if (config_mem_slots) {
|
|
- if (vhost_user_add_remove_regions(dev, &msg, reply_supported,
|
|
- true) < 0) {
|
|
- return -1;
|
|
+ ret = vhost_user_add_remove_regions(dev, &msg, reply_supported, true);
|
|
+ if (ret < 0) {
|
|
+ return ret;
|
|
}
|
|
} else {
|
|
- if (vhost_user_fill_set_mem_table_msg(u, dev, &msg, fds, &fd_num,
|
|
- true) < 0) {
|
|
- return -1;
|
|
+ ret = vhost_user_fill_set_mem_table_msg(u, dev, &msg, fds, &fd_num,
|
|
+ true);
|
|
+ if (ret < 0) {
|
|
+ return ret;
|
|
}
|
|
|
|
- if (vhost_user_write(dev, &msg, fds, fd_num) < 0) {
|
|
- return -1;
|
|
+ ret = vhost_user_write(dev, &msg, fds, fd_num);
|
|
+ if (ret < 0) {
|
|
+ return ret;
|
|
}
|
|
|
|
- if (vhost_user_read(dev, &msg_reply) < 0) {
|
|
- return -1;
|
|
+ ret = vhost_user_read(dev, &msg_reply);
|
|
+ if (ret < 0) {
|
|
+ return ret;
|
|
}
|
|
|
|
if (msg_reply.hdr.request != VHOST_USER_SET_MEM_TABLE) {
|
|
error_report("%s: Received unexpected msg type."
|
|
"Expected %d received %d", __func__,
|
|
VHOST_USER_SET_MEM_TABLE, msg_reply.hdr.request);
|
|
- return -1;
|
|
+ return -EPROTO;
|
|
}
|
|
|
|
/*
|
|
@@ -997,7 +1019,7 @@ static int vhost_user_set_mem_table_postcopy(struct vhost_dev *dev,
|
|
error_report("%s: Unexpected size for postcopy reply "
|
|
"%d vs %d", __func__, msg_reply.hdr.size,
|
|
msg.hdr.size);
|
|
- return -1;
|
|
+ return -EPROTO;
|
|
}
|
|
|
|
memset(u->postcopy_client_bases, 0,
|
|
@@ -1027,7 +1049,7 @@ static int vhost_user_set_mem_table_postcopy(struct vhost_dev *dev,
|
|
error_report("%s: postcopy reply not fully consumed "
|
|
"%d vs %zd",
|
|
__func__, msg_i, fd_num);
|
|
- return -1;
|
|
+ return -EIO;
|
|
}
|
|
|
|
/*
|
|
@@ -1038,8 +1060,9 @@ static int vhost_user_set_mem_table_postcopy(struct vhost_dev *dev,
|
|
/* TODO: Use this for failure cases as well with a bad value. */
|
|
msg.hdr.size = sizeof(msg.payload.u64);
|
|
msg.payload.u64 = 0; /* OK */
|
|
- if (vhost_user_write(dev, &msg, NULL, 0) < 0) {
|
|
- return -1;
|
|
+ ret = vhost_user_write(dev, &msg, NULL, 0);
|
|
+ if (ret < 0) {
|
|
+ return ret;
|
|
}
|
|
}
|
|
|
|
@@ -1058,6 +1081,7 @@ static int vhost_user_set_mem_table(struct vhost_dev *dev,
|
|
bool config_mem_slots =
|
|
virtio_has_feature(dev->protocol_features,
|
|
VHOST_USER_PROTOCOL_F_CONFIGURE_MEM_SLOTS);
|
|
+ int ret;
|
|
|
|
if (do_postcopy) {
|
|
/*
|
|
@@ -1077,17 +1101,20 @@ static int vhost_user_set_mem_table(struct vhost_dev *dev,
|
|
}
|
|
|
|
if (config_mem_slots) {
|
|
- if (vhost_user_add_remove_regions(dev, &msg, reply_supported,
|
|
- false) < 0) {
|
|
- return -1;
|
|
+ ret = vhost_user_add_remove_regions(dev, &msg, reply_supported, false);
|
|
+ if (ret < 0) {
|
|
+ return ret;
|
|
}
|
|
} else {
|
|
- if (vhost_user_fill_set_mem_table_msg(u, dev, &msg, fds, &fd_num,
|
|
- false) < 0) {
|
|
- return -1;
|
|
+ ret = vhost_user_fill_set_mem_table_msg(u, dev, &msg, fds, &fd_num,
|
|
+ false);
|
|
+ if (ret < 0) {
|
|
+ return ret;
|
|
}
|
|
- if (vhost_user_write(dev, &msg, fds, fd_num) < 0) {
|
|
- return -1;
|
|
+
|
|
+ ret = vhost_user_write(dev, &msg, fds, fd_num);
|
|
+ if (ret < 0) {
|
|
+ return ret;
|
|
}
|
|
|
|
if (reply_supported) {
|
|
@@ -1112,14 +1139,10 @@ static int vhost_user_set_vring_endian(struct vhost_dev *dev,
|
|
|
|
if (!cross_endian) {
|
|
error_report("vhost-user trying to send unhandled ioctl");
|
|
- return -1;
|
|
+ return -ENOTSUP;
|
|
}
|
|
|
|
- if (vhost_user_write(dev, &msg, NULL, 0) < 0) {
|
|
- return -1;
|
|
- }
|
|
-
|
|
- return 0;
|
|
+ return vhost_user_write(dev, &msg, NULL, 0);
|
|
}
|
|
|
|
static int vhost_set_vring(struct vhost_dev *dev,
|
|
@@ -1133,11 +1156,7 @@ static int vhost_set_vring(struct vhost_dev *dev,
|
|
.hdr.size = sizeof(msg.payload.state),
|
|
};
|
|
|
|
- if (vhost_user_write(dev, &msg, NULL, 0) < 0) {
|
|
- return -1;
|
|
- }
|
|
-
|
|
- return 0;
|
|
+ return vhost_user_write(dev, &msg, NULL, 0);
|
|
}
|
|
|
|
static int vhost_user_set_vring_num(struct vhost_dev *dev,
|
|
@@ -1180,16 +1199,25 @@ static int vhost_user_set_vring_enable(struct vhost_dev *dev, int enable)
|
|
int i;
|
|
|
|
if (!virtio_has_feature(dev->features, VHOST_USER_F_PROTOCOL_FEATURES)) {
|
|
- return -1;
|
|
+ return -EINVAL;
|
|
}
|
|
|
|
for (i = 0; i < dev->nvqs; ++i) {
|
|
+ int ret;
|
|
struct vhost_vring_state state = {
|
|
.index = dev->vq_index + i,
|
|
.num = enable,
|
|
};
|
|
|
|
- vhost_set_vring(dev, VHOST_USER_SET_VRING_ENABLE, &state);
|
|
+ ret = vhost_set_vring(dev, VHOST_USER_SET_VRING_ENABLE, &state);
|
|
+ if (ret < 0) {
|
|
+ /*
|
|
+ * Restoring the previous state is likely infeasible, as well as
|
|
+ * proceeding regardless the error, so just bail out and hope for
|
|
+ * the device-level recovery.
|
|
+ */
|
|
+ return ret;
|
|
+ }
|
|
}
|
|
|
|
return 0;
|
|
@@ -1198,6 +1226,7 @@ static int vhost_user_set_vring_enable(struct vhost_dev *dev, int enable)
|
|
static int vhost_user_get_vring_base(struct vhost_dev *dev,
|
|
struct vhost_vring_state *ring)
|
|
{
|
|
+ int ret;
|
|
VhostUserMsg msg = {
|
|
.hdr.request = VHOST_USER_GET_VRING_BASE,
|
|
.hdr.flags = VHOST_USER_VERSION,
|
|
@@ -1208,23 +1237,25 @@ static int vhost_user_get_vring_base(struct vhost_dev *dev,
|
|
|
|
vhost_user_host_notifier_remove(u->user, dev->vdev, ring->index);
|
|
|
|
- if (vhost_user_write(dev, &msg, NULL, 0) < 0) {
|
|
- return -1;
|
|
+ ret = vhost_user_write(dev, &msg, NULL, 0);
|
|
+ if (ret < 0) {
|
|
+ return ret;
|
|
}
|
|
|
|
- if (vhost_user_read(dev, &msg) < 0) {
|
|
- return -1;
|
|
+ ret = vhost_user_read(dev, &msg);
|
|
+ if (ret < 0) {
|
|
+ return ret;
|
|
}
|
|
|
|
if (msg.hdr.request != VHOST_USER_GET_VRING_BASE) {
|
|
error_report("Received unexpected msg type. Expected %d received %d",
|
|
VHOST_USER_GET_VRING_BASE, msg.hdr.request);
|
|
- return -1;
|
|
+ return -EPROTO;
|
|
}
|
|
|
|
if (msg.hdr.size != sizeof(msg.payload.state)) {
|
|
error_report("Received bad msg size.");
|
|
- return -1;
|
|
+ return -EPROTO;
|
|
}
|
|
|
|
*ring = msg.payload.state;
|
|
@@ -1251,11 +1282,7 @@ static int vhost_set_vring_file(struct vhost_dev *dev,
|
|
msg.payload.u64 |= VHOST_USER_VRING_NOFD_MASK;
|
|
}
|
|
|
|
- if (vhost_user_write(dev, &msg, fds, fd_num) < 0) {
|
|
- return -1;
|
|
- }
|
|
-
|
|
- return 0;
|
|
+ return vhost_user_write(dev, &msg, fds, fd_num);
|
|
}
|
|
|
|
static int vhost_user_set_vring_kick(struct vhost_dev *dev,
|
|
@@ -1273,6 +1300,7 @@ static int vhost_user_set_vring_call(struct vhost_dev *dev,
|
|
|
|
static int vhost_user_get_u64(struct vhost_dev *dev, int request, uint64_t *u64)
|
|
{
|
|
+ int ret;
|
|
VhostUserMsg msg = {
|
|
.hdr.request = request,
|
|
.hdr.flags = VHOST_USER_VERSION,
|
|
@@ -1282,23 +1310,25 @@ static int vhost_user_get_u64(struct vhost_dev *dev, int request, uint64_t *u64)
|
|
return 0;
|
|
}
|
|
|
|
- if (vhost_user_write(dev, &msg, NULL, 0) < 0) {
|
|
- return -1;
|
|
+ ret = vhost_user_write(dev, &msg, NULL, 0);
|
|
+ if (ret < 0) {
|
|
+ return ret;
|
|
}
|
|
|
|
- if (vhost_user_read(dev, &msg) < 0) {
|
|
- return -1;
|
|
+ ret = vhost_user_read(dev, &msg);
|
|
+ if (ret < 0) {
|
|
+ return ret;
|
|
}
|
|
|
|
if (msg.hdr.request != request) {
|
|
error_report("Received unexpected msg type. Expected %d received %d",
|
|
request, msg.hdr.request);
|
|
- return -1;
|
|
+ return -EPROTO;
|
|
}
|
|
|
|
if (msg.hdr.size != sizeof(msg.payload.u64)) {
|
|
error_report("Received bad msg size.");
|
|
- return -1;
|
|
+ return -EPROTO;
|
|
}
|
|
|
|
*u64 = msg.payload.u64;
|
|
@@ -1336,6 +1366,7 @@ static int enforce_reply(struct vhost_dev *dev,
|
|
static int vhost_user_set_vring_addr(struct vhost_dev *dev,
|
|
struct vhost_vring_addr *addr)
|
|
{
|
|
+ int ret;
|
|
VhostUserMsg msg = {
|
|
.hdr.request = VHOST_USER_SET_VRING_ADDR,
|
|
.hdr.flags = VHOST_USER_VERSION,
|
|
@@ -1356,8 +1387,9 @@ static int vhost_user_set_vring_addr(struct vhost_dev *dev,
|
|
msg.hdr.flags |= VHOST_USER_NEED_REPLY_MASK;
|
|
}
|
|
|
|
- if (vhost_user_write(dev, &msg, NULL, 0) < 0) {
|
|
- return -1;
|
|
+ ret = vhost_user_write(dev, &msg, NULL, 0);
|
|
+ if (ret < 0) {
|
|
+ return ret;
|
|
}
|
|
|
|
if (wait_for_reply) {
|
|
@@ -1376,6 +1408,7 @@ static int vhost_user_set_u64(struct vhost_dev *dev, int request, uint64_t u64,
|
|
.payload.u64 = u64,
|
|
.hdr.size = sizeof(msg.payload.u64),
|
|
};
|
|
+ int ret;
|
|
|
|
if (wait_for_reply) {
|
|
bool reply_supported = virtio_has_feature(dev->protocol_features,
|
|
@@ -1385,8 +1418,9 @@ static int vhost_user_set_u64(struct vhost_dev *dev, int request, uint64_t u64,
|
|
}
|
|
}
|
|
|
|
- if (vhost_user_write(dev, &msg, NULL, 0) < 0) {
|
|
- return -1;
|
|
+ ret = vhost_user_write(dev, &msg, NULL, 0);
|
|
+ if (ret < 0) {
|
|
+ return ret;
|
|
}
|
|
|
|
if (wait_for_reply) {
|
|
@@ -1423,11 +1457,7 @@ static int vhost_user_set_owner(struct vhost_dev *dev)
|
|
.hdr.flags = VHOST_USER_VERSION,
|
|
};
|
|
|
|
- if (vhost_user_write(dev, &msg, NULL, 0) < 0) {
|
|
- return -EPROTO;
|
|
- }
|
|
-
|
|
- return 0;
|
|
+ return vhost_user_write(dev, &msg, NULL, 0);
|
|
}
|
|
|
|
static int vhost_user_get_max_memslots(struct vhost_dev *dev,
|
|
@@ -1458,26 +1488,16 @@ static int vhost_user_reset_device(struct vhost_dev *dev)
|
|
? VHOST_USER_RESET_DEVICE
|
|
: VHOST_USER_RESET_OWNER;
|
|
|
|
- if (vhost_user_write(dev, &msg, NULL, 0) < 0) {
|
|
- return -1;
|
|
- }
|
|
-
|
|
- return 0;
|
|
+ return vhost_user_write(dev, &msg, NULL, 0);
|
|
}
|
|
|
|
static int vhost_user_slave_handle_config_change(struct vhost_dev *dev)
|
|
{
|
|
- int ret = -1;
|
|
-
|
|
- if (!dev->config_ops) {
|
|
- return -1;
|
|
+ if (!dev->config_ops || !dev->config_ops->vhost_dev_config_notifier) {
|
|
+ return -ENOSYS;
|
|
}
|
|
|
|
- if (dev->config_ops->vhost_dev_config_notifier) {
|
|
- ret = dev->config_ops->vhost_dev_config_notifier(dev);
|
|
- }
|
|
-
|
|
- return ret;
|
|
+ return dev->config_ops->vhost_dev_config_notifier(dev);
|
|
}
|
|
|
|
static int vhost_user_slave_handle_vring_host_notifier(struct vhost_dev *dev,
|
|
@@ -1496,7 +1516,7 @@ static int vhost_user_slave_handle_vring_host_notifier(struct vhost_dev *dev,
|
|
if (!virtio_has_feature(dev->protocol_features,
|
|
VHOST_USER_PROTOCOL_F_HOST_NOTIFIER) ||
|
|
vdev == NULL || queue_idx >= virtio_get_num_queues(vdev)) {
|
|
- return -1;
|
|
+ return -EINVAL;
|
|
}
|
|
|
|
n = &user->notifier[queue_idx];
|
|
@@ -1509,13 +1529,13 @@ static int vhost_user_slave_handle_vring_host_notifier(struct vhost_dev *dev,
|
|
|
|
/* Sanity check. */
|
|
if (area->size != page_size) {
|
|
- return -1;
|
|
+ return -EINVAL;
|
|
}
|
|
|
|
addr = mmap(NULL, page_size, PROT_READ | PROT_WRITE, MAP_SHARED,
|
|
fd, area->offset);
|
|
if (addr == MAP_FAILED) {
|
|
- return -1;
|
|
+ return -EFAULT;
|
|
}
|
|
|
|
name = g_strdup_printf("vhost-user/host-notifier@%p mmaps[%d]",
|
|
@@ -1531,7 +1551,7 @@ static int vhost_user_slave_handle_vring_host_notifier(struct vhost_dev *dev,
|
|
if (virtio_queue_set_host_notifier_mr(vdev, queue_idx, &n->mr, true)) {
|
|
object_unparent(OBJECT(&n->mr));
|
|
munmap(addr, page_size);
|
|
- return -1;
|
|
+ return -ENXIO;
|
|
}
|
|
|
|
n->addr = addr;
|
|
@@ -1660,14 +1680,15 @@ static int vhost_setup_slave_channel(struct vhost_dev *dev)
|
|
}
|
|
|
|
if (socketpair(PF_UNIX, SOCK_STREAM, 0, sv) == -1) {
|
|
+ int saved_errno = errno;
|
|
error_report("socketpair() failed");
|
|
- return -1;
|
|
+ return -saved_errno;
|
|
}
|
|
|
|
ioc = QIO_CHANNEL(qio_channel_socket_new_fd(sv[0], &local_err));
|
|
if (!ioc) {
|
|
error_report_err(local_err);
|
|
- return -1;
|
|
+ return -ECONNREFUSED;
|
|
}
|
|
u->slave_ioc = ioc;
|
|
slave_update_read_handler(dev, NULL);
|
|
@@ -1774,35 +1795,38 @@ static int vhost_user_postcopy_advise(struct vhost_dev *dev, Error **errp)
|
|
struct vhost_user *u = dev->opaque;
|
|
CharBackend *chr = u->user->chr;
|
|
int ufd;
|
|
+ int ret;
|
|
VhostUserMsg msg = {
|
|
.hdr.request = VHOST_USER_POSTCOPY_ADVISE,
|
|
.hdr.flags = VHOST_USER_VERSION,
|
|
};
|
|
|
|
- if (vhost_user_write(dev, &msg, NULL, 0) < 0) {
|
|
+ ret = vhost_user_write(dev, &msg, NULL, 0);
|
|
+ if (ret < 0) {
|
|
error_setg(errp, "Failed to send postcopy_advise to vhost");
|
|
- return -1;
|
|
+ return ret;
|
|
}
|
|
|
|
- if (vhost_user_read(dev, &msg) < 0) {
|
|
+ ret = vhost_user_read(dev, &msg);
|
|
+ if (ret < 0) {
|
|
error_setg(errp, "Failed to get postcopy_advise reply from vhost");
|
|
- return -1;
|
|
+ return ret;
|
|
}
|
|
|
|
if (msg.hdr.request != VHOST_USER_POSTCOPY_ADVISE) {
|
|
error_setg(errp, "Unexpected msg type. Expected %d received %d",
|
|
VHOST_USER_POSTCOPY_ADVISE, msg.hdr.request);
|
|
- return -1;
|
|
+ return -EPROTO;
|
|
}
|
|
|
|
if (msg.hdr.size) {
|
|
error_setg(errp, "Received bad msg size.");
|
|
- return -1;
|
|
+ return -EPROTO;
|
|
}
|
|
ufd = qemu_chr_fe_get_msgfd(chr);
|
|
if (ufd < 0) {
|
|
error_setg(errp, "%s: Failed to get ufd", __func__);
|
|
- return -1;
|
|
+ return -EIO;
|
|
}
|
|
qemu_set_nonblock(ufd);
|
|
|
|
@@ -1816,7 +1840,7 @@ static int vhost_user_postcopy_advise(struct vhost_dev *dev, Error **errp)
|
|
return 0;
|
|
#else
|
|
error_setg(errp, "Postcopy not supported on non-Linux systems");
|
|
- return -1;
|
|
+ return -ENOSYS;
|
|
#endif
|
|
}
|
|
|
|
@@ -1832,10 +1856,13 @@ static int vhost_user_postcopy_listen(struct vhost_dev *dev, Error **errp)
|
|
.hdr.flags = VHOST_USER_VERSION | VHOST_USER_NEED_REPLY_MASK,
|
|
};
|
|
u->postcopy_listen = true;
|
|
+
|
|
trace_vhost_user_postcopy_listen();
|
|
- if (vhost_user_write(dev, &msg, NULL, 0) < 0) {
|
|
+
|
|
+ ret = vhost_user_write(dev, &msg, NULL, 0);
|
|
+ if (ret < 0) {
|
|
error_setg(errp, "Failed to send postcopy_listen to vhost");
|
|
- return -1;
|
|
+ return ret;
|
|
}
|
|
|
|
ret = process_message_reply(dev, &msg);
|
|
@@ -1860,9 +1887,11 @@ static int vhost_user_postcopy_end(struct vhost_dev *dev, Error **errp)
|
|
struct vhost_user *u = dev->opaque;
|
|
|
|
trace_vhost_user_postcopy_end_entry();
|
|
- if (vhost_user_write(dev, &msg, NULL, 0) < 0) {
|
|
+
|
|
+ ret = vhost_user_write(dev, &msg, NULL, 0);
|
|
+ if (ret < 0) {
|
|
error_setg(errp, "Failed to send postcopy_end to vhost");
|
|
- return -1;
|
|
+ return ret;
|
|
}
|
|
|
|
ret = process_message_reply(dev, &msg);
|
|
@@ -2141,7 +2170,7 @@ static int vhost_user_migration_done(struct vhost_dev *dev, char* mac_addr)
|
|
|
|
return vhost_user_write(dev, &msg, NULL, 0);
|
|
}
|
|
- return -1;
|
|
+ return -ENOTSUP;
|
|
}
|
|
|
|
static bool vhost_user_can_merge(struct vhost_dev *dev,
|
|
@@ -2162,6 +2191,7 @@ static int vhost_user_net_set_mtu(struct vhost_dev *dev, uint16_t mtu)
|
|
VhostUserMsg msg;
|
|
bool reply_supported = virtio_has_feature(dev->protocol_features,
|
|
VHOST_USER_PROTOCOL_F_REPLY_ACK);
|
|
+ int ret;
|
|
|
|
if (!(dev->protocol_features & (1ULL << VHOST_USER_PROTOCOL_F_NET_MTU))) {
|
|
return 0;
|
|
@@ -2175,8 +2205,9 @@ static int vhost_user_net_set_mtu(struct vhost_dev *dev, uint16_t mtu)
|
|
msg.hdr.flags |= VHOST_USER_NEED_REPLY_MASK;
|
|
}
|
|
|
|
- if (vhost_user_write(dev, &msg, NULL, 0) < 0) {
|
|
- return -1;
|
|
+ ret = vhost_user_write(dev, &msg, NULL, 0);
|
|
+ if (ret < 0) {
|
|
+ return ret;
|
|
}
|
|
|
|
/* If reply_ack supported, slave has to ack specified MTU is valid */
|
|
@@ -2190,6 +2221,7 @@ static int vhost_user_net_set_mtu(struct vhost_dev *dev, uint16_t mtu)
|
|
static int vhost_user_send_device_iotlb_msg(struct vhost_dev *dev,
|
|
struct vhost_iotlb_msg *imsg)
|
|
{
|
|
+ int ret;
|
|
VhostUserMsg msg = {
|
|
.hdr.request = VHOST_USER_IOTLB_MSG,
|
|
.hdr.size = sizeof(msg.payload.iotlb),
|
|
@@ -2197,8 +2229,9 @@ static int vhost_user_send_device_iotlb_msg(struct vhost_dev *dev,
|
|
.payload.iotlb = *imsg,
|
|
};
|
|
|
|
- if (vhost_user_write(dev, &msg, NULL, 0) < 0) {
|
|
- return -EFAULT;
|
|
+ ret = vhost_user_write(dev, &msg, NULL, 0);
|
|
+ if (ret < 0) {
|
|
+ return ret;
|
|
}
|
|
|
|
return process_message_reply(dev, &msg);
|
|
@@ -2213,6 +2246,7 @@ static void vhost_user_set_iotlb_callback(struct vhost_dev *dev, int enabled)
|
|
static int vhost_user_get_config(struct vhost_dev *dev, uint8_t *config,
|
|
uint32_t config_len, Error **errp)
|
|
{
|
|
+ int ret;
|
|
VhostUserMsg msg = {
|
|
.hdr.request = VHOST_USER_GET_CONFIG,
|
|
.hdr.flags = VHOST_USER_VERSION,
|
|
@@ -2229,26 +2263,28 @@ static int vhost_user_get_config(struct vhost_dev *dev, uint8_t *config,
|
|
|
|
msg.payload.config.offset = 0;
|
|
msg.payload.config.size = config_len;
|
|
- if (vhost_user_write(dev, &msg, NULL, 0) < 0) {
|
|
- error_setg_errno(errp, EPROTO, "vhost_get_config failed");
|
|
- return -EPROTO;
|
|
+ ret = vhost_user_write(dev, &msg, NULL, 0);
|
|
+ if (ret < 0) {
|
|
+ error_setg_errno(errp, -ret, "vhost_get_config failed");
|
|
+ return ret;
|
|
}
|
|
|
|
- if (vhost_user_read(dev, &msg) < 0) {
|
|
- error_setg_errno(errp, EPROTO, "vhost_get_config failed");
|
|
- return -EPROTO;
|
|
+ ret = vhost_user_read(dev, &msg);
|
|
+ if (ret < 0) {
|
|
+ error_setg_errno(errp, -ret, "vhost_get_config failed");
|
|
+ return ret;
|
|
}
|
|
|
|
if (msg.hdr.request != VHOST_USER_GET_CONFIG) {
|
|
error_setg(errp,
|
|
"Received unexpected msg type. Expected %d received %d",
|
|
VHOST_USER_GET_CONFIG, msg.hdr.request);
|
|
- return -EINVAL;
|
|
+ return -EPROTO;
|
|
}
|
|
|
|
if (msg.hdr.size != VHOST_USER_CONFIG_HDR_SIZE + config_len) {
|
|
error_setg(errp, "Received bad msg size.");
|
|
- return -EINVAL;
|
|
+ return -EPROTO;
|
|
}
|
|
|
|
memcpy(config, msg.payload.config.region, config_len);
|
|
@@ -2259,6 +2295,7 @@ static int vhost_user_get_config(struct vhost_dev *dev, uint8_t *config,
|
|
static int vhost_user_set_config(struct vhost_dev *dev, const uint8_t *data,
|
|
uint32_t offset, uint32_t size, uint32_t flags)
|
|
{
|
|
+ int ret;
|
|
uint8_t *p;
|
|
bool reply_supported = virtio_has_feature(dev->protocol_features,
|
|
VHOST_USER_PROTOCOL_F_REPLY_ACK);
|
|
@@ -2271,7 +2308,7 @@ static int vhost_user_set_config(struct vhost_dev *dev, const uint8_t *data,
|
|
|
|
if (!virtio_has_feature(dev->protocol_features,
|
|
VHOST_USER_PROTOCOL_F_CONFIG)) {
|
|
- return -1;
|
|
+ return -ENOTSUP;
|
|
}
|
|
|
|
if (reply_supported) {
|
|
@@ -2279,7 +2316,7 @@ static int vhost_user_set_config(struct vhost_dev *dev, const uint8_t *data,
|
|
}
|
|
|
|
if (size > VHOST_USER_MAX_CONFIG_SIZE) {
|
|
- return -1;
|
|
+ return -EINVAL;
|
|
}
|
|
|
|
msg.payload.config.offset = offset,
|
|
@@ -2288,8 +2325,9 @@ static int vhost_user_set_config(struct vhost_dev *dev, const uint8_t *data,
|
|
p = msg.payload.config.region;
|
|
memcpy(p, data, size);
|
|
|
|
- if (vhost_user_write(dev, &msg, NULL, 0) < 0) {
|
|
- return -1;
|
|
+ ret = vhost_user_write(dev, &msg, NULL, 0);
|
|
+ if (ret < 0) {
|
|
+ return ret;
|
|
}
|
|
|
|
if (reply_supported) {
|
|
@@ -2303,6 +2341,7 @@ static int vhost_user_crypto_create_session(struct vhost_dev *dev,
|
|
void *session_info,
|
|
uint64_t *session_id)
|
|
{
|
|
+ int ret;
|
|
bool crypto_session = virtio_has_feature(dev->protocol_features,
|
|
VHOST_USER_PROTOCOL_F_CRYPTO_SESSION);
|
|
CryptoDevBackendSymSessionInfo *sess_info = session_info;
|
|
@@ -2316,7 +2355,7 @@ static int vhost_user_crypto_create_session(struct vhost_dev *dev,
|
|
|
|
if (!crypto_session) {
|
|
error_report("vhost-user trying to send unhandled ioctl");
|
|
- return -1;
|
|
+ return -ENOTSUP;
|
|
}
|
|
|
|
memcpy(&msg.payload.session.session_setup_data, sess_info,
|
|
@@ -2329,31 +2368,35 @@ static int vhost_user_crypto_create_session(struct vhost_dev *dev,
|
|
memcpy(&msg.payload.session.auth_key, sess_info->auth_key,
|
|
sess_info->auth_key_len);
|
|
}
|
|
- if (vhost_user_write(dev, &msg, NULL, 0) < 0) {
|
|
- error_report("vhost_user_write() return -1, create session failed");
|
|
- return -1;
|
|
+ ret = vhost_user_write(dev, &msg, NULL, 0);
|
|
+ if (ret < 0) {
|
|
+ error_report("vhost_user_write() return %d, create session failed",
|
|
+ ret);
|
|
+ return ret;
|
|
}
|
|
|
|
- if (vhost_user_read(dev, &msg) < 0) {
|
|
- error_report("vhost_user_read() return -1, create session failed");
|
|
- return -1;
|
|
+ ret = vhost_user_read(dev, &msg);
|
|
+ if (ret < 0) {
|
|
+ error_report("vhost_user_read() return %d, create session failed",
|
|
+ ret);
|
|
+ return ret;
|
|
}
|
|
|
|
if (msg.hdr.request != VHOST_USER_CREATE_CRYPTO_SESSION) {
|
|
error_report("Received unexpected msg type. Expected %d received %d",
|
|
VHOST_USER_CREATE_CRYPTO_SESSION, msg.hdr.request);
|
|
- return -1;
|
|
+ return -EPROTO;
|
|
}
|
|
|
|
if (msg.hdr.size != sizeof(msg.payload.session)) {
|
|
error_report("Received bad msg size.");
|
|
- return -1;
|
|
+ return -EPROTO;
|
|
}
|
|
|
|
if (msg.payload.session.session_id < 0) {
|
|
error_report("Bad session id: %" PRId64 "",
|
|
msg.payload.session.session_id);
|
|
- return -1;
|
|
+ return -EINVAL;
|
|
}
|
|
*session_id = msg.payload.session.session_id;
|
|
|
|
@@ -2363,6 +2406,7 @@ static int vhost_user_crypto_create_session(struct vhost_dev *dev,
|
|
static int
|
|
vhost_user_crypto_close_session(struct vhost_dev *dev, uint64_t session_id)
|
|
{
|
|
+ int ret;
|
|
bool crypto_session = virtio_has_feature(dev->protocol_features,
|
|
VHOST_USER_PROTOCOL_F_CRYPTO_SESSION);
|
|
VhostUserMsg msg = {
|
|
@@ -2374,12 +2418,14 @@ vhost_user_crypto_close_session(struct vhost_dev *dev, uint64_t session_id)
|
|
|
|
if (!crypto_session) {
|
|
error_report("vhost-user trying to send unhandled ioctl");
|
|
- return -1;
|
|
+ return -ENOTSUP;
|
|
}
|
|
|
|
- if (vhost_user_write(dev, &msg, NULL, 0) < 0) {
|
|
- error_report("vhost_user_write() return -1, close session failed");
|
|
- return -1;
|
|
+ ret = vhost_user_write(dev, &msg, NULL, 0);
|
|
+ if (ret < 0) {
|
|
+ error_report("vhost_user_write() return %d, close session failed",
|
|
+ ret);
|
|
+ return ret;
|
|
}
|
|
|
|
return 0;
|
|
@@ -2401,6 +2447,7 @@ static int vhost_user_get_inflight_fd(struct vhost_dev *dev,
|
|
{
|
|
void *addr;
|
|
int fd;
|
|
+ int ret;
|
|
struct vhost_user *u = dev->opaque;
|
|
CharBackend *chr = u->user->chr;
|
|
VhostUserMsg msg = {
|
|
@@ -2416,24 +2463,26 @@ static int vhost_user_get_inflight_fd(struct vhost_dev *dev,
|
|
return 0;
|
|
}
|
|
|
|
- if (vhost_user_write(dev, &msg, NULL, 0) < 0) {
|
|
- return -1;
|
|
+ ret = vhost_user_write(dev, &msg, NULL, 0);
|
|
+ if (ret < 0) {
|
|
+ return ret;
|
|
}
|
|
|
|
- if (vhost_user_read(dev, &msg) < 0) {
|
|
- return -1;
|
|
+ ret = vhost_user_read(dev, &msg);
|
|
+ if (ret < 0) {
|
|
+ return ret;
|
|
}
|
|
|
|
if (msg.hdr.request != VHOST_USER_GET_INFLIGHT_FD) {
|
|
error_report("Received unexpected msg type. "
|
|
"Expected %d received %d",
|
|
VHOST_USER_GET_INFLIGHT_FD, msg.hdr.request);
|
|
- return -1;
|
|
+ return -EPROTO;
|
|
}
|
|
|
|
if (msg.hdr.size != sizeof(msg.payload.inflight)) {
|
|
error_report("Received bad msg size.");
|
|
- return -1;
|
|
+ return -EPROTO;
|
|
}
|
|
|
|
if (!msg.payload.inflight.mmap_size) {
|
|
@@ -2443,7 +2492,7 @@ static int vhost_user_get_inflight_fd(struct vhost_dev *dev,
|
|
fd = qemu_chr_fe_get_msgfd(chr);
|
|
if (fd < 0) {
|
|
error_report("Failed to get mem fd");
|
|
- return -1;
|
|
+ return -EIO;
|
|
}
|
|
|
|
addr = mmap(0, msg.payload.inflight.mmap_size, PROT_READ | PROT_WRITE,
|
|
@@ -2452,7 +2501,7 @@ static int vhost_user_get_inflight_fd(struct vhost_dev *dev,
|
|
if (addr == MAP_FAILED) {
|
|
error_report("Failed to mmap mem fd");
|
|
close(fd);
|
|
- return -1;
|
|
+ return -EFAULT;
|
|
}
|
|
|
|
inflight->addr = addr;
|
|
@@ -2482,11 +2531,7 @@ static int vhost_user_set_inflight_fd(struct vhost_dev *dev,
|
|
return 0;
|
|
}
|
|
|
|
- if (vhost_user_write(dev, &msg, &inflight->fd, 1) < 0) {
|
|
- return -1;
|
|
- }
|
|
-
|
|
- return 0;
|
|
+ return vhost_user_write(dev, &msg, &inflight->fd, 1);
|
|
}
|
|
|
|
bool vhost_user_init(VhostUserState *user, CharBackend *chr, Error **errp)
|
|
--
|
|
2.27.0
|
|
|