Browse Source

Error reporting patches for 2025-09-30

-----BEGIN PGP SIGNATURE-----
 
 iQJGBAABCAAwFiEENUvIs9frKmtoZ05fOHC0AOuRhlMFAmjczNQSHGFybWJydUBy
 ZWRoYXQuY29tAAoJEDhwtADrkYZTX3kP/1doayteIqVfNLYJn8EDIU6ccZgAsdVw
 GLHkxSikaBBzjJoG2ebadGusmX8F5H16/KG4vpilP1WHuIw73QRiCFJduFmfFjU/
 SCagaj58PPZaiNJeydN8dSHIDyLLAbIpI1xqdFObBgVKl37E7nZ2uatjKwopmK69
 iV7y39Xcs6wu4gVsz5IH3FC+CdzctWfjjkZbkk3PeNj+Nt7q22RvbB0Rf30P9SBo
 FWnh3UEDz2VIlnuIFSAAXQfJ0+h2l9L0yZ05RnVyMM8rZ72v393X8h/jgEo0ETHI
 eNnJHh/pKL6I+vq10aM/mMgj5fRsly+CsAmjC+11ULg7ybDUMbEU32Ftqeylo2HS
 ZkGw20egEgzMldC5yELTgTjMPCGF9VWWwNNH9OWM58w9ZCyjDb9wDw1uaHU3Tc15
 TZaBwcCGEc/atRFHfWD66oK/KcDrFnWETr6qi9fPJ2SJxiHjHbJe/eNQaxxrEZCu
 1OntcQdL46Ef1LeQGzhgLNlKyAxq9V9ybh8gPD4yhCK5NCNub2NvWj/CLlnxGJwH
 JHZRRXvVoBPlIMSMydGPV8RHkfUr4NMgHql5Y+VykheEBcg+ThZ2JSjS7avwzCHM
 5dSUeV+YcvhQN2sojH4xdnUUJWxAAEM1SirkaHTHWZoDKagfjHu3SEYwNyIIchhi
 BAfRdd94Lxpg
 =tlEf
 -----END PGP SIGNATURE-----

Merge tag 'pull-error-2025-09-30-v2' of https://repo.or.cz/qemu/armbru into staging

Error reporting patches for 2025-09-30

# -----BEGIN PGP SIGNATURE-----
#
# iQJGBAABCAAwFiEENUvIs9frKmtoZ05fOHC0AOuRhlMFAmjczNQSHGFybWJydUBy
# ZWRoYXQuY29tAAoJEDhwtADrkYZTX3kP/1doayteIqVfNLYJn8EDIU6ccZgAsdVw
# GLHkxSikaBBzjJoG2ebadGusmX8F5H16/KG4vpilP1WHuIw73QRiCFJduFmfFjU/
# SCagaj58PPZaiNJeydN8dSHIDyLLAbIpI1xqdFObBgVKl37E7nZ2uatjKwopmK69
# iV7y39Xcs6wu4gVsz5IH3FC+CdzctWfjjkZbkk3PeNj+Nt7q22RvbB0Rf30P9SBo
# FWnh3UEDz2VIlnuIFSAAXQfJ0+h2l9L0yZ05RnVyMM8rZ72v393X8h/jgEo0ETHI
# eNnJHh/pKL6I+vq10aM/mMgj5fRsly+CsAmjC+11ULg7ybDUMbEU32Ftqeylo2HS
# ZkGw20egEgzMldC5yELTgTjMPCGF9VWWwNNH9OWM58w9ZCyjDb9wDw1uaHU3Tc15
# TZaBwcCGEc/atRFHfWD66oK/KcDrFnWETr6qi9fPJ2SJxiHjHbJe/eNQaxxrEZCu
# 1OntcQdL46Ef1LeQGzhgLNlKyAxq9V9ybh8gPD4yhCK5NCNub2NvWj/CLlnxGJwH
# JHZRRXvVoBPlIMSMydGPV8RHkfUr4NMgHql5Y+VykheEBcg+ThZ2JSjS7avwzCHM
# 5dSUeV+YcvhQN2sojH4xdnUUJWxAAEM1SirkaHTHWZoDKagfjHu3SEYwNyIIchhi
# BAfRdd94Lxpg
# =tlEf
# -----END PGP SIGNATURE-----
# gpg: Signature made Tue 30 Sep 2025 11:40:20 PM PDT
# gpg:                using RSA key 354BC8B3D7EB2A6B68674E5F3870B400EB918653
# gpg:                issuer "armbru@redhat.com"
# gpg: Good signature from "Markus Armbruster <armbru@redhat.com>" [unknown]
# gpg:                 aka "Markus Armbruster <armbru@pond.sub.org>" [unknown]
# gpg: WARNING: The key's User ID is not certified with a trusted signature!
# gpg:          There is no indication that the signature belongs to the owner.
# Primary key fingerprint: 354B C8B3 D7EB 2A6B 6867  4E5F 3870 B400 EB91 8653

