[{"id":3675348,"web_url":"http://patchwork.ozlabs.org/comment/3675348/","msgid":"<_FLwJ4IKFwbr2FlwMah_gLTk8PG-FdvyrrFM2UgmbYPlN7wSwZIslJehtfZV7mb8w1UD69eX6LD5Lt9wGkstMiLrdrkkzU1coVZiuy7CSNE=@matthewpenney.net>","list_archive_url":null,"date":"2026-04-09T14:20:48","subject":"Re: [PATCH 2/2] io: use g_clear_handle_id() for GSource cleanup","submitter":{"id":92789,"url":"http://patchwork.ozlabs.org/api/people/92789/","name":"Matthew Penney","email":"matt@matthewpenney.net"},"content":"Hi Philippe,\n\nThanks for picking this up and cleaning it up.\n\nThis matches what I was aiming for with my series.\n\nBest regards,\nMatt\n\n\n\nSent with Proton Mail secure email.\n\nOn Wednesday, 8 April 2026 at 11:06, Philippe Mathieu-Daudé <philmd@linaro.org> wrote:\n\n> Use g_clear_handle_id() instead of g_source_remove() with\n> manual ID checking and zeroing.\n> \n> This simplifies the code and ensures consistent handling of\n> GSource IDs, since g_clear_handle_id() checks for a non-zero\n> ID before calling the cleanup function and zeros it afterwards.\n> \n> No functional change intended.\n> \n> Mechanical change using the following Coccinelle spatch script:\n> \n>   @@\n>   expression TAG;\n>   @@\n>   -    if (TAG > 0) {\n>   +    if (TAG) {\n>            g_source_remove(TAG);\n>            <... when != TAG\n>            TAG = 0;\n>            ...>\n>        }\n> \n>   @@\n>   expression TAG;\n>   @@\n>   -    g_source_remove(TAG);\n>   -    TAG = 0;\n>   +    g_clear_handle_id(&TAG, g_source_remove);\n> \n>   @@\n>   expression TAG;\n>   @@\n>   -    if (TAG) {\n>            g_clear_handle_id(&TAG, g_source_remove);\n>   -    }\n> \n> Inspired-by: Matthew Penney <matt@matthewpenney.net>\n> Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>\n> ---\n>  hw/char/cmsdk-apb-uart.c  |  5 +----\n>  hw/char/nrf51_uart.c      |  5 +----\n>  hw/char/serial.c          |  6 +-----\n>  hw/char/stm32l4x5_usart.c |  5 +----\n>  hw/char/terminal3270.c    |  5 +----\n>  hw/char/virtio-console.c  | 10 ++--------\n>  hw/usb/redirect.c         |  5 +----\n>  io/channel-websock.c      | 13 +++----------\n>  net/passt.c               |  8 ++------\n>  net/stream.c              | 15 +++------------\n>  net/stream_data.c         |  5 +----\n>  net/vhost-user.c          |  8 ++------\n>  ui/dbus-clipboard.c       |  6 ++----\n>  ui/input-barrier.c        |  6 +-----\n>  ui/vnc-auth-vencrypt.c    |  6 +-----\n>  ui/vnc-ws.c               | 12 ++----------\n>  16 files changed, 25 insertions(+), 95 deletions(-)\n> \n> diff --git a/hw/char/cmsdk-apb-uart.c b/hw/char/cmsdk-apb-uart.c\n> index edb80f61819..0631821a571 100644\n> --- a/hw/char/cmsdk-apb-uart.c\n> +++ b/hw/char/cmsdk-apb-uart.c\n> @@ -236,10 +236,7 @@ buffer_drained:\n> \n>  static void uart_cancel_transmit(CMSDKAPBUART *s)\n>  {\n> -    if (s->watch_tag) {\n> -        g_source_remove(s->watch_tag);\n> -        s->watch_tag = 0;\n> -    }\n> +    g_clear_handle_id(&s->watch_tag, g_source_remove);\n>  }\n> \n>  static void uart_write(void *opaque, hwaddr offset, uint64_t value,\n> diff --git a/hw/char/nrf51_uart.c b/hw/char/nrf51_uart.c\n> index 73069232441..96f0d085fdd 100644\n> --- a/hw/char/nrf51_uart.c\n> +++ b/hw/char/nrf51_uart.c\n> @@ -104,10 +104,7 @@ buffer_drained:\n> \n>  static void uart_cancel_transmit(NRF51UARTState *s)\n>  {\n> -    if (s->watch_tag) {\n> -        g_source_remove(s->watch_tag);\n> -        s->watch_tag = 0;\n> -    }\n> +    g_clear_handle_id(&s->watch_tag, g_source_remove);\n>  }\n> \n>  static void uart_write(void *opaque, hwaddr addr,\n> diff --git a/hw/char/serial.c b/hw/char/serial.c\n> index 0f3469a1e8f..0729cd2ce9d 100644\n> --- a/hw/char/serial.c\n> +++ b/hw/char/serial.c\n> @@ -856,11 +856,7 @@ const VMStateDescription vmstate_serial = {\n>  static void serial_reset(void *opaque)\n>  {\n>      SerialState *s = opaque;\n> -\n> -    if (s->watch_tag > 0) {\n> -        g_source_remove(s->watch_tag);\n> -        s->watch_tag = 0;\n> -    }\n> +    g_clear_handle_id(&s->watch_tag, g_source_remove);\n> \n>      s->rbr = 0;\n>      s->ier = 0;\n> diff --git a/hw/char/stm32l4x5_usart.c b/hw/char/stm32l4x5_usart.c\n> index 736f1e764e6..dd1b0991956 100644\n> --- a/hw/char/stm32l4x5_usart.c\n> +++ b/hw/char/stm32l4x5_usart.c\n> @@ -280,10 +280,7 @@ buffer_drained:\n> \n>  static void usart_cancel_transmit(Stm32l4x5UsartBaseState *s)\n>  {\n> -    if (s->watch_tag) {\n> -        g_source_remove(s->watch_tag);\n> -        s->watch_tag = 0;\n> -    }\n> +    g_clear_handle_id(&s->watch_tag, g_source_remove);\n>  }\n> \n>  static void stm32l4x5_update_params(Stm32l4x5UsartBaseState *s)\n> diff --git a/hw/char/terminal3270.c b/hw/char/terminal3270.c\n> index 1d857bad9bc..989b6f6ee1e 100644\n> --- a/hw/char/terminal3270.c\n> +++ b/hw/char/terminal3270.c\n> @@ -52,10 +52,7 @@ static int terminal_can_read(void *opaque)\n> \n>  static void terminal_timer_cancel(Terminal3270 *t)\n>  {\n> -    if (t->timer_tag) {\n> -        g_source_remove(t->timer_tag);\n> -        t->timer_tag = 0;\n> -    }\n> +    g_clear_handle_id(&t->timer_tag, g_source_remove);\n>  }\n> \n>  /*\n> diff --git a/hw/char/virtio-console.c b/hw/char/virtio-console.c\n> index efe7cd6772e..4737b9a56eb 100644\n> --- a/hw/char/virtio-console.c\n> +++ b/hw/char/virtio-console.c\n> @@ -159,10 +159,7 @@ static void chr_event(void *opaque, QEMUChrEvent event)\n>          virtio_serial_open(port);\n>          break;\n>      case CHR_EVENT_CLOSED:\n> -        if (vcon->watch) {\n> -            g_source_remove(vcon->watch);\n> -            vcon->watch = 0;\n> -        }\n> +        g_clear_handle_id(&vcon->watch, g_source_remove);\n>          virtio_serial_close(port);\n>          break;\n>      case CHR_EVENT_BREAK:\n> @@ -255,10 +252,7 @@ static void virtconsole_realize(DeviceState *dev, Error **errp)\n>  static void virtconsole_unrealize(DeviceState *dev)\n>  {\n>      VirtConsole *vcon = VIRTIO_CONSOLE(dev);\n> -\n> -    if (vcon->watch) {\n> -        g_clear_handle_id(&vcon->watch, g_source_remove);\n> -    }\n> +    g_clear_handle_id(&vcon->watch, g_source_remove);\n>  }\n> \n>  static void virtconsole_class_init(ObjectClass *klass, const void *data)\n> diff --git a/hw/usb/redirect.c b/hw/usb/redirect.c\n> index 100afbdb06a..bde821e214b 100644\n> --- a/hw/usb/redirect.c\n> +++ b/hw/usb/redirect.c\n> @@ -1226,10 +1226,7 @@ static void usbredir_chardev_close_bh(void *opaque)\n>          usbredirparser_destroy(dev->parser);\n>          dev->parser = NULL;\n>      }\n> -    if (dev->watch) {\n> -        g_source_remove(dev->watch);\n> -        dev->watch = 0;\n> -    }\n> +    g_clear_handle_id(&dev->watch, g_source_remove);\n>  }\n> \n>  static void usbredir_create_parser(USBRedirDevice *dev)\n> diff --git a/io/channel-websock.c b/io/channel-websock.c\n> index da7e7c9e345..3479a5c32d2 100644\n> --- a/io/channel-websock.c\n> +++ b/io/channel-websock.c\n> @@ -1066,10 +1066,7 @@ static gboolean qio_channel_websock_flush(QIOChannel *ioc,\n> \n>  static void qio_channel_websock_unset_watch(QIOChannelWebsock *ioc)\n>  {\n> -    if (ioc->io_tag) {\n> -        g_source_remove(ioc->io_tag);\n> -        ioc->io_tag = 0;\n> -    }\n> +    g_clear_handle_id(&ioc->io_tag, g_source_remove);\n>  }\n> \n>  static void qio_channel_websock_set_watch(QIOChannelWebsock *ioc)\n> @@ -1246,12 +1243,8 @@ static int qio_channel_websock_close(QIOChannel *ioc,\n>      buffer_free(&wioc->encinput);\n>      buffer_free(&wioc->encoutput);\n>      buffer_free(&wioc->rawinput);\n> -    if (wioc->hs_io_tag) {\n> -        g_clear_handle_id(&wioc->hs_io_tag, g_source_remove);\n> -    }\n> -    if (wioc->io_tag) {\n> -        g_clear_handle_id(&wioc->io_tag, g_source_remove);\n> -    }\n> +    g_clear_handle_id(&wioc->hs_io_tag, g_source_remove);\n> +    g_clear_handle_id(&wioc->io_tag, g_source_remove);\n>      if (wioc->io_err) {\n>          g_clear_pointer(&wioc->io_err, error_free);\n>      }\n> diff --git a/net/passt.c b/net/passt.c\n> index 4ff94ee509d..d3b5ab426c9 100644\n> --- a/net/passt.c\n> +++ b/net/passt.c\n> @@ -90,10 +90,7 @@ static void net_passt_cleanup(NetClientState *nc)\n>          g_free(s->vhost_net);\n>          s->vhost_net = NULL;\n>      }\n> -    if (s->vhost_watch) {\n> -        g_source_remove(s->vhost_watch);\n> -        s->vhost_watch = 0;\n> -    }\n> +    g_clear_handle_id(&s->vhost_watch, g_source_remove);\n>      qemu_chr_fe_deinit(&s->vhost_chr, true);\n>      if (s->vhost_user) {\n>          vhost_user_cleanup(s->vhost_user);\n> @@ -421,8 +418,7 @@ static void passt_vhost_user_event(void *opaque, QEMUChrEvent event)\n>          if (s->vhost_watch) {\n>              AioContext *ctx = qemu_get_current_aio_context();\n> \n> -            g_source_remove(s->vhost_watch);\n> -            s->vhost_watch = 0;\n> +            g_clear_handle_id(&s->vhost_watch, g_source_remove);\n>              qemu_chr_fe_set_handlers(&s->vhost_chr, NULL, NULL,  NULL, NULL,\n>                                       NULL, NULL, false);\n> \n> diff --git a/net/stream.c b/net/stream.c\n> index ea83f4a763a..6df4e251feb 100644\n> --- a/net/stream.c\n> +++ b/net/stream.c\n> @@ -71,24 +71,15 @@ static gboolean net_stream_send(QIOChannel *ioc,\n>  static void net_stream_cleanup(NetClientState *nc)\n>  {\n>      NetStreamState *s = DO_UPCAST(NetStreamState, data.nc, nc);\n> -    if (s->timer_tag) {\n> -        g_source_remove(s->timer_tag);\n> -        s->timer_tag = 0;\n> -    }\n> +    g_clear_handle_id(&s->timer_tag, g_source_remove);\n>      if (s->addr) {\n>          qapi_free_SocketAddress(s->addr);\n>          s->addr = NULL;\n>      }\n>      if (s->data.ioc) {\n>          if (QIO_CHANNEL_SOCKET(s->data.ioc)->fd != -1) {\n> -            if (s->data.ioc_read_tag) {\n> -                g_source_remove(s->data.ioc_read_tag);\n> -                s->data.ioc_read_tag = 0;\n> -            }\n> -            if (s->data.ioc_write_tag) {\n> -                g_source_remove(s->data.ioc_write_tag);\n> -                s->data.ioc_write_tag = 0;\n> -            }\n> +            g_clear_handle_id(&s->data.ioc_read_tag, g_source_remove);\n> +            g_clear_handle_id(&s->data.ioc_write_tag, g_source_remove);\n>          }\n>          object_unref(OBJECT(s->data.ioc));\n>          s->data.ioc = NULL;\n> diff --git a/net/stream_data.c b/net/stream_data.c\n> index 03740e9f73e..73b45da9fe3 100644\n> --- a/net/stream_data.c\n> +++ b/net/stream_data.c\n> @@ -84,10 +84,7 @@ void net_stream_data_rs_finalize(SocketReadState *rs)\n>      if (qemu_send_packet_async(&d->nc, rs->buf,\n>                                 rs->packet_len,\n>                                 net_stream_data_send_completed) == 0) {\n> -        if (d->ioc_read_tag) {\n> -            g_source_remove(d->ioc_read_tag);\n> -            d->ioc_read_tag = 0;\n> -        }\n> +        g_clear_handle_id(&d->ioc_read_tag, g_source_remove);\n>      }\n>  }\n> \n> diff --git a/net/vhost-user.c b/net/vhost-user.c\n> index a4bb49bbcff..2d0fc49b4d8 100644\n> --- a/net/vhost-user.c\n> +++ b/net/vhost-user.c\n> @@ -215,10 +215,7 @@ static void net_vhost_user_cleanup(NetClientState *nc)\n>          s->vhost_net = NULL;\n>      }\n>      if (nc->queue_index == 0) {\n> -        if (s->watch) {\n> -            g_source_remove(s->watch);\n> -            s->watch = 0;\n> -        }\n> +        g_clear_handle_id(&s->watch, g_source_remove);\n>          qemu_chr_fe_deinit(&s->chr, true);\n>          if (s->vhost_user) {\n>              vhost_user_cleanup(s->vhost_user);\n> @@ -356,8 +353,7 @@ static void net_vhost_user_event(void *opaque, QEMUChrEvent event)\n>          if (s->watch) {\n>              AioContext *ctx = qemu_get_current_aio_context();\n> \n> -            g_source_remove(s->watch);\n> -            s->watch = 0;\n> +            g_clear_handle_id(&s->watch, g_source_remove);\n>              qemu_chr_fe_set_handlers(&s->chr, NULL, NULL, NULL, NULL,\n>                                       NULL, NULL, false);\n> \n> diff --git a/ui/dbus-clipboard.c b/ui/dbus-clipboard.c\n> index 935b6b1a2ac..90318384ee4 100644\n> --- a/ui/dbus-clipboard.c\n> +++ b/ui/dbus-clipboard.c\n> @@ -80,8 +80,7 @@ dbus_clipboard_update_info(DBusDisplay *dpy, QemuClipboardInfo *info)\n>      if (req->invocation && info->types[req->type].data) {\n>          dbus_clipboard_complete_request(dpy, req->invocation, info, req->type);\n>          g_clear_object(&req->invocation);\n> -        g_source_remove(req->timeout_id);\n> -        req->timeout_id = 0;\n> +        g_clear_handle_id(&req->timeout_id, g_source_remove);\n>          return;\n>      }\n> \n> @@ -183,8 +182,7 @@ dbus_clipboard_request_cancelled(DBusClipboardRequest *req)\n>          \"Cancelled clipboard request\");\n> \n>      g_clear_object(&req->invocation);\n> -    g_source_remove(req->timeout_id);\n> -    req->timeout_id = 0;\n> +    g_clear_handle_id(&req->timeout_id, g_source_remove);\n>  }\n> \n>  static void\n> diff --git a/ui/input-barrier.c b/ui/input-barrier.c\n> index 0a2198ca500..84212c50442 100644\n> --- a/ui/input-barrier.c\n> +++ b/ui/input-barrier.c\n> @@ -518,11 +518,7 @@ static void input_barrier_complete(UserCreatable *uc, Error **errp)\n>  static void input_barrier_instance_finalize(Object *obj)\n>  {\n>      InputBarrier *ib = INPUT_BARRIER(obj);\n> -\n> -    if (ib->ioc_tag) {\n> -        g_source_remove(ib->ioc_tag);\n> -        ib->ioc_tag = 0;\n> -    }\n> +    g_clear_handle_id(&ib->ioc_tag, g_source_remove);\n> \n>      if (ib->sioc) {\n>          qio_channel_close(QIO_CHANNEL(ib->sioc), NULL);\n> diff --git a/ui/vnc-auth-vencrypt.c b/ui/vnc-auth-vencrypt.c\n> index d9c212ff328..a1b8cde2292 100644\n> --- a/ui/vnc-auth-vencrypt.c\n> +++ b/ui/vnc-auth-vencrypt.c\n> @@ -101,11 +101,7 @@ static int protocol_client_vencrypt_auth(VncState *vs, uint8_t *data, size_t len\n>          QIOChannelTLS *tls;\n>          vnc_write_u8(vs, 1); /* Accept auth */\n>          vnc_flush(vs);\n> -\n> -        if (vs->ioc_tag) {\n> -            g_source_remove(vs->ioc_tag);\n> -            vs->ioc_tag = 0;\n> -        }\n> +        g_clear_handle_id(&vs->ioc_tag, g_source_remove);\n> \n>          tls = qio_channel_tls_new_server(\n>              vs->ioc,\n> diff --git a/ui/vnc-ws.c b/ui/vnc-ws.c\n> index 9e3503d93d8..65e8b344b65 100644\n> --- a/ui/vnc-ws.c\n> +++ b/ui/vnc-ws.c\n> @@ -54,11 +54,7 @@ gboolean vncws_tls_handshake_io(QIOChannel *ioc G_GNUC_UNUSED,\n>      VncState *vs = opaque;\n>      QIOChannelTLS *tls;\n>      Error *err = NULL;\n> -\n> -    if (vs->ioc_tag) {\n> -        g_source_remove(vs->ioc_tag);\n> -        vs->ioc_tag = 0;\n> -    }\n> +    g_clear_handle_id(&vs->ioc_tag, g_source_remove);\n> \n>      if (condition & (G_IO_HUP | G_IO_ERR)) {\n>          vnc_client_error(vs);\n> @@ -123,11 +119,7 @@ gboolean vncws_handshake_io(QIOChannel *ioc G_GNUC_UNUSED,\n>  {\n>      VncState *vs = opaque;\n>      QIOChannelWebsock *wioc;\n> -\n> -    if (vs->ioc_tag) {\n> -        g_source_remove(vs->ioc_tag);\n> -        vs->ioc_tag = 0;\n> -    }\n> +    g_clear_handle_id(&vs->ioc_tag, g_source_remove);\n> \n>      if (condition & (G_IO_HUP | G_IO_ERR)) {\n>          vnc_client_error(vs);\n> --\n> 2.53.0\n> \n>","headers":{"Return-Path":"<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>","X-Original-To":"incoming@patchwork.ozlabs.org","Delivered-To":"patchwork-incoming@legolas.ozlabs.org","Authentication-Results":["legolas.ozlabs.org;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=matthewpenney.net header.i=@matthewpenney.net\n header.a=rsa-sha256 header.s=protonmail header.b=LiXA1lSw;\n\tdkim-atps=neutral","legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=nongnu.org\n (client-ip=209.51.188.17; helo=lists.gnu.org;\n envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org;\n receiver=patchwork.ozlabs.org)"],"Received":["from lists.gnu.org (lists1p.gnu.org [209.51.188.17])\n\t(using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits))\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4fs2F255cNz1yHG\n\tfor <incoming@patchwork.ozlabs.org>; Fri, 10 Apr 2026 00:21:56 +1000 (AEST)","from localhost ([::1] helo=lists1p.gnu.org)\n\tby lists.gnu.org with esmtp (Exim 4.90_1)\n\t(envelope-from <qemu-devel-bounces@nongnu.org>)\n\tid 1wAqFm-0002pn-6b; Thu, 09 Apr 2026 10:21:06 -0400","from eggs.gnu.org ([2001:470:142:3::10])\n by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)\n (Exim 4.90_1) (envelope-from <matt@matthewpenney.net>)\n id 1wAqFj-0002pX-00\n for qemu-devel@nongnu.org; Thu, 09 Apr 2026 10:21:04 -0400","from mail-10627.protonmail.ch ([79.135.106.27])\n by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)\n (Exim 4.90_1) (envelope-from <matt@matthewpenney.net>)\n id 1wAqFf-0002y0-EP\n for qemu-devel@nongnu.org; Thu, 09 Apr 2026 10:21:02 -0400"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=matthewpenney.net;\n s=protonmail; t=1775744453; x=1776003653;\n bh=ET7eMLj99h44CbM8DpKXUknP91w3oGNmPtzBKZPRAYE=;\n h=Date:To:From:Cc:Subject:Message-ID:In-Reply-To:References:\n Feedback-ID:From:To:Cc:Date:Subject:Reply-To:Feedback-ID:\n Message-ID:BIMI-Selector;\n b=LiXA1lSwjQzScmRbH2jQmSLOzmxtNU65UxeYnUrGfyADqKb5lmbAfvJqod1WfirQc\n t3wV/D4yPZGvTQPTCcLOD8mZiXbwZcRAV8pbNmM6peLlLH5zXQrlVhv9tF8RlAO0Va\n N3xBj4Fe5+BXEn/ksht7TLYTfYGBA0fEmg7+DIyDnD+SWfRxuyj4RmZHtvVgua7vs/\n 47e5FB1ig8yCPO2MuK1b4TV8vzCP3lkpL6OAIXBNqQA82jb7f8WKeXPdkygg3z0039\n fwR7ywHRuo/Z4WIRkrQwHYCTddEncjWUGA7HV/RWJ1l3a+iH9H1rsoF4u3CQQemXKN\n lvgVC893YReow==","Date":"Thu, 09 Apr 2026 14:20:48 +0000","To":"=?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= <philmd@linaro.org>","From":"Matthew Penney <matt@matthewpenney.net>","Cc":"qemu-devel@nongnu.org,\n =?utf-8?q?Marc-Andr=C3=A9_Lureau?= <marcandre.lureau@redhat.com>,\n\t=?utf-8?q?Daniel_P=2E_Berrang=C3=A9?= <berrange@redhat.com>","Subject":"Re: [PATCH 2/2] io: use g_clear_handle_id() for GSource cleanup","Message-ID":"\n <_FLwJ4IKFwbr2FlwMah_gLTk8PG-FdvyrrFM2UgmbYPlN7wSwZIslJehtfZV7mb8w1UD69eX6LD5Lt9wGkstMiLrdrkkzU1coVZiuy7CSNE=@matthewpenney.net>","In-Reply-To":"<20260408100605.66795-3-philmd@linaro.org>","References":"<20260408100605.66795-1-philmd@linaro.org>\n <20260408100605.66795-3-philmd@linaro.org>","Feedback-ID":"185185778:user:proton","X-Pm-Message-ID":"e2bf4a4740bc173d9b570b403a5d8ee2f28d176e","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Transfer-Encoding":"quoted-printable","Received-SPF":"pass client-ip=79.135.106.27;\n envelope-from=matt@matthewpenney.net; helo=mail-10627.protonmail.ch","X-Spam_score_int":"-27","X-Spam_score":"-2.8","X-Spam_bar":"--","X-Spam_report":"(-2.8 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1,\n DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1,\n RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H5=0.001, RCVD_IN_MSPIKE_WL=0.001,\n RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.001,\n SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no","X-Spam_action":"no action","X-BeenThere":"qemu-devel@nongnu.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"qemu development <qemu-devel.nongnu.org>","List-Unsubscribe":"<https://lists.nongnu.org/mailman/options/qemu-devel>,\n <mailto:qemu-devel-request@nongnu.org?subject=unsubscribe>","List-Archive":"<https://lists.nongnu.org/archive/html/qemu-devel>","List-Post":"<mailto:qemu-devel@nongnu.org>","List-Help":"<mailto:qemu-devel-request@nongnu.org?subject=help>","List-Subscribe":"<https://lists.nongnu.org/mailman/listinfo/qemu-devel>,\n <mailto:qemu-devel-request@nongnu.org?subject=subscribe>","Errors-To":"qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org","Sender":"qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org"}}]