aboutsummaryrefslogtreecommitdiff
path: root/hw
diff options
context:
space:
mode:
authorPeter Maydell <peter.maydell@linaro.org>2021-08-27 09:57:28 +0100
committerPeter Maydell <peter.maydell@linaro.org>2021-08-27 09:57:28 +0100
commit0289f62335b2af49f6c30296cc00d009995b35f6 (patch)
tree02681ec7cfe183e7db19e53785acd4dd69e37f00 /hw
parentf214d8e0150766c31172e16ef4b17674f549d852 (diff)
parentf9dfae9cb6b27649085f662a863f6167650402e0 (diff)
downloadqemu-0289f62335b2af49f6c30296cc00d009995b35f6.zip
qemu-0289f62335b2af49f6c30296cc00d009995b35f6.tar.gz
qemu-0289f62335b2af49f6c30296cc00d009995b35f6.tar.bz2
Merge remote-tracking branch 'remotes/armbru/tags/pull-error-2021-08-26' into staging
Error reporting patches for 2021-08-26 # gpg: Signature made Thu 26 Aug 2021 16:17:05 BST # gpg: using RSA key 354BC8B3D7EB2A6B68674E5F3870B400EB918653 # gpg: issuer "armbru@redhat.com" # gpg: Good signature from "Markus Armbruster <armbru@redhat.com>" [full] # gpg: aka "Markus Armbruster <armbru@pond.sub.org>" [full] # Primary key fingerprint: 354B C8B3 D7EB 2A6B 6867 4E5F 3870 B400 EB91 8653 * remotes/armbru/tags/pull-error-2021-08-26: vl: Clean up -smp error handling Remove superfluous ERRP_GUARD() vhost: Clean up how VhostOpts method vhost_backend_init() fails vhost: Clean up how VhostOpts method vhost_get_config() fails microvm: Drop dead error handling in microvm_machine_state_init() migration: Handle migration_incoming_setup() errors consistently migration: Unify failure check for migrate_add_blocker() whpx nvmm: Drop useless migrate_del_blocker() vfio: Avoid error_propagate() after migrate_add_blocker() i386: Never free migration blocker objects instead of sometimes vhost-scsi: Plug memory leak on migrate_add_blocker() failure multi-process: Fix pci_proxy_dev_realize() error handling spapr: Explain purpose of ->fwnmi_migration_blocker more clearly spapr: Plug memory leak when we can't add a migration blocker error: Use error_fatal to simplify obvious fatal errors (again) Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Diffstat (limited to 'hw')
-rw-r--r--hw/i386/microvm.c5
-rw-r--r--hw/ppc/spapr_events.c20
-rw-r--r--hw/remote/mpqemu-link.c3
-rw-r--r--hw/remote/proxy.c10
-rw-r--r--hw/s390x/ipl.c6
-rw-r--r--hw/scsi/vhost-scsi.c4
-rw-r--r--hw/vfio/migration.c6
-rw-r--r--hw/virtio/vhost-user.c8
-rw-r--r--hw/virtio/vhost.c16
9 files changed, 35 insertions, 43 deletions
diff --git a/hw/i386/microvm.c b/hw/i386/microvm.c
index aba0c83..f257ec5 100644
--- a/hw/i386/microvm.c
+++ b/hw/i386/microvm.c
@@ -458,15 +458,10 @@ static void microvm_machine_state_init(MachineState *machine)
{
MicrovmMachineState *mms = MICROVM_MACHINE(machine);
X86MachineState *x86ms = X86_MACHINE(machine);
- Error *local_err = NULL;
microvm_memory_init(mms);
x86_cpus_init(x86ms, CPU_VERSION_LATEST);
- if (local_err) {
- error_report_err(local_err);
- exit(1);
- }
microvm_devices_init(mms);
}
diff --git a/hw/ppc/spapr_events.c b/hw/ppc/spapr_events.c
index 23e2e2f..630e862 100644
--- a/hw/ppc/spapr_events.c
+++ b/hw/ppc/spapr_events.c
@@ -872,7 +872,6 @@ void spapr_mce_req_event(PowerPCCPU *cpu, bool recovered)
SpaprMachineState *spapr = SPAPR_MACHINE(qdev_get_machine());
CPUState *cs = CPU(cpu);
int ret;
- Error *local_err = NULL;
if (spapr->fwnmi_machine_check_addr == -1) {
/* Non-FWNMI case, deliver it like an architected CPU interrupt. */
@@ -912,16 +911,17 @@ void spapr_mce_req_event(PowerPCCPU *cpu, bool recovered)
}
}
- ret = migrate_add_blocker(spapr->fwnmi_migration_blocker, &local_err);
+ /*
+ * Try to block migration while FWNMI is being handled, so the
+ * machine check handler runs where the information passed to it
+ * actually makes sense. This shouldn't actually block migration,
+ * only delay it slightly, assuming migration is retried. If the
+ * attempt to block fails, carry on. Unfortunately, it always
+ * fails when running with -only-migrate. A proper interface to
+ * delay migration completion for a bit could avoid that.
+ */
+ ret = migrate_add_blocker(spapr->fwnmi_migration_blocker, NULL);
if (ret == -EBUSY) {
- /*
- * We don't want to abort so we let the migration to continue.
- * In a rare case, the machine check handler will run on the target.
- * Though this is not preferable, it is better than aborting
- * the migration or killing the VM. It is okay to call
- * migrate_del_blocker on a blocker that was not added (which the
- * nmi-interlock handler would do when it's called after this).
- */
warn_report("Received a fwnmi while migration was in progress");
}
diff --git a/hw/remote/mpqemu-link.c b/hw/remote/mpqemu-link.c
index e67a5de..7e84182 100644
--- a/hw/remote/mpqemu-link.c
+++ b/hw/remote/mpqemu-link.c
@@ -34,7 +34,6 @@
*/
bool mpqemu_msg_send(MPQemuMsg *msg, QIOChannel *ioc, Error **errp)
{
- ERRP_GUARD();
bool iolock = qemu_mutex_iothread_locked();
bool iothread = qemu_in_iothread();
struct iovec send[2] = {};
@@ -97,7 +96,6 @@ bool mpqemu_msg_send(MPQemuMsg *msg, QIOChannel *ioc, Error **errp)
static ssize_t mpqemu_read(QIOChannel *ioc, void *buf, size_t len, int **fds,
size_t *nfds, Error **errp)
{
- ERRP_GUARD();
struct iovec iov = { .iov_base = buf, .iov_len = len };
bool iolock = qemu_mutex_iothread_locked();
bool iothread = qemu_in_iothread();
@@ -192,7 +190,6 @@ fail:
uint64_t mpqemu_msg_send_and_await_reply(MPQemuMsg *msg, PCIProxyDev *pdev,
Error **errp)
{
- ERRP_GUARD();
MPQemuMsg msg_reply = {0};
uint64_t ret = UINT64_MAX;
diff --git a/hw/remote/proxy.c b/hw/remote/proxy.c
index 6dda705..499f540 100644
--- a/hw/remote/proxy.c
+++ b/hw/remote/proxy.c
@@ -102,10 +102,18 @@ static void pci_proxy_dev_realize(PCIDevice *device, Error **errp)
}
dev->ioc = qio_channel_new_fd(fd, errp);
+ if (!dev->ioc) {
+ close(fd);
+ return;
+ }
error_setg(&dev->migration_blocker, "%s does not support migration",
TYPE_PCI_PROXY_DEV);
- migrate_add_blocker(dev->migration_blocker, errp);
+ if (migrate_add_blocker(dev->migration_blocker, errp) < 0) {
+ error_free(dev->migration_blocker);
+ object_unref(dev->ioc);
+ return;
+ }
qemu_mutex_init(&dev->io_mutex);
qio_channel_set_blocking(dev->ioc, true, NULL);
diff --git a/hw/s390x/ipl.c b/hw/s390x/ipl.c
index 8c863cf..1821c6f 100644
--- a/hw/s390x/ipl.c
+++ b/hw/s390x/ipl.c
@@ -711,7 +711,6 @@ int s390_ipl_pv_unpack(void)
void s390_ipl_prepare_cpu(S390CPU *cpu)
{
S390IPLState *ipl = get_ipl_device();
- Error *err = NULL;
cpu->env.psw.addr = ipl->start_addr;
cpu->env.psw.mask = IPL_PSW_MASK;
@@ -723,10 +722,7 @@ void s390_ipl_prepare_cpu(S390CPU *cpu)
}
}
if (ipl->netboot) {
- if (load_netboot_image(&err) < 0) {
- error_report_err(err);
- exit(1);
- }
+ load_netboot_image(&error_fatal);
ipl->qipl.netboot_start_addr = cpu_to_be64(ipl->start_addr);
}
s390_ipl_set_boot_menu(ipl);
diff --git a/hw/scsi/vhost-scsi.c b/hw/scsi/vhost-scsi.c
index 8c611bf..039caf2 100644
--- a/hw/scsi/vhost-scsi.c
+++ b/hw/scsi/vhost-scsi.c
@@ -208,7 +208,6 @@ static void vhost_scsi_realize(DeviceState *dev, Error **errp)
"target SCSI device state or use shared storage over network), "
"set 'migratable' property to true to enable migration.");
if (migrate_add_blocker(vsc->migration_blocker, errp) < 0) {
- error_free(vsc->migration_blocker);
goto free_virtio;
}
}
@@ -233,11 +232,12 @@ static void vhost_scsi_realize(DeviceState *dev, Error **errp)
return;
free_vqs:
+ g_free(vsc->dev.vqs);
if (!vsc->migratable) {
migrate_del_blocker(vsc->migration_blocker);
}
- g_free(vsc->dev.vqs);
free_virtio:
+ error_free(vsc->migration_blocker);
virtio_scsi_common_unrealize(dev);
close_fd:
close(vhostfd);
diff --git a/hw/vfio/migration.c b/hw/vfio/migration.c
index 82f654a..ff6b45d 100644
--- a/hw/vfio/migration.c
+++ b/hw/vfio/migration.c
@@ -858,7 +858,6 @@ int vfio_migration_probe(VFIODevice *vbasedev, Error **errp)
{
VFIOContainer *container = vbasedev->group->container;
struct vfio_region_info *info = NULL;
- Error *local_err = NULL;
int ret = -ENOTSUP;
if (!vbasedev->enable_migration || !container->dirty_pages_supported) {
@@ -885,9 +884,8 @@ add_blocker:
"VFIO device doesn't support migration");
g_free(info);
- ret = migrate_add_blocker(vbasedev->migration_blocker, &local_err);
- if (local_err) {
- error_propagate(errp, local_err);
+ ret = migrate_add_blocker(vbasedev->migration_blocker, errp);
+ if (ret < 0) {
error_free(vbasedev->migration_blocker);
vbasedev->migration_blocker = NULL;
}
diff --git a/hw/virtio/vhost-user.c b/hw/virtio/vhost-user.c
index aec6cc1..2407836 100644
--- a/hw/virtio/vhost-user.c
+++ b/hw/virtio/vhost-user.c
@@ -1876,6 +1876,7 @@ static int vhost_user_backend_init(struct vhost_dev *dev, void *opaque,
err = vhost_user_get_features(dev, &features);
if (err < 0) {
+ error_setg_errno(errp, -err, "vhost_backend_init failed");
return err;
}
@@ -1885,6 +1886,7 @@ static int vhost_user_backend_init(struct vhost_dev *dev, void *opaque,
err = vhost_user_get_u64(dev, VHOST_USER_GET_PROTOCOL_FEATURES,
&protocol_features);
if (err < 0) {
+ error_setg_errno(errp, EPROTO, "vhost_backend_init failed");
return -EPROTO;
}
@@ -1903,6 +1905,7 @@ static int vhost_user_backend_init(struct vhost_dev *dev, void *opaque,
err = vhost_user_set_protocol_features(dev, dev->protocol_features);
if (err < 0) {
+ error_setg_errno(errp, EPROTO, "vhost_backend_init failed");
return -EPROTO;
}
@@ -1911,6 +1914,7 @@ static int vhost_user_backend_init(struct vhost_dev *dev, void *opaque,
err = vhost_user_get_u64(dev, VHOST_USER_GET_QUEUE_NUM,
&dev->max_queues);
if (err < 0) {
+ error_setg_errno(errp, EPROTO, "vhost_backend_init failed");
return -EPROTO;
}
} else {
@@ -1940,6 +1944,7 @@ static int vhost_user_backend_init(struct vhost_dev *dev, void *opaque,
} else {
err = vhost_user_get_max_memslots(dev, &ram_slots);
if (err < 0) {
+ error_setg_errno(errp, EPROTO, "vhost_backend_init failed");
return -EPROTO;
}
@@ -1966,6 +1971,7 @@ static int vhost_user_backend_init(struct vhost_dev *dev, void *opaque,
if (dev->vq_index == 0) {
err = vhost_setup_slave_channel(dev);
if (err < 0) {
+ error_setg_errno(errp, EPROTO, "vhost_backend_init failed");
return -EPROTO;
}
}
@@ -2139,10 +2145,12 @@ 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;
}
if (vhost_user_read(dev, &msg) < 0) {
+ error_setg_errno(errp, EPROTO, "vhost_get_config failed");
return -EPROTO;
}
diff --git a/hw/virtio/vhost.c b/hw/virtio/vhost.c
index e8f85a5..3c0b537 100644
--- a/hw/virtio/vhost.c
+++ b/hw/virtio/vhost.c
@@ -1289,7 +1289,6 @@ int vhost_dev_init(struct vhost_dev *hdev, void *opaque,
VhostBackendType backend_type, uint32_t busyloop_timeout,
Error **errp)
{
- ERRP_GUARD();
uint64_t features;
int i, r, n_initialized_vqs = 0;
@@ -1301,9 +1300,6 @@ int vhost_dev_init(struct vhost_dev *hdev, void *opaque,
r = hdev->vhost_ops->vhost_backend_init(hdev, opaque, errp);
if (r < 0) {
- if (!*errp) {
- error_setg_errno(errp, -r, "vhost_backend_init failed");
- }
goto fail;
}
@@ -1372,7 +1368,7 @@ int vhost_dev_init(struct vhost_dev *hdev, void *opaque,
if (hdev->migration_blocker != NULL) {
r = migrate_add_blocker(hdev->migration_blocker, errp);
- if (*errp) {
+ if (r < 0) {
error_free(hdev->migration_blocker);
goto fail_busyloop;
}
@@ -1564,17 +1560,11 @@ void vhost_ack_features(struct vhost_dev *hdev, const int *feature_bits,
int vhost_dev_get_config(struct vhost_dev *hdev, uint8_t *config,
uint32_t config_len, Error **errp)
{
- ERRP_GUARD();
- int ret;
-
assert(hdev->vhost_ops);
if (hdev->vhost_ops->vhost_get_config) {
- ret = hdev->vhost_ops->vhost_get_config(hdev, config, config_len, errp);
- if (ret < 0 && !*errp) {
- error_setg_errno(errp, -ret, "vhost_get_config failed");
- }
- return ret;
+ return hdev->vhost_ops->vhost_get_config(hdev, config, config_len,
+ errp);
}
error_setg(errp, "vhost_get_config not implemented");