* tag 'pull-error-2025-09-30-v2' of https://repo.or.cz/qemu/armbru:
  error: Kill @error_warn
  ivshmem-flat: Mark an instance of missing error handling FIXME
  ui/dbus: Consistent handling of texture mutex failure
  ui/dbus: Clean up dbus_update_gl_cb() error checking
  ui/pixman: Consistent error handling in qemu_pixman_shareable_free()
  util/oslib-win32: Do not treat null @errp as &error_warn
  ui/spice-core: Clean up error reporting
  net/slirp: Clean up error reporting
  hw/remote/vfio-user: Clean up error reporting
  migration/cpr: Clean up error reporting in cpr_resave_fd()
  hw/cxl: Convert cxl_fmws_link() to Error
  tcg: Fix error reporting on mprotect() failure in tcg_region_init()
  monitor: Clean up HMP gdbserver error reporting

Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
pull/305/head
Richard Henderson 6 months ago
parent
commit
f665537f15
  1. 7
      hw/cxl/cxl-host.c
  2. 8
      hw/display/virtio-gpu.c
  3. 8
      hw/misc/ivshmem-flat.c
  4. 8
      hw/net/virtio-net.c
  5. 13
      hw/remote/vfio-user-obj.c
  6. 3
      include/exec/gdbstub.h
  7. 6
      include/qapi/error.h
  8. 5
      include/system/os-win32.h
  9. 4
      io/channel-socket.c
  10. 6
      io/channel-watch.c
  11. 9
      migration/cpr.c
  12. 7
      monitor/hmp-cmds.c
  13. 9
      net/slirp.c
  14. 7
      tcg/region.c
  15. 17
      tests/unit/test-error-report.c
  16. 22
      ui/dbus-listener.c
  17. 6
      ui/gtk.c
  18. 5
      ui/qemu-pixman.c
  19. 6
      ui/spice-core.c
  20. 2
      util/aio-win32.c
  21. 5
      util/error.c
  22. 25
      util/oslib-win32.c

7
hw/cxl/cxl-host.c

@ -72,6 +72,7 @@ static void cxl_fixed_memory_window_config(CXLFixedMemoryWindowOptions *object,
static int cxl_fmws_link(Object *obj, void *opaque)
{
Error **errp = opaque;
struct CXLFixedWindow *fw;
int i;
@ -87,9 +88,9 @@ static int cxl_fmws_link(Object *obj, void *opaque)
o = object_resolve_path_type(fw->targets[i], TYPE_PXB_CXL_DEV,
&ambig);
if (!o) {
error_setg(&error_fatal, "Could not resolve CXLFM target %s",
error_setg(errp, "Could not resolve CXLFM target %s",
fw->targets[i]);
return 1;
return -1;
}
fw->target_hbs[i] = PXB_CXL_DEV(o);
}
@ -99,7 +100,7 @@ static int cxl_fmws_link(Object *obj, void *opaque)
void cxl_fmws_link_targets(Error **errp)
{
/* Order doesn't matter for this, so no need to build list */
object_child_foreach_recursive(object_get_root(), cxl_fmws_link, NULL);
object_child_foreach_recursive(object_get_root(), cxl_fmws_link, errp);
}
static bool cxl_hdm_find_target(uint32_t *cache_mem, hwaddr addr,

8
hw/display/virtio-gpu.c

@ -242,6 +242,7 @@ static uint32_t calc_image_hostmem(pixman_format_code_t pformat,
static void virtio_gpu_resource_create_2d(VirtIOGPU *g,
struct virtio_gpu_ctrl_command *cmd)
{
Error *err = NULL;
pixman_format_code_t pformat;
struct virtio_gpu_simple_resource *res;
struct virtio_gpu_resource_create_2d c2d;
@ -293,7 +294,8 @@ static void virtio_gpu_resource_create_2d(VirtIOGPU *g,
c2d.width,
c2d.height,
c2d.height ? res->hostmem / c2d.height : 0,
&error_warn)) {
&err)) {
warn_report_err(err);
goto end;
}
}
@ -1282,6 +1284,7 @@ static int virtio_gpu_load(QEMUFile *f, void *opaque, size_t size,
const VMStateField *field)
{
VirtIOGPU *g = opaque;
Error *err = NULL;
struct virtio_gpu_simple_resource *res;
uint32_t resource_id, pformat;
int i;
@ -1317,7 +1320,8 @@ static int virtio_gpu_load(QEMUFile *f, void *opaque, size_t size,
res->width,
res->height,
res->height ? res->hostmem / res->height : 0,
&error_warn)) {
&err)) {
warn_report_err(err);
g_free(res);
return -EINVAL;
}

8
hw/misc/ivshmem-flat.c

@ -138,6 +138,8 @@ static void ivshmem_flat_remove_peer(IvshmemFTState *s, uint16_t peer_id)
static void ivshmem_flat_add_vector(IvshmemFTState *s, IvshmemPeer *peer,
int vector_fd)
{
Error *err = NULL;
if (peer->vector_counter >= IVSHMEM_MAX_VECTOR_NUM) {
trace_ivshmem_flat_add_vector_failure(peer->vector_counter,
vector_fd, peer->id);
@ -154,8 +156,10 @@ static void ivshmem_flat_add_vector(IvshmemFTState *s, IvshmemPeer *peer,
* peer.
*/
peer->vector[peer->vector_counter].id = peer->vector_counter;
/* WARNING: qemu_socket_set_nonblock() return code ignored */
qemu_set_blocking(vector_fd, false, &error_warn);
if (!qemu_set_blocking(vector_fd, false, &err)) {
/* FIXME handle the error */
warn_report_err(err);
}
event_notifier_init_fd(&peer->vector[peer->vector_counter].event_notifier,
vector_fd);

8
hw/net/virtio-net.c

@ -1289,6 +1289,8 @@ exit:
static bool virtio_net_load_ebpf(VirtIONet *n, Error **errp)
{
Error *err = NULL;
if (!virtio_net_attach_ebpf_to_backend(n->nic, -1)) {
return true;
}
@ -1306,7 +1308,11 @@ static bool virtio_net_load_ebpf(VirtIONet *n, Error **errp)
return virtio_net_load_ebpf_fds(n, errp);
}
ebpf_rss_load(&n->ebpf_rss, &error_warn);
ebpf_rss_load(&n->ebpf_rss, &err);
/* Beware, ebpf_rss_load() can return false with @err unset */
if (err) {
warn_report_err(err);
}
return true;
}

13
hw/remote/vfio-user-obj.c

@ -75,12 +75,17 @@ OBJECT_DECLARE_TYPE(VfuObject, VfuObjectClass, VFU_OBJECT)
*/
#define VFU_OBJECT_ERROR(o, fmt, ...) \
{ \
error_report((fmt), ## __VA_ARGS__); \
if (vfu_object_auto_shutdown()) { \
error_setg(&error_abort, (fmt), ## __VA_ARGS__); \
} else { \
error_report((fmt), ## __VA_ARGS__); \
/* \
* FIXME This looks inappropriate. The error is serious \
* enough programming error to warrant aborting the process \
* when auto-shutdown is enabled, yet harmless enough to \
* permit carrying on when it's disabled. Makes no sense. \
*/ \
abort(); \
} \
} \
}
struct VfuObjectClass {
ObjectClass parent_class;

3
include/exec/gdbstub.h

@ -55,9 +55,6 @@ void gdb_unregister_coprocessor_all(CPUState *cpu);
* system emulation you can use a full chardev spec for your gdbserver
* port.
*
* The error handle should be either &error_fatal (for start-up) or
* &error_warn (for QMP/HMP initiated sessions).
*
* Returns true when server successfully started.
*/
bool gdbserver_start(const char *port_or_device, Error **errp);

6
include/qapi/error.h

@ -533,12 +533,6 @@ static inline void error_propagator_cleanup(ErrorPropagator *prop)
G_DEFINE_AUTO_CLEANUP_CLEAR_FUNC(ErrorPropagator, error_propagator_cleanup);
/*
* Special error destination to warn on error.
* See error_setg() and error_propagate() for details.
*/
extern Error *error_warn;
/*
* Special error destination to abort on error.
* See error_setg() and error_propagate() for details.

5
include/system/os-win32.h

@ -168,11 +168,14 @@ static inline void qemu_funlockfile(FILE *f)
#endif
}
/* Helper for WSAEventSelect, to report errors */
/* Helpers for WSAEventSelect() */
bool qemu_socket_select(int sockfd, WSAEVENT hEventObject,
long lNetworkEvents, Error **errp);
void qemu_socket_select_nofail(int sockfd, WSAEVENT hEventObject,
long lNetworkEvents);
bool qemu_socket_unselect(int sockfd, Error **errp);
void qemu_socket_unselect_nofail(int sockfd);
/* We wrap all the sockets functions so that we can set errno based on
* WSAGetLastError(), and use file-descriptors instead of SOCKET.

4
io/channel-socket.c

@ -454,7 +454,7 @@ static void qio_channel_socket_finalize(Object *obj)
}
}
#ifdef WIN32
qemu_socket_unselect(ioc->fd, NULL);
qemu_socket_unselect_nofail(ioc->fd);
#endif
close(ioc->fd);
ioc->fd = -1;
@ -929,7 +929,7 @@ qio_channel_socket_close(QIOChannel *ioc,
if (sioc->fd != -1) {
#ifdef WIN32
qemu_socket_unselect(sioc->fd, NULL);
qemu_socket_unselect_nofail(sioc->fd);
#endif
if (qio_channel_has_feature(ioc, QIO_CHANNEL_FEATURE_LISTEN)) {
socket_listen_cleanup(sioc->fd, errp);

6
io/channel-watch.c

@ -281,9 +281,9 @@ GSource *qio_channel_create_socket_watch(QIOChannel *ioc,
GSource *source;
QIOChannelSocketSource *ssource;
qemu_socket_select(sockfd, ioc->event,
FD_READ | FD_ACCEPT | FD_CLOSE |
FD_CONNECT | FD_WRITE | FD_OOB, NULL);
qemu_socket_select_nofail(sockfd, ioc->event,
FD_READ | FD_ACCEPT | FD_CLOSE |
FD_CONNECT | FD_WRITE | FD_OOB);
source = g_source_new(&qio_channel_socket_source_funcs,
sizeof(QIOChannelSocketSource));

9
migration/cpr.c

@ -7,6 +7,7 @@
#include "qemu/osdep.h"
#include "qapi/error.h"
#include "qemu/error-report.h"
#include "hw/vfio/vfio-device.h"
#include "migration/cpr.h"
#include "migration/misc.h"
@ -100,10 +101,10 @@ void cpr_resave_fd(const char *name, int id, int fd)
if (old_fd < 0) {
cpr_save_fd(name, id, fd);
} else if (old_fd != fd) {
error_setg(&error_fatal,
"internal error: cpr fd '%s' id %d value %d "
"already saved with a different value %d",
name, id, fd, old_fd);
error_report("internal error: cpr fd '%s' id %d value %d "
"already saved with a different value %d",
name, id, fd, old_fd);
g_assert_not_reached();
}
}

7
monitor/hmp-cmds.c

@ -280,14 +280,15 @@ void hmp_log(Monitor *mon, const QDict *qdict)
void hmp_gdbserver(Monitor *mon, const QDict *qdict)
{
Error *err = NULL;
const char *device = qdict_get_try_str(qdict, "device");
if (!device) {
device = "tcp::" DEFAULT_GDBSTUB_PORT;
}
if (!gdbserver_start(device, &error_warn)) {
monitor_printf(mon, "Could not open gdbserver on device '%s'\n",
device);
if (!gdbserver_start(device, &err)) {
error_report_err(err);
} else if (strcmp(device, "none") == 0) {
monitor_printf(mon, "Disabled gdbserver\n");
} else {

9
net/slirp.c

@ -258,11 +258,13 @@ static void net_slirp_register_poll_sock(slirp_os_socket fd, void *opaque)
{
#ifdef WIN32
AioContext *ctxt = qemu_get_aio_context();
g_autofree char *msg = NULL;
if (WSAEventSelect(fd, event_notifier_get_handle(&ctxt->notifier),
FD_READ | FD_ACCEPT | FD_CLOSE |
FD_CONNECT | FD_WRITE | FD_OOB) != 0) {
error_setg_win32(&error_warn, WSAGetLastError(), "failed to WSAEventSelect()");
msg = g_win32_error_message(WSAGetLastError());
warn_report("failed to WSAEventSelect(): %s", msg);
}
#endif
}
@ -270,8 +272,11 @@ static void net_slirp_register_poll_sock(slirp_os_socket fd, void *opaque)
static void net_slirp_unregister_poll_sock(slirp_os_socket fd, void *opaque)
{
#ifdef WIN32
g_autofree char *msg = NULL;
if (WSAEventSelect(fd, NULL, 0) != 0) {
error_setg_win32(&error_warn, WSAGetLastError(), "failed to WSAEventSelect()");
msg = g_win32_error_message(WSAGetLastError());
warn_report("failed to WSAEventSelect(): %s", msg);
}
#endif
}

7
tcg/region.c

@ -832,13 +832,16 @@ void tcg_region_init(size_t tb_size, int splitwx, unsigned max_threads)
} else {
#ifdef CONFIG_POSIX
rc = mprotect(start, end - start, need_prot);
if (rc) {
error_report("mprotect of jit buffer: %s",
strerror(errno));
}
#else
g_assert_not_reached();
#endif
}
if (rc) {
error_setg_errno(&error_fatal, errno,
"mprotect of jit buffer");
exit(1);
}
}
if (have_prot != 0) {

17
tests/unit/test-error-report.c

@ -104,22 +104,6 @@ test_error_report_timestamp(void)
");
}
static void
test_error_warn(void)
{
if (g_test_subprocess()) {
error_setg(&error_warn, "Testing &error_warn");
return;
}
g_test_trap_subprocess(NULL, 0, 0);
g_test_trap_assert_passed();
g_test_trap_assert_stderr("\
test-error-report: warning: Testing &error_warn*\
");
}
int
main(int argc, char *argv[])
{
@ -133,7 +117,6 @@ main(int argc, char *argv[])
g_test_add_func("/error-report/glog", test_error_report_glog);
g_test_add_func("/error-report/once", test_error_report_once);
g_test_add_func("/error-report/timestamp", test_error_report_timestamp);
g_test_add_func("/error-report/warn", test_error_warn);
return g_test_run();
}

22
ui/dbus-listener.c

@ -214,24 +214,32 @@ static void dbus_update_gl_cb(GObject *source_object,
GAsyncResult *res,
gpointer user_data)
{
g_autoptr(GError) err = NULL;
g_autoptr(GError) gerr = NULL;
#ifdef WIN32
Error *err = NULL;
#endif
DBusDisplayListener *ddl = user_data;
bool success;
#ifdef CONFIG_GBM
success = qemu_dbus_display1_listener_call_update_dmabuf_finish(
ddl->proxy, res, &err);
ddl->proxy, res, &gerr);
if (!success) {
error_report("Failed to call update: %s", gerr->message);
}
#endif
#ifdef WIN32
success = qemu_dbus_display1_listener_win32_d3d11_call_update_texture2d_finish(
ddl->d3d11_proxy, res, &err);
d3d_texture2d_acquire0(ddl->d3d_texture, &error_warn);
#endif
ddl->d3d11_proxy, res, &gerr);
if (!success) {
error_report("Failed to call update: %s", err->message);
error_report("Failed to call update: %s", gerr->message);
}
if (!d3d_texture2d_acquire0(ddl->d3d_texture, &err)) {
error_report_err(err);
}
#endif
graphic_hw_gl_block(ddl->dcl.con, false);
g_object_unref(ddl);

6
ui/gtk.c

@ -1181,6 +1181,7 @@ static gboolean gd_touch_event(GtkWidget *widget, GdkEventTouch *touch,
void *opaque)
{
VirtualConsole *vc = opaque;
Error *err = NULL;
uint64_t num_slot = GPOINTER_TO_UINT(touch->sequence);
int type = -1;
@ -1203,7 +1204,10 @@ static gboolean gd_touch_event(GtkWidget *widget, GdkEventTouch *touch,
console_handle_touch_event(vc->gfx.dcl.con, touch_slots,
num_slot, surface_width(vc->gfx.ds),
surface_height(vc->gfx.ds), touch->x,
touch->y, type, &error_warn);
touch->y, type, &err);
if (err) {
warn_report_err(err);
}
return TRUE;
}

5
ui/qemu-pixman.c

@ -288,7 +288,10 @@ qemu_pixman_shareable_free(qemu_pixman_shareable handle,
void *ptr, size_t size)
{
#ifdef WIN32
qemu_win32_map_free(ptr, handle, &error_warn);
Error *err = NULL;
qemu_win32_map_free(ptr, handle, &err);
error_report_err(err);
#else
qemu_memfd_free(ptr, size, handle);
#endif

6
ui/spice-core.c

@ -126,11 +126,13 @@ static void watch_update_mask(SpiceWatch *watch, int event_mask)
static SpiceWatch *watch_add(int fd, int event_mask, SpiceWatchFunc func, void *opaque)
{
SpiceWatch *watch;
#ifdef WIN32
g_autofree char *msg = NULL;
fd = _open_osfhandle(fd, _O_BINARY);
if (fd < 0) {
error_setg_win32(&error_warn, WSAGetLastError(), "Couldn't associate a FD with the SOCKET");
msg = g_win32_error_message(WSAGetLastError());
warn_report("Couldn't associate a FD with the SOCKET: %s", msg);
return NULL;
}
#endif

2
util/aio-win32.c

@ -121,7 +121,7 @@ void aio_set_fd_handler(AioContext *ctx,
QLIST_INSERT_HEAD_RCU(&ctx->aio_handlers, node, node);
event = event_notifier_get_handle(&ctx->notifier);
qemu_socket_select(fd, event, bitmask, NULL);
qemu_socket_select_nofail(fd, event, bitmask);
}
if (old_node) {
aio_remove_fd_handler(ctx, old_node);

5
util/error.c

@ -19,7 +19,6 @@
Error *error_abort;
Error *error_fatal;
Error *error_warn;
static void error_handle(Error **errp, Error *err)
{
@ -41,9 +40,7 @@ static void error_handle(Error **errp, Error *err)
error_report_err(err);
exit(1);
}
if (errp == &error_warn) {
warn_report_err(err);
} else if (errp && !*errp) {
if (errp && !*errp) {
*errp = err;
} else {
error_free(err);

25
util/oslib-win32.c

@ -182,7 +182,7 @@ bool qemu_set_blocking(int fd, bool block, Error **errp)
unsigned long opt = block ? 0 : 1;
if (block) {
qemu_socket_unselect(fd, NULL);
qemu_socket_unselect_nofail(fd);
}
if (ioctlsocket(fd, FIONBIO, &opt) != NO_ERROR) {
@ -293,10 +293,6 @@ bool qemu_socket_select(int sockfd, WSAEVENT hEventObject,
{
SOCKET s = _get_osfhandle(sockfd);
if (errp == NULL) {
errp = &error_warn;
}
if (s == INVALID_SOCKET) {
error_setg(errp, "invalid socket fd=%d", sockfd);
return false;
@ -315,6 +311,25 @@ bool qemu_socket_unselect(int sockfd, Error **errp)
return qemu_socket_select(sockfd, NULL, 0, errp);
}
void qemu_socket_select_nofail(int sockfd, WSAEVENT hEventObject,
long lNetworkEvents)
{
Error *err = NULL;
if (!qemu_socket_select(sockfd, hEventObject, lNetworkEvents, &err)) {
warn_report_err(err);
}
}
void qemu_socket_unselect_nofail(int sockfd)
{
Error *err = NULL;
if (!qemu_socket_unselect(sockfd, &err)) {
warn_report_err(err);
}
}
int qemu_socketpair(int domain, int type, int protocol, int sv[2])
{
struct sockaddr_un addr = {

Loading…
Cancel
Save