From nobody Mon Apr 29 19:06:25 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=web.de ARC-Seal: i=1; a=rsa-sha256; t=1605440383; cv=none; d=zohomail.com; s=zohoarc; b=ZhJAHdpY9iQyr5F+h8Qe95QBw+dKEvpRXz8ppNJbznyMaxTjwAr6W3S4SHGX9xuAQiNDxWNrMyfd1Ag92GKR1RiJnBzALknZScAVi1hlTi/dSIQzvnFQPQA0UF8gx4zmLHArq0n5kEWFE+I8ono4YcQoX1CIej+pHv6+NxsBM3o= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1605440383; h=Content-Type:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=0FJMZosg7F6lpwWZnbUANuXHb7wsk6TVO+TD8pwlZJM=; b=ivSQipasQ7bn7nvF76hFKbvmDUKtPm7uWSdRXnWZBc/I2rV7L6M7hABJPGslr8VLKagGhFMZNT0a3xLcZRPfku+1XZGB2vp246dZ15WaRdtN8Q1JY8Xg6hacxYTnEzS24Iz6T+E1pzT6KLPW66kV7ZHhD08W3DXfQHESwqWe2CE= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 160544038356128.51430792243582; Sun, 15 Nov 2020 03:39:43 -0800 (PST) Received: from localhost ([::1]:58402 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1keGNi-0000OG-DK for importer@patchew.org; Sun, 15 Nov 2020 06:39:42 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:57004) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1keGKL-0004pk-Lh; Sun, 15 Nov 2020 06:36:13 -0500 Received: from mout.web.de ([217.72.192.78]:58141) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1keGKI-0008DK-6n; Sun, 15 Nov 2020 06:36:13 -0500 Received: from luklap ([87.123.206.172]) by smtp.web.de (mrweb106 [213.165.67.124]) with ESMTPSA (Nemesis) id 1N6sBp-1kDH360vL5-017xLl; Sun, 15 Nov 2020 12:36:03 +0100 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=web.de; s=dbaedf251592; t=1605440163; bh=gvEu2P710aTKvOOzPDI2YgsK1lHUggQxU9Jsb/WaOl0=; h=X-UI-Sender-Class:Date:From:To:Cc:Subject:In-Reply-To:References; b=JmGPgJPa8RgOhnfDdfPyk85JAendgH032EH/1HnYcVcwsWe7LBmtenvj+Qul9f5V3 m5rYhtRBgm44F123vfRhv1JeUYDcaB9ylS4827s1hX1v6kmwOxLf1jhaJDmEcxyIg3 7CIWJOmwuyViyWeq5E2q4t+vYTxvU9pSAk1v0KaY= X-UI-Sender-Class: c548c8c5-30a9-4db5-a2e7-cb6cb037b8f9 Date: Sun, 15 Nov 2020 12:36:01 +0100 From: Lukas Straub To: qemu-devel Subject: [PATCH v11 1/7] Introduce yank feature Message-ID: <2f88d8992faf582fc5172a8a09ec0a2df241e4f2.1605439674.git.lukasstraub2@web.de> In-Reply-To: References: MIME-Version: 1.0 Content-Type: multipart/signed; boundary="Sig_/lGHQHFukjTCL.bXa6.QbNXb"; protocol="application/pgp-signature"; micalg=pgp-sha512 X-Provags-ID: V03:K1:Bmh8ztOTzqUx4M3qD22MidelPwobCZ3uhbthuYrRV4Gu7vRgkEZ oM5np8FwJfka87ve2uVFUiqXW3jnm/ExzZTQzMolurOGNmUduz7VfukbbjmKThYP/FIIa1H HeYXKAIXsUSm4iGUFYU7/yttXBJ/DOqasWBQ+xBIkIUxQkn62Cj6D+rkyLSWCvf3NBpZxks 7uQJiP0585xBENkIJ8Btw== X-UI-Out-Filterresults: notjunk:1;V03:K0:sdYEhh5+JBA=:np+ceTIF4I+9TPUFlKquiC U9mN/xBvdvKeT7SCFzSUJ8nM9X5uXe9TL+p4lNgWLKFcnwSslAF/m/OBG90PBs7RoNHf5pNGp jRG9ys1+8mvOwsBEyR2DDhowy7O6pL0Kpj4KtGEU8s9BAQAE4Zu3DZ+85G6ZpF6PehjIY/KfE ULafN63IJaPpdqOaTps0cHMDddcO9MQ7d7OBYlcjZJez0/an+oiRGKmAHkMR3BooffHCdWnrr a3s2BUT+J6sHUJMKuocTTa7PVb2Nfuz0SAzCtollUDbYuVHDd2r4PzeRwOtJQZcgKXDV//Htl Rsyo7BkX0k9x+zHJmPSAGDlY0mnLP8Ht8woGx9ghta4yGG7Cy7XRFNr7zdap72owJofW6htuI hQv4Ix5X/wl6PB2CriDe/c6z4ouVTLZo8ssztfqf3KtImxc3Blf1kW9FxgL05Q9ykITLRMv4/ b5Hiin28jWk49aM3GaqmWmDxUeUdkqlcYZu+BluIjnik4UOnm401AyyS/H57ZJAVCLE0HZWqy gF8vm+1l1B3RodvEbuSmOxOoJoYd/lTreOuIothf2KOeL2tfp1OWq9IxNqx0KNkywr957OKt5 prLRh3u5hFA34zVqLMt2cawKoRELg+jytMKqtG5OnI0r01caRBQJeXvCvtGoCHMUPAeoNGzVv aHKNQUDpuJBuWGCiIVHX4N8e5Un7W5/hPDsfp+S0SfGxj0lwPFJKkFlnJgN+tq1sDn2LA2t1h zXnr7CJLmzxK3OrhV4lGojb/ISqCiRgPIYBDFu1bc4j35NWQiiYKaXhQQTtO11YAjnWaEeqFy Pf3NQVnGeUgd8SDO0GOlTHj/eTEdlRmF0NOD6ridfoMnqNcg/lwvqPs7Gpgkv0mOQX4FsmEHW /LAiN0LENEaZVdw+DSkQ== Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=217.72.192.78; envelope-from=lukasstraub2@web.de; helo=mout.web.de X-detected-operating-system: by eggs.gnu.org: First seen = 2020/11/15 05:44:48 X-ACL-Warn: Detected OS = Linux 2.2.x-3.x [generic] [fuzzy] X-Spam_score_int: -24 X-Spam_score: -2.5 X-Spam_bar: -- X-Spam_report: (-2.5 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_ENVFROM_END_DIGIT=0.25, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=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.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Kevin Wolf , "Daniel P. =?UTF-8?B?QmVycmFuZ8Op?=" , qemu-block , Juan Quintela , Markus Armbruster , "Dr. David Alan Gilbert" , Max Reitz , Paolo Bonzini , =?UTF-8?B?TWFyYy1BbmRy?= =?UTF-8?B?w6k=?= Lureau Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-Zoho-Virus-Status: 1 X-ZohoMail-DKIM: fail (Header signature does not verify) --Sig_/lGHQHFukjTCL.bXa6.QbNXb Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" The yank feature allows to recover from hanging qemu by "yanking" at various parts. Other qemu systems can register themselves and multiple yank functions. Then all yank functions for selected instances can be called by the 'yank' out-of-band qmp command. Available instances can be queried by a 'query-yank' oob command. Signed-off-by: Lukas Straub Acked-by: Stefan Hajnoczi Reviewed-by: Markus Armbruster --- MAINTAINERS | 7 ++ include/qemu/yank.h | 95 +++++++++++++++++++ qapi/meson.build | 1 + qapi/qapi-schema.json | 1 + qapi/yank.json | 119 +++++++++++++++++++++++ util/meson.build | 1 + util/yank.c | 216 ++++++++++++++++++++++++++++++++++++++++++ 7 files changed, 440 insertions(+) create mode 100644 include/qemu/yank.h create mode 100644 qapi/yank.json create mode 100644 util/yank.c diff --git a/MAINTAINERS b/MAINTAINERS index 2e018a0c1d..46ff468b13 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -2688,6 +2688,13 @@ F: util/uuid.c F: include/qemu/uuid.h F: tests/test-uuid.c +Yank feature +M: Lukas Straub +S: Odd fixes +F: util/yank.c +F: include/qemu/yank.h +F: qapi/yank.json + COLO Framework M: zhanghailiang S: Maintained diff --git a/include/qemu/yank.h b/include/qemu/yank.h new file mode 100644 index 0000000000..96f5b2626f --- /dev/null +++ b/include/qemu/yank.h @@ -0,0 +1,95 @@ +/* + * QEMU yank feature + * + * Copyright (c) Lukas Straub + * + * This work is licensed under the terms of the GNU GPL, version 2 or late= r. + * See the COPYING file in the top-level directory. + */ + +#ifndef YANK_H +#define YANK_H + +#include "qapi/qapi-types-yank.h" + +typedef void (YankFn)(void *opaque); + +/** + * yank_register_instance: Register a new instance. + * + * This registers a new instance for yanking. Must be called before any ya= nk + * function is registered for this instance. + * + * This function is thread-safe. + * + * @instance: The instance. + * @errp: Error object. + */ +void yank_register_instance(const YankInstance *instance, Error **errp); + +/** + * yank_unregister_instance: Unregister a instance. + * + * This unregisters a instance. Must be called only after every yank funct= ion + * of the instance has been unregistered. + * + * This function is thread-safe. + * + * @instance: The instance. + */ +void yank_unregister_instance(const YankInstance *instance); + +/** + * yank_register_function: Register a yank function + * + * This registers a yank function. All limitations of qmp oob commands app= ly + * to the yank function as well. See docs/devel/qapi-code-gen.txt under + * "An OOB-capable command handler must satisfy the following conditions". + * + * This function is thread-safe. + * + * @instance: The instance. + * @func: The yank function. + * @opaque: Will be passed to the yank function. + */ +void yank_register_function(const YankInstance *instance, + YankFn *func, + void *opaque); + +/** + * yank_unregister_function: Unregister a yank function + * + * This unregisters a yank function. + * + * This function is thread-safe. + * + * @instance: The instance. + * @func: func that was passed to yank_register_function. + * @opaque: opaque that was passed to yank_register_function. + */ +void yank_unregister_function(const YankInstance *instance, + YankFn *func, + void *opaque); + +/** + * yank_generic_iochannel: Generic yank function for iochannel + * + * This is a generic yank function which will call qio_channel_shutdown on= the + * provided QIOChannel. + * + * @opaque: QIOChannel to shutdown + */ +void yank_generic_iochannel(void *opaque); + +#define BLOCKDEV_YANK_INSTANCE(the_node_name) (&(YankInstance) { \ + .type =3D YANK_INSTANCE_TYPE_BLOCK_NODE, \ + .u.block_node.node_name =3D (the_node_name) }) + +#define CHARDEV_YANK_INSTANCE(the_id) (&(YankInstance) { \ + .type =3D YANK_INSTANCE_TYPE_CHARDEV, \ + .u.chardev.id =3D (the_id) }) + +#define MIGRATION_YANK_INSTANCE (&(YankInstance) { \ + .type =3D YANK_INSTANCE_TYPE_MIGRATION }) + +#endif diff --git a/qapi/meson.build b/qapi/meson.build index 0e98146f1f..ab68e7900e 100644 --- a/qapi/meson.build +++ b/qapi/meson.build @@ -47,6 +47,7 @@ qapi_all_modules =3D [ 'trace', 'transaction', 'ui', + 'yank', ] qapi_storage_daemon_modules =3D [ diff --git a/qapi/qapi-schema.json b/qapi/qapi-schema.json index 0b444b76d2..3441c9a9ae 100644 --- a/qapi/qapi-schema.json +++ b/qapi/qapi-schema.json @@ -86,6 +86,7 @@ { 'include': 'machine.json' } { 'include': 'machine-target.json' } { 'include': 'replay.json' } +{ 'include': 'yank.json' } { 'include': 'misc.json' } { 'include': 'misc-target.json' } { 'include': 'audio.json' } diff --git a/qapi/yank.json b/qapi/yank.json new file mode 100644 index 0000000000..167a775594 --- /dev/null +++ b/qapi/yank.json @@ -0,0 +1,119 @@ +# -*- Mode: Python -*- +# vim: filetype=3Dpython +# + +## +# =3D Yank feature +## + +## +# @YankInstanceType: +# +# An enumeration of yank instance types. See @YankInstance for more +# information. +# +# Since: 6.0 +## +{ 'enum': 'YankInstanceType', + 'data': [ 'block-node', 'chardev', 'migration' ] } + +## +# @YankInstanceBlockNode: +# +# Specifies which block graph node to yank. See @YankInstance for more +# information. +# +# @node-name: the name of the block graph node +# +# Since: 6.0 +## +{ 'struct': 'YankInstanceBlockNode', + 'data': { 'node-name': 'str' } } + +## +# @YankInstanceChardev: +# +# Specifies which character device to yank. See @YankInstance for more +# information. +# +# @id: the chardev's ID +# +# Since: 6.0 +## +{ 'struct': 'YankInstanceChardev', + 'data': { 'id': 'str' } } + +## +# @YankInstance: +# +# A yank instance can be yanked with the @yank qmp command to recover from= a +# hanging QEMU. +# +# Currently implemented yank instances: +# - nbd block device: +# Yanking it will shut down the connection to the nbd server without +# attempting to reconnect. +# - socket chardev: +# Yanking it will shut down the connected socket. +# - migration: +# Yanking it will shut down all migration connections. Unlike +# @migrate_cancel, it will not notify the migration process, so migrati= on +# will go into @failed state, instead of @cancelled state. @yank should= be +# used to recover from hangs. +# +# Since: 6.0 +## +{ 'union': 'YankInstance', + 'base': { 'type': 'YankInstanceType' }, + 'discriminator': 'type', + 'data': { + 'block-node': 'YankInstanceBlockNode', + 'chardev': 'YankInstanceChardev' } } + +## +# @yank: +# +# Try to recover from hanging QEMU by yanking the specified instances. See +# @YankInstance for more information. +# +# Takes a list of @YankInstance as argument. +# +# Returns: - Nothing on success +# - @DeviceNotFound error, if any of the YankInstances doesn't ex= ist +# +# Example: +# +# -> { "execute": "yank", +# "arguments": { +# "instances": [ +# { "type": "block-node", +# "node-name": "nbd0" } +# ] } } +# <- { "return": {} } +# +# Since: 6.0 +## +{ 'command': 'yank', + 'data': { 'instances': ['YankInstance'] }, + 'allow-oob': true } + +## +# @query-yank: +# +# Query yank instances. See @YankInstance for more information. +# +# Returns: list of @YankInstance +# +# Example: +# +# -> { "execute": "query-yank" } +# <- { "return": [ +# { "type": "block-node", +# "node-name": "nbd0" } +# ] } +# +# Since: 6.0 +## +{ 'command': 'query-yank', + 'returns': ['YankInstance'], + 'allow-oob': true } diff --git a/util/meson.build b/util/meson.build index f359af0d46..f7c67344e1 100644 --- a/util/meson.build +++ b/util/meson.build @@ -50,6 +50,7 @@ endif if have_system util_ss.add(when: 'CONFIG_GIO', if_true: [files('dbus.c'), gio]) + util_ss.add(files('yank.c')) endif if have_block diff --git a/util/yank.c b/util/yank.c new file mode 100644 index 0000000000..4a0f538359 --- /dev/null +++ b/util/yank.c @@ -0,0 +1,216 @@ +/* + * QEMU yank feature + * + * Copyright (c) Lukas Straub + * + * This work is licensed under the terms of the GNU GPL, version 2 or late= r. + * See the COPYING file in the top-level directory. + */ + +#include "qemu/osdep.h" +#include "qapi/error.h" +#include "qemu/thread.h" +#include "qemu/queue.h" +#include "qapi/qapi-commands-yank.h" +#include "qapi/qapi-visit-yank.h" +#include "qapi/clone-visitor.h" +#include "io/channel.h" +#include "qemu/yank.h" + +struct YankFuncAndParam { + YankFn *func; + void *opaque; + QLIST_ENTRY(YankFuncAndParam) next; +}; + +struct YankInstanceEntry { + YankInstance *instance; + QLIST_HEAD(, YankFuncAndParam) yankfns; + QLIST_ENTRY(YankInstanceEntry) next; +}; + +typedef struct YankFuncAndParam YankFuncAndParam; +typedef struct YankInstanceEntry YankInstanceEntry; + +/* + * This lock protects the yank_instance_list below. Because it's taken by + * OOB-capable commands, it must be "fast", i.e. it may only be held for a + * bounded, short time. See docs/devel/qapi-code-gen.txt for additional + * information. + */ +static QemuMutex yank_lock; + +static QLIST_HEAD(, YankInstanceEntry) yank_instance_list + =3D QLIST_HEAD_INITIALIZER(yank_instance_list); + +static bool yank_compare_instances(const YankInstance *a, const YankInstan= ce *b) +{ + if (a->type !=3D b->type) { + return false; + } + + switch (a->type) { + case YANK_INSTANCE_TYPE_BLOCK_NODE: + return !strcmp(a->u.block_node.node_name, b->u.block_node.node_nam= e); + break; + + case YANK_INSTANCE_TYPE_CHARDEV: + return !strcmp(a->u.chardev.id, b->u.chardev.id); + break; + + case YANK_INSTANCE_TYPE_MIGRATION: + return true; + break; + + default: + abort(); + } +} + +static YankInstanceEntry *yank_find_entry(const YankInstance *instance) +{ + YankInstanceEntry *entry; + + QLIST_FOREACH(entry, &yank_instance_list, next) { + if (yank_compare_instances(entry->instance, instance)) { + return entry; + } + } + return NULL; +} + +void yank_register_instance(const YankInstance *instance, Error **errp) +{ + YankInstanceEntry *entry; + + qemu_mutex_lock(&yank_lock); + + if (yank_find_entry(instance)) { + error_setg(errp, "duplicate yank instance"); + qemu_mutex_unlock(&yank_lock); + return; + } + + entry =3D g_slice_new(YankInstanceEntry); + entry->instance =3D QAPI_CLONE(YankInstance, instance); + QLIST_INIT(&entry->yankfns); + QLIST_INSERT_HEAD(&yank_instance_list, entry, next); + + qemu_mutex_unlock(&yank_lock); +} + +void yank_unregister_instance(const YankInstance *instance) +{ + YankInstanceEntry *entry; + + qemu_mutex_lock(&yank_lock); + entry =3D yank_find_entry(instance); + assert(entry); + + assert(QLIST_EMPTY(&entry->yankfns)); + QLIST_REMOVE(entry, next); + qapi_free_YankInstance(entry->instance); + g_slice_free(YankInstanceEntry, entry); + + qemu_mutex_unlock(&yank_lock); +} + +void yank_register_function(const YankInstance *instance, + YankFn *func, + void *opaque) +{ + YankInstanceEntry *entry; + YankFuncAndParam *func_entry; + + qemu_mutex_lock(&yank_lock); + entry =3D yank_find_entry(instance); + assert(entry); + + func_entry =3D g_slice_new(YankFuncAndParam); + func_entry->func =3D func; + func_entry->opaque =3D opaque; + + QLIST_INSERT_HEAD(&entry->yankfns, func_entry, next); + qemu_mutex_unlock(&yank_lock); +} + +void yank_unregister_function(const YankInstance *instance, + YankFn *func, + void *opaque) +{ + YankInstanceEntry *entry; + YankFuncAndParam *func_entry; + + qemu_mutex_lock(&yank_lock); + entry =3D yank_find_entry(instance); + assert(entry); + + QLIST_FOREACH(func_entry, &entry->yankfns, next) { + if (func_entry->func =3D=3D func && func_entry->opaque =3D=3D opaq= ue) { + QLIST_REMOVE(func_entry, next); + g_slice_free(YankFuncAndParam, func_entry); + qemu_mutex_unlock(&yank_lock); + return; + } + } + + abort(); +} + +void yank_generic_iochannel(void *opaque) +{ + QIOChannel *ioc =3D QIO_CHANNEL(opaque); + + qio_channel_shutdown(ioc, QIO_CHANNEL_SHUTDOWN_BOTH, NULL); +} + +void qmp_yank(YankInstanceList *instances, + Error **errp) +{ + YankInstanceList *tail; + YankInstanceEntry *entry; + YankFuncAndParam *func_entry; + + qemu_mutex_lock(&yank_lock); + for (tail =3D instances; tail; tail =3D tail->next) { + entry =3D yank_find_entry(tail->value); + if (!entry) { + error_set(errp, ERROR_CLASS_DEVICE_NOT_FOUND, "Instance not fo= und"); + qemu_mutex_unlock(&yank_lock); + return; + } + } + for (tail =3D instances; tail; tail =3D tail->next) { + entry =3D yank_find_entry(tail->value); + assert(entry); + QLIST_FOREACH(func_entry, &entry->yankfns, next) { + func_entry->func(func_entry->opaque); + } + } + qemu_mutex_unlock(&yank_lock); +} + +YankInstanceList *qmp_query_yank(Error **errp) +{ + YankInstanceEntry *entry; + YankInstanceList *ret; + + ret =3D NULL; + + qemu_mutex_lock(&yank_lock); + QLIST_FOREACH(entry, &yank_instance_list, next) { + YankInstanceList *new_entry; + new_entry =3D g_new0(YankInstanceList, 1); + new_entry->value =3D QAPI_CLONE(YankInstance, entry->instance); + new_entry->next =3D ret; + ret =3D new_entry; + } + qemu_mutex_unlock(&yank_lock); + + return ret; +} + +static void __attribute__((__constructor__)) yank_init(void) +{ + qemu_mutex_init(&yank_lock); +} -- 2.20.1 --Sig_/lGHQHFukjTCL.bXa6.QbNXb Content-Type: application/pgp-signature Content-Description: OpenPGP digital signature -----BEGIN PGP SIGNATURE----- iQIzBAEBCgAdFiEEg/qxWKDZuPtyYo+kNasLKJxdslgFAl+xEqEACgkQNasLKJxd slhgeQ//UxeVy9ZzWC0wKGQJ7sFoL2AOsRgpz+zhgGSLg2JDTz+aa2YW6u1PIpOd QU6jbE2yuAEfoh18+4JJHBRyvULq97RQ6dISel5SGX2zE8E4//PcTcsX6HtRV/7V G/kN5haIP1yCEgmiJ/R9l2r9+OkZOwzd/NKtR9w1AsAZuLTRckqt4MjQsU5GgXLz 7HFXWBF9SL7rODDfdBEmQFvQFeJadyLBeHAa4q+b6iO159FKu/tZOHQPT4mmjTSI x0saH0gEoWJ6VPXJSc2GBeHT6zxsGSeA6IZ/t4NSYfK5/Tc6J/LMawhD0dYxUHYw 22NvSfOBdTRmxNdN62R8WrtFfpYu5YrTK8cId4RwHkGgzX9k2ktx2EP2pC0RJYBx 0z+uXYtdtD1C6L/6Ta919oUQEqBcuCA4SSuuzatK+BzQztUz0grxnfWzR8jwQmnQ bGp3aCVUprys0msu6lf6SytMw5YuibtYlKJXpilQ7CoCh0XbW3urkTVwZxFPGMGQ 39bBUVqq25IesoYI1/TDletytNLxN9BSSIIZ74vMV27BolRTTi8cOle8PTed1O/M Y9I3h9iBw6oY9H+R1up1M7HmusBI43wUaXar4Uzwoy5CdUkUJZqll/Py24+yyluV ZYxf3HLFTAOpSmiGdBkAFmwHfgeVToyVor58hs51oQMonDpmDt8= =WNSN -----END PGP SIGNATURE----- --Sig_/lGHQHFukjTCL.bXa6.QbNXb-- From nobody Mon Apr 29 19:06:25 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=web.de ARC-Seal: i=1; a=rsa-sha256; t=1605440292; cv=none; d=zohomail.com; s=zohoarc; b=Ei6qce0PjXN6LyIkXCYCk8jeKBr9N6wxLU2Ez1hbzxiV7YLxt6sZ89o4KVAPmkvERL4apuF3aumfidZAXBoxO2PjdicntbgfylLnXXHY7g5887CvWsvg14QAzi99ZBpSs5dtDLNYrnThTOBwIpG+ksTJSk2BOOwnYpH+yIwQtlU= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1605440292; h=Content-Type:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=KkcqKiPsaivkGgT4sTWcgsbjwvd3TCD1FdSE7egvnQ4=; b=RcLTq87vL+tadHrKMuBK7yBVacT0F0ed4WBG5NuyWRqy0qUQWBn/iobfgWhY7x+8N6BoWQMASLAcfgNIF+srQ9FBy/Wg2kbYH/6txPbdKtp2T+vAZfzHPEdc2euNHMrMCAIDP0+KP+LqHN0LnMGamOFSnBSdorp9I9MQahCIlyk= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1605440292623346.0232013061749; Sun, 15 Nov 2020 03:38:12 -0800 (PST) Received: from localhost ([::1]:53486 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1keGMF-0006pc-FN for importer@patchew.org; Sun, 15 Nov 2020 06:38:11 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:57014) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1keGKN-0004tx-Qb; Sun, 15 Nov 2020 06:36:15 -0500 Received: from mout.web.de ([212.227.15.4]:45823) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1keGKL-0008FM-85; Sun, 15 Nov 2020 06:36:15 -0500 Received: from luklap ([87.123.206.172]) by smtp.web.de (mrweb004 [213.165.67.108]) with ESMTPSA (Nemesis) id 0LuIAZ-1kFTxx43zr-011gOm; Sun, 15 Nov 2020 12:36:07 +0100 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=web.de; s=dbaedf251592; t=1605440167; bh=w5u/TurdVtqqwpqqly6JdrVriXQLZl9jUyOIFeIdfFY=; h=X-UI-Sender-Class:Date:From:To:Cc:Subject:In-Reply-To:References; b=HikAQx9ftOFuD0KH9V/+sWYFW7yUDr9INqIpthlDb2y8mnnyF7GInNU+pF3beVEHl nf177eIQps5S2AD839b28cfiY4SdTxmM1vUoYzkCBBt8Ie96tvSoY5LdE1MSPHxnKu t1Tcm1v0QlLY30RKJArUIj6XN+udCAzJ3+i8GINw= X-UI-Sender-Class: c548c8c5-30a9-4db5-a2e7-cb6cb037b8f9 Date: Sun, 15 Nov 2020 12:36:05 +0100 From: Lukas Straub To: qemu-devel Subject: [PATCH v11 2/7] block/nbd.c: Add yank feature Message-ID: <14b78aebabb64b9f2ffaac025ee3b683bd7c9167.1605439674.git.lukasstraub2@web.de> In-Reply-To: References: MIME-Version: 1.0 Content-Type: multipart/signed; boundary="Sig_/CZLu4x/nddYetB.KdDiwQay"; protocol="application/pgp-signature"; micalg=pgp-sha512 X-Provags-ID: V03:K1:m/a6x3iO3LBhzyEU36G4nZAnMONYm5/Obtq7Idpgb1CD6RoJnT/ 2KJf3xbLbSagXnzgAhWFQrCfjCLAZxhHoAeP41f3ZENu/7v6rYFST6RS3xLk1GGj+gIb++4 UJ+VeA7BLYoTwWFS7/BR4aqjKc7GOpBk4xBuLn7EbhidiyQ88iJXDv7g1xWrF4AZgaN3IH3 TepRNj5MS4ZTUwm8gTGSQ== X-UI-Out-Filterresults: notjunk:1;V03:K0:ox1auFY+z1w=:0++ReZhz0NoLyBfagKyIhy HlYhcxu+HWS+SeyKkraiYxvr5izmkZ4gLSANFaY8kp95E5RoS4BxCVSaG/g3tEyL6zMHejoRF l1iNDjgSFUN9TiY/QkrH87LfFlze366kiI04KOgT9LqZIG6d6inCKSzciRU+kj1dWT45EF3XY 9fDs6mjCYV6ht4Kge20g0DevCppYMPc9E0a2fgc4ho8tpuFllNfPj1lWrZ97SqT2OeCTKcyO7 1cD+vrK+Dw+I1v8hveJwr5wOoMhydj/VQn7XYfBUBqaM07U1lhlbh4jZpFab4mcV/73Shwlav tWAp+0A/rkeqr8wFAPWt0s/cuqPUCOW1Ud/+YUrxaZ39c289fFPtfT5nHuSXmkeuPCnKVdm/e cY7ZFAgXLFK9PpWFnVyYaza9AqzUj1ytlV0UsH5/OEPmdb0p+eB5JkmSY1hL9+WzHUpat4k/D /EbooCMfw7s9xV8iBcKpsh+ayLp05eeHjs+OdnkfeukA8b57sSbkWFADRcO4S7amv9dxCPz6E 7NTi30saYUAfPBb/tA4ax63OJpsdnck8QjJiaotvRcM7E5Df2Pnx4HjG3JYaEvaUtZTe4g4Ez ArDnhLNjlTEoGtoO0V9ggmoQnEXjmEsBdMbS/E9SoUQqWSlIWBwiVHuIG2txj02O7mipNhMc2 b7VjwcJUfKt2w1Itg2WmSDOXH10VopzJuIrHmSX93o44AM+XkagO/KsMVNPz1Ct03aY0Zcczr bR6DxrUVik9agDZUF04uDuJQWB1wpnRpQlZDzSVW4ivLc97ouKA6pXPnPtGqc4AhOAA9COcD8 lvrJe5GZmUULEGF7bPoyps9K0u3XNTFn06vXHmLW+HlV1DtLqSrBWBCf2oyY1mANiSuPDPrnP FqEaMmXIE5gvtcWBaoCg== Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=212.227.15.4; envelope-from=lukasstraub2@web.de; helo=mout.web.de X-detected-operating-system: by eggs.gnu.org: First seen = 2020/11/15 06:19:13 X-ACL-Warn: Detected OS = Linux 2.2.x-3.x [generic] [fuzzy] X-Spam_score_int: -24 X-Spam_score: -2.5 X-Spam_bar: -- X-Spam_report: (-2.5 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_ENVFROM_END_DIGIT=0.25, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=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.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Kevin Wolf , "Daniel P. =?UTF-8?B?QmVycmFuZ8Op?=" , qemu-block , Juan Quintela , Markus Armbruster , "Dr. David Alan Gilbert" , Max Reitz , Paolo Bonzini , =?UTF-8?B?TWFyYy1BbmRy?= =?UTF-8?B?w6k=?= Lureau Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-Zoho-Virus-Status: 1 X-ZohoMail-DKIM: fail (Header signature does not verify) --Sig_/CZLu4x/nddYetB.KdDiwQay Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Register a yank function which shuts down the socket and sets s->state =3D NBD_CLIENT_QUIT. This is the same behaviour as if an error occured. Signed-off-by: Lukas Straub Acked-by: Stefan Hajnoczi Reviewed-by: Eric Blake --- block/nbd.c | 154 +++++++++++++++++++++++++++++++--------------------- 1 file changed, 93 insertions(+), 61 deletions(-) diff --git a/block/nbd.c b/block/nbd.c index 42536702b6..994d1e7b33 100644 --- a/block/nbd.c +++ b/block/nbd.c @@ -35,6 +35,7 @@ #include "qemu/option.h" #include "qemu/cutils.h" #include "qemu/main-loop.h" +#include "qemu/atomic.h" #include "qapi/qapi-visit-sockets.h" #include "qapi/qmp/qstring.h" @@ -44,6 +45,8 @@ #include "block/nbd.h" #include "block/block_int.h" +#include "qemu/yank.h" + #define EN_OPTSTR ":exportname=3D" #define MAX_NBD_REQUESTS 16 @@ -141,14 +144,13 @@ typedef struct BDRVNBDState { NBDConnectThread *connect_thread; } BDRVNBDState; -static QIOChannelSocket *nbd_establish_connection(SocketAddress *saddr, - Error **errp); -static QIOChannelSocket *nbd_co_establish_connection(BlockDriverState *bs, - Error **errp); +static int nbd_establish_connection(BlockDriverState *bs, SocketAddress *s= addr, + Error **errp); +static int nbd_co_establish_connection(BlockDriverState *bs, Error **errp); static void nbd_co_establish_connection_cancel(BlockDriverState *bs, bool detach); -static int nbd_client_handshake(BlockDriverState *bs, QIOChannelSocket *si= oc, - Error **errp); +static int nbd_client_handshake(BlockDriverState *bs, Error **errp); +static void nbd_yank(void *opaque); static void nbd_clear_bdrvstate(BDRVNBDState *s) { @@ -166,12 +168,12 @@ static void nbd_clear_bdrvstate(BDRVNBDState *s) static void nbd_channel_error(BDRVNBDState *s, int ret) { if (ret =3D=3D -EIO) { - if (s->state =3D=3D NBD_CLIENT_CONNECTED) { + if (qatomic_load_acquire(&s->state) =3D=3D NBD_CLIENT_CONNECTED) { s->state =3D s->reconnect_delay ? NBD_CLIENT_CONNECTING_WAIT : NBD_CLIENT_CONNECTING_NOWAIT; } } else { - if (s->state =3D=3D NBD_CLIENT_CONNECTED) { + if (qatomic_load_acquire(&s->state) =3D=3D NBD_CLIENT_CONNECTED) { qio_channel_shutdown(s->ioc, QIO_CHANNEL_SHUTDOWN_BOTH, NULL); } s->state =3D NBD_CLIENT_QUIT; @@ -204,7 +206,7 @@ static void reconnect_delay_timer_cb(void *opaque) { BDRVNBDState *s =3D opaque; - if (s->state =3D=3D NBD_CLIENT_CONNECTING_WAIT) { + if (qatomic_load_acquire(&s->state) =3D=3D NBD_CLIENT_CONNECTING_WAIT)= { s->state =3D NBD_CLIENT_CONNECTING_NOWAIT; while (qemu_co_enter_next(&s->free_sema, NULL)) { /* Resume all queued requests */ @@ -216,7 +218,7 @@ static void reconnect_delay_timer_cb(void *opaque) static void reconnect_delay_timer_init(BDRVNBDState *s, uint64_t expire_ti= me_ns) { - if (s->state !=3D NBD_CLIENT_CONNECTING_WAIT) { + if (qatomic_load_acquire(&s->state) !=3D NBD_CLIENT_CONNECTING_WAIT) { return; } @@ -261,7 +263,7 @@ static void nbd_client_attach_aio_context(BlockDriverSt= ate *bs, * s->connection_co is either yielded from nbd_receive_reply or from * nbd_co_reconnect_loop() */ - if (s->state =3D=3D NBD_CLIENT_CONNECTED) { + if (qatomic_load_acquire(&s->state) =3D=3D NBD_CLIENT_CONNECTED) { qio_channel_attach_aio_context(QIO_CHANNEL(s->ioc), new_context); } @@ -287,7 +289,7 @@ static void coroutine_fn nbd_client_co_drain_begin(Bloc= kDriverState *bs) reconnect_delay_timer_del(s); - if (s->state =3D=3D NBD_CLIENT_CONNECTING_WAIT) { + if (qatomic_load_acquire(&s->state) =3D=3D NBD_CLIENT_CONNECTING_WAIT)= { s->state =3D NBD_CLIENT_CONNECTING_NOWAIT; qemu_co_queue_restart_all(&s->free_sema); } @@ -338,13 +340,14 @@ static void nbd_teardown_connection(BlockDriverState = *bs) static bool nbd_client_connecting(BDRVNBDState *s) { - return s->state =3D=3D NBD_CLIENT_CONNECTING_WAIT || - s->state =3D=3D NBD_CLIENT_CONNECTING_NOWAIT; + NBDClientState state =3D qatomic_load_acquire(&s->state); + return state =3D=3D NBD_CLIENT_CONNECTING_WAIT || + state =3D=3D NBD_CLIENT_CONNECTING_NOWAIT; } static bool nbd_client_connecting_wait(BDRVNBDState *s) { - return s->state =3D=3D NBD_CLIENT_CONNECTING_WAIT; + return qatomic_load_acquire(&s->state) =3D=3D NBD_CLIENT_CONNECTING_WA= IT; } static void connect_bh(void *opaque) @@ -424,12 +427,12 @@ static void *connect_thread_func(void *opaque) return NULL; } -static QIOChannelSocket *coroutine_fn +static int coroutine_fn nbd_co_establish_connection(BlockDriverState *bs, Error **errp) { + int ret; QemuThread thread; BDRVNBDState *s =3D bs->opaque; - QIOChannelSocket *res; NBDConnectThread *thr =3D s->connect_thread; qemu_mutex_lock(&thr->mutex); @@ -446,10 +449,12 @@ nbd_co_establish_connection(BlockDriverState *bs, Err= or **errp) case CONNECT_THREAD_SUCCESS: /* Previous attempt finally succeeded in background */ thr->state =3D CONNECT_THREAD_NONE; - res =3D thr->sioc; + s->sioc =3D thr->sioc; thr->sioc =3D NULL; + yank_register_function(BLOCKDEV_YANK_INSTANCE(bs->node_name), + nbd_yank, bs); qemu_mutex_unlock(&thr->mutex); - return res; + return 0; case CONNECT_THREAD_RUNNING: /* Already running, will wait */ break; @@ -481,8 +486,13 @@ nbd_co_establish_connection(BlockDriverState *bs, Erro= r **errp) thr->state =3D CONNECT_THREAD_NONE; error_propagate(errp, thr->err); thr->err =3D NULL; - res =3D thr->sioc; + s->sioc =3D thr->sioc; thr->sioc =3D NULL; + if (s->sioc) { + yank_register_function(BLOCKDEV_YANK_INSTANCE(bs->node_name), + nbd_yank, bs); + } + ret =3D (s->sioc ? 0 : -1); break; case CONNECT_THREAD_RUNNING: case CONNECT_THREAD_RUNNING_DETACHED: @@ -491,7 +501,7 @@ nbd_co_establish_connection(BlockDriverState *bs, Error= **errp) * failed. Still connect thread is executing in background, and its * result may be used for next connection attempt. */ - res =3D NULL; + ret =3D -1; error_setg(errp, "Connection attempt cancelled by other operation"= ); break; @@ -508,7 +518,7 @@ nbd_co_establish_connection(BlockDriverState *bs, Error= **errp) qemu_mutex_unlock(&thr->mutex); - return res; + return ret; } /* @@ -561,7 +571,6 @@ static coroutine_fn void nbd_reconnect_attempt(BDRVNBDS= tate *s) { int ret; Error *local_err =3D NULL; - QIOChannelSocket *sioc; if (!nbd_client_connecting(s)) { return; @@ -594,21 +603,22 @@ static coroutine_fn void nbd_reconnect_attempt(BDRVNB= DState *s) /* Finalize previous connection if any */ if (s->ioc) { qio_channel_detach_aio_context(QIO_CHANNEL(s->ioc)); + yank_unregister_function(BLOCKDEV_YANK_INSTANCE(s->bs->node_name), + nbd_yank, s->bs); object_unref(OBJECT(s->sioc)); s->sioc =3D NULL; object_unref(OBJECT(s->ioc)); s->ioc =3D NULL; } - sioc =3D nbd_co_establish_connection(s->bs, &local_err); - if (!sioc) { + if (nbd_co_establish_connection(s->bs, &local_err) < 0) { ret =3D -ECONNREFUSED; goto out; } bdrv_dec_in_flight(s->bs); - ret =3D nbd_client_handshake(s->bs, sioc, &local_err); + ret =3D nbd_client_handshake(s->bs, &local_err); if (s->drained) { s->wait_drained_end =3D true; @@ -640,7 +650,7 @@ static coroutine_fn void nbd_co_reconnect_loop(BDRVNBDS= tate *s) uint64_t timeout =3D 1 * NANOSECONDS_PER_SECOND; uint64_t max_timeout =3D 16 * NANOSECONDS_PER_SECOND; - if (s->state =3D=3D NBD_CLIENT_CONNECTING_WAIT) { + if (qatomic_load_acquire(&s->state) =3D=3D NBD_CLIENT_CONNECTING_WAIT)= { reconnect_delay_timer_init(s, qemu_clock_get_ns(QEMU_CLOCK_REALTIM= E) + s->reconnect_delay * NANOSECONDS_PER_SE= COND); } @@ -683,7 +693,7 @@ static coroutine_fn void nbd_connection_entry(void *opa= que) int ret =3D 0; Error *local_err =3D NULL; - while (s->state !=3D NBD_CLIENT_QUIT) { + while (qatomic_load_acquire(&s->state) !=3D NBD_CLIENT_QUIT) { /* * The NBD client can only really be considered idle when it has * yielded from qio_channel_readv_all_eof(), waiting for data. Thi= s is @@ -698,7 +708,7 @@ static coroutine_fn void nbd_connection_entry(void *opa= que) nbd_co_reconnect_loop(s); } - if (s->state !=3D NBD_CLIENT_CONNECTED) { + if (qatomic_load_acquire(&s->state) !=3D NBD_CLIENT_CONNECTED) { continue; } @@ -753,6 +763,8 @@ static coroutine_fn void nbd_connection_entry(void *opa= que) s->connection_co =3D NULL; if (s->ioc) { qio_channel_detach_aio_context(QIO_CHANNEL(s->ioc)); + yank_unregister_function(BLOCKDEV_YANK_INSTANCE(s->bs->node_name), + nbd_yank, s->bs); object_unref(OBJECT(s->sioc)); s->sioc =3D NULL; object_unref(OBJECT(s->ioc)); @@ -777,7 +789,7 @@ static int nbd_co_send_request(BlockDriverState *bs, qemu_co_queue_wait(&s->free_sema, &s->send_mutex); } - if (s->state !=3D NBD_CLIENT_CONNECTED) { + if (qatomic_load_acquire(&s->state) !=3D NBD_CLIENT_CONNECTED) { rc =3D -EIO; goto err; } @@ -804,7 +816,8 @@ static int nbd_co_send_request(BlockDriverState *bs, if (qiov) { qio_channel_set_cork(s->ioc, true); rc =3D nbd_send_request(s->ioc, request); - if (rc >=3D 0 && s->state =3D=3D NBD_CLIENT_CONNECTED) { + if (qatomic_load_acquire(&s->state) =3D=3D NBD_CLIENT_CONNECTED && + rc >=3D 0) { if (qio_channel_writev_all(s->ioc, qiov->iov, qiov->niov, NULL) < 0) { rc =3D -EIO; @@ -1129,7 +1142,7 @@ static coroutine_fn int nbd_co_do_receive_one_chunk( s->requests[i].receiving =3D true; qemu_coroutine_yield(); s->requests[i].receiving =3D false; - if (s->state !=3D NBD_CLIENT_CONNECTED) { + if (qatomic_load_acquire(&s->state) !=3D NBD_CLIENT_CONNECTED) { error_setg(errp, "Connection closed"); return -EIO; } @@ -1288,7 +1301,7 @@ static bool nbd_reply_chunk_iter_receive(BDRVNBDState= *s, NBDReply local_reply; NBDStructuredReplyChunk *chunk; Error *local_err =3D NULL; - if (s->state !=3D NBD_CLIENT_CONNECTED) { + if (qatomic_load_acquire(&s->state) !=3D NBD_CLIENT_CONNECTED) { error_setg(&local_err, "Connection closed"); nbd_iter_channel_error(iter, -EIO, &local_err); goto break_loop; @@ -1313,7 +1326,8 @@ static bool nbd_reply_chunk_iter_receive(BDRVNBDState= *s, } /* Do not execute the body of NBD_FOREACH_REPLY_CHUNK for simple reply= . */ - if (nbd_reply_is_simple(reply) || s->state !=3D NBD_CLIENT_CONNECTED) { + if (nbd_reply_is_simple(reply) || + qatomic_load_acquire(&s->state) !=3D NBD_CLIENT_CONNECTED) { goto break_loop; } @@ -1745,6 +1759,15 @@ static int nbd_client_reopen_prepare(BDRVReopenState= *state, return 0; } +static void nbd_yank(void *opaque) +{ + BlockDriverState *bs =3D opaque; + BDRVNBDState *s =3D (BDRVNBDState *)bs->opaque; + + qatomic_store_release(&s->state, NBD_CLIENT_QUIT); + qio_channel_shutdown(QIO_CHANNEL(s->sioc), QIO_CHANNEL_SHUTDOWN_BOTH, = NULL); +} + static void nbd_client_close(BlockDriverState *bs) { BDRVNBDState *s =3D (BDRVNBDState *)bs->opaque; @@ -1757,52 +1780,53 @@ static void nbd_client_close(BlockDriverState *bs) nbd_teardown_connection(bs); } -static QIOChannelSocket *nbd_establish_connection(SocketAddress *saddr, - Error **errp) +static int nbd_establish_connection(BlockDriverState *bs, + SocketAddress *saddr, + Error **errp) { ERRP_GUARD(); - QIOChannelSocket *sioc; + BDRVNBDState *s =3D (BDRVNBDState *)bs->opaque; - sioc =3D qio_channel_socket_new(); - qio_channel_set_name(QIO_CHANNEL(sioc), "nbd-client"); + s->sioc =3D qio_channel_socket_new(); + qio_channel_set_name(QIO_CHANNEL(s->sioc), "nbd-client"); - qio_channel_socket_connect_sync(sioc, saddr, errp); + qio_channel_socket_connect_sync(s->sioc, saddr, errp); if (*errp) { - object_unref(OBJECT(sioc)); - return NULL; + object_unref(OBJECT(s->sioc)); + s->sioc =3D NULL; + return -1; } - qio_channel_set_delay(QIO_CHANNEL(sioc), false); + yank_register_function(BLOCKDEV_YANK_INSTANCE(bs->node_name), nbd_yank= , bs); + qio_channel_set_delay(QIO_CHANNEL(s->sioc), false); - return sioc; + return 0; } -/* nbd_client_handshake takes ownership on sioc. On failure it is unref'ed= . */ -static int nbd_client_handshake(BlockDriverState *bs, QIOChannelSocket *si= oc, - Error **errp) +/* nbd_client_handshake takes ownership on s->sioc. On failure it's unref'= ed. */ +static int nbd_client_handshake(BlockDriverState *bs, Error **errp) { BDRVNBDState *s =3D (BDRVNBDState *)bs->opaque; AioContext *aio_context =3D bdrv_get_aio_context(bs); int ret; trace_nbd_client_handshake(s->export); - - s->sioc =3D sioc; - - qio_channel_set_blocking(QIO_CHANNEL(sioc), false, NULL); - qio_channel_attach_aio_context(QIO_CHANNEL(sioc), aio_context); + qio_channel_set_blocking(QIO_CHANNEL(s->sioc), false, NULL); + qio_channel_attach_aio_context(QIO_CHANNEL(s->sioc), aio_context); s->info.request_sizes =3D true; s->info.structured_reply =3D true; s->info.base_allocation =3D true; s->info.x_dirty_bitmap =3D g_strdup(s->x_dirty_bitmap); s->info.name =3D g_strdup(s->export ?: ""); - ret =3D nbd_receive_negotiate(aio_context, QIO_CHANNEL(sioc), s->tlscr= eds, + ret =3D nbd_receive_negotiate(aio_context, QIO_CHANNEL(s->sioc), s->tl= screds, s->hostname, &s->ioc, &s->info, errp); g_free(s->info.x_dirty_bitmap); g_free(s->info.name); if (ret < 0) { - object_unref(OBJECT(sioc)); + yank_unregister_function(BLOCKDEV_YANK_INSTANCE(bs->node_name), + nbd_yank, bs); + object_unref(OBJECT(s->sioc)); s->sioc =3D NULL; return ret; } @@ -1835,7 +1859,7 @@ static int nbd_client_handshake(BlockDriverState *bs,= QIOChannelSocket *sioc, } if (!s->ioc) { - s->ioc =3D QIO_CHANNEL(sioc); + s->ioc =3D QIO_CHANNEL(s->sioc); object_ref(OBJECT(s->ioc)); } @@ -1851,9 +1875,11 @@ static int nbd_client_handshake(BlockDriverState *bs= , QIOChannelSocket *sioc, { NBDRequest request =3D { .type =3D NBD_CMD_DISC }; - nbd_send_request(s->ioc ?: QIO_CHANNEL(sioc), &request); + nbd_send_request(s->ioc ?: QIO_CHANNEL(s->sioc), &request); - object_unref(OBJECT(sioc)); + yank_unregister_function(BLOCKDEV_YANK_INSTANCE(bs->node_name), + nbd_yank, bs); + object_unref(OBJECT(s->sioc)); s->sioc =3D NULL; return ret; @@ -2245,7 +2271,6 @@ static int nbd_open(BlockDriverState *bs, QDict *opti= ons, int flags, { int ret; BDRVNBDState *s =3D (BDRVNBDState *)bs->opaque; - QIOChannelSocket *sioc; ret =3D nbd_process_options(bs, options, errp); if (ret < 0) { @@ -2256,17 +2281,23 @@ static int nbd_open(BlockDriverState *bs, QDict *op= tions, int flags, qemu_co_mutex_init(&s->send_mutex); qemu_co_queue_init(&s->free_sema); + yank_register_instance(BLOCKDEV_YANK_INSTANCE(bs->node_name), errp); + if (*errp) { + return -EEXIST; + } + /* * establish TCP connection, return error if it fails * TODO: Configurable retry-until-timeout behaviour. */ - sioc =3D nbd_establish_connection(s->saddr, errp); - if (!sioc) { + if (nbd_establish_connection(bs, s->saddr, errp) < 0) { + yank_unregister_instance(BLOCKDEV_YANK_INSTANCE(bs->node_name)); return -ECONNREFUSED; } - ret =3D nbd_client_handshake(bs, sioc, errp); + ret =3D nbd_client_handshake(bs, errp); if (ret < 0) { + yank_unregister_instance(BLOCKDEV_YANK_INSTANCE(bs->node_name)); nbd_clear_bdrvstate(s); return ret; } @@ -2326,6 +2357,7 @@ static void nbd_close(BlockDriverState *bs) BDRVNBDState *s =3D bs->opaque; nbd_client_close(bs); + yank_unregister_instance(BLOCKDEV_YANK_INSTANCE(bs->node_name)); nbd_clear_bdrvstate(s); } -- 2.20.1 --Sig_/CZLu4x/nddYetB.KdDiwQay Content-Type: application/pgp-signature Content-Description: OpenPGP digital signature -----BEGIN PGP SIGNATURE----- iQIzBAEBCgAdFiEEg/qxWKDZuPtyYo+kNasLKJxdslgFAl+xEqUACgkQNasLKJxd slg1dhAAmcEmqG7g8/Hv0gUGcaKhpHS7Ybcapoe0Eytnm6PRviJ4en2tj3YlrBpO 0w2p44RWwxHTB6aXlrpG/XPon9jkuRM6uKQRbLsD2JhEHnm+v0w+zQXxPOj3k7ql pE24bw43Jzkt2qIH2x9P6u7LJe61pQbSsjnIrp0IfeyEGOVirh0sK2AYPQJuXYGn IFddUDINLfK5c7Ji5b15kiB3/Lf2X49Rkjg190i01fth9HB1WFhnq7mnAHeSf8aI tQ27kTbjJOzMAqGavK/eY5E6cL1MsQVcKbhkGmO5ywtzqg/yT38EPUy7TM0VcuNj dujaszko290DUOsjka/qL9Qo1yvvLDLJzDuolc9GDb/HAmH7KbRIJ/jtQfeptxMt 5AD07zY1KRdsetox4QVo/k+/xu6C8I05j1kbaqcIUyLaDBLVrNPvWccqGvbMXWaa k7cYSNABK6pJZrVJzldlIYizoi0LlZ642ERmLGWZDxwCevdGpzWOoO97RbbrMMYv B9HXrbK2tbu02RapcCfQlILyeJQ27wv2RI9MCxn6VXrNu0+tg71b0Ycu30BqG25a 4vwqSsuTrxsG6XB5Ac0SnApvNhhaINIbja2iF7FL+iQVSaRc1AdlrzRdFjMfNatZ pPkDecRuV1j+NqW0IWbz3SefnLr2A8sGK34Qr49+rYFkeKp0yNY= =XVJm -----END PGP SIGNATURE----- --Sig_/CZLu4x/nddYetB.KdDiwQay-- From nobody Mon Apr 29 19:06:25 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=web.de ARC-Seal: i=1; a=rsa-sha256; t=1605440290; cv=none; d=zohomail.com; s=zohoarc; b=a/Ka6DfuKsjFuisg7U943LsKx7WOINjyZ1Vw1XuceaxmVjXdKfDzty6l4fa4t90YuiKVmwIsFLh9wAcps8IYANVoTIJkruamt3c6NSWppSUCsHMErTN0goTdmwUPXdSJTm4KPjTJ6+v3sJfGKS6ejnp5ztUC/13WL0KYApsJA2s= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1605440290; h=Content-Type:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=2JsHL6MtHBN2VA/1a0aq/wttgPZgchF+zYiohgb1d6k=; b=T2c2P7wVojU3HdPzZF5biPMMmEvbv7BukriyieRqghkHoEplnbJ3TkkLs27GiqsRNHAuGLAXYA+DXXH+gHI9NRGlw+/GixonoaVDvnZYadQhk+hW25iyn/DA83LP/iugYOC1nPY3U3Yjqb+PVGU+D2S5P+gmcx+MzywW7AyXLfk= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1605440290307289.7857072300768; Sun, 15 Nov 2020 03:38:10 -0800 (PST) Received: from localhost ([::1]:53306 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1keGMD-0006l3-3F for importer@patchew.org; Sun, 15 Nov 2020 06:38:09 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:57028) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1keGKR-00051x-2B; Sun, 15 Nov 2020 06:36:19 -0500 Received: from mout.web.de ([212.227.17.11]:37535) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1keGKP-0008GO-2F; Sun, 15 Nov 2020 06:36:18 -0500 Received: from luklap ([87.123.206.172]) by smtp.web.de (mrweb103 [213.165.67.124]) with ESMTPSA (Nemesis) id 0MI63m-1ki7fw3KaU-003szT; Sun, 15 Nov 2020 12:36:10 +0100 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=web.de; s=dbaedf251592; t=1605440171; bh=FbHZ1OXiBweTFVG2ZYn66/YFqMCzwwjYRQFr7/zvHnw=; h=X-UI-Sender-Class:Date:From:To:Cc:Subject:In-Reply-To:References; b=gbWlrSeHOgqI3yv7bKb+vv77M8JGgYAmH1ZCXD2vFDMFpOpAXv6zI2qbZyZWuPhV/ Zi7kS3MBlpGsDVfbTDx/vISIBHzJlRKmdI7QfFMuonvcnYoBMK6CSJgcrPg6aEDVmU Td2PIzVi8he3orQDVuOH6+ef+MLZaRWQT5FSwedY= X-UI-Sender-Class: c548c8c5-30a9-4db5-a2e7-cb6cb037b8f9 Date: Sun, 15 Nov 2020 12:36:09 +0100 From: Lukas Straub To: qemu-devel Subject: [PATCH v11 3/7] chardev/char-socket.c: Add yank feature Message-ID: <0c8b573bc608df476767a612f4303eb2dfc3b7bd.1605439674.git.lukasstraub2@web.de> In-Reply-To: References: MIME-Version: 1.0 Content-Type: multipart/signed; boundary="Sig_/iRyfdbDEBPIyWdTGPeW.cJ_"; protocol="application/pgp-signature"; micalg=pgp-sha512 X-Provags-ID: V03:K1:XtcSClyQ7xHcMubuEVGRkheh4pGtJZdcCIpa1N03iLLZCPrRGZg 6KhF2OwFCEAx2U/oigUZXWI5XO2KqD93Tfj5cRZ3DgxCQFctq/+MfBNcQI6g/9VrAD3g5AF 4DeXiQ3eEcSW8aHWZMlOvGNxm5fbFbobWNy71Z75wQROqRwiz7dSlhRNOh4shNMpdYVysOQ yGU2zvD6am+BTYXc8Ijdw== X-UI-Out-Filterresults: notjunk:1;V03:K0:wN2oaNoW1ao=:F3T9i3WIVNXsspJbm+OKsz DVN1ScdMDc6zz1Isj4hDRgNnKkae9rzDisjQwDDwWi3IWB40PpSv1k+2ZLFqCZbFDaulI5PlY //VOnDwHmL0v/MB+PKL3JgCyPWOBMf9pv1u1/2vjeGuyUSd2I7itcj+FnooMCPx72I0/5MvpM nr+fQDxYUOlThjnp5kcajG35gvEd8H89qdNQV9hzhzzgOz7EarYnxq2mGV58Mr6emdazZ1X2m I4jD11DUUk0EMSwkwiR0E5GP7LnhYxbDGb57JQIJDO/ByCIcd1O4ffKs6j+ngt/BhguTDcgYP pLBjb1P1QSFthUWm/Uf0byE43IeSCMmKqjc6a6wW/5coFjuxBLbbS2Qa6l0HrDqRihX8q4IS2 p+eKW25rozlBPWuo4nlFWvJvi7GNiKhvGerHx/NeItnzlMbiZbtYpXeS215kVriHv2oL5zE4R b3KjZwCgdtDK/bi0mqq5zqtoKeSXzZBjH5CNCu/yCF4gYIx5cBZUJaOS+0YmtRx/mQGIKpkEF oMWKa6t8aWopPvdQgEhKL6ifTTA/34URljHpyAxyVnnTHIS5g33uISQGscYK5M+SLfB+Xw/W+ IhFM86rP26GP/ExVKs+IzMIsdHwlw0Sue7cZrNu3PDJD+wVcjVy8lopN3GIW6k7YLoLc92OAt ahZxaT+0lEsvLu9rfEFBaOvEB8ixa6wEIlVq+feFLC3Xlv09p/EAxqrB0GWO55Nr096arbXne 8xpe5fn15JuRFxhtbyzI0Bxh4gd6xdlvJxBr3Ni0hc2mLajiStCs+2aZwpB0x5E7+MlulTSgD vsO7Aihi6GJSQeJC+OGNNHwDKNkE1l5ON384gUtAkwujOWH0qM/+rl+zbXe5LGzfrpCsIHGOQ VAAErJS1hG93VOmmzDBw== Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=212.227.17.11; envelope-from=lukasstraub2@web.de; helo=mout.web.de X-detected-operating-system: by eggs.gnu.org: First seen = 2020/11/15 06:19:18 X-ACL-Warn: Detected OS = Linux 2.2.x-3.x [generic] [fuzzy] X-Spam_score_int: -24 X-Spam_score: -2.5 X-Spam_bar: -- X-Spam_report: (-2.5 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_ENVFROM_END_DIGIT=0.25, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=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.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Kevin Wolf , "Daniel P. =?UTF-8?B?QmVycmFuZ8Op?=" , qemu-block , Juan Quintela , Markus Armbruster , "Dr. David Alan Gilbert" , Max Reitz , Paolo Bonzini , =?UTF-8?B?TWFyYy1BbmRy?= =?UTF-8?B?w6k=?= Lureau Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-Zoho-Virus-Status: 1 X-ZohoMail-DKIM: fail (Header signature does not verify) --Sig_/iRyfdbDEBPIyWdTGPeW.cJ_ Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Register a yank function to shutdown the socket on yank. Signed-off-by: Lukas Straub Acked-by: Stefan Hajnoczi --- chardev/char-socket.c | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/chardev/char-socket.c b/chardev/char-socket.c index 213a4c8dd0..7f2ee9a338 100644 --- a/chardev/char-socket.c +++ b/chardev/char-socket.c @@ -34,6 +34,7 @@ #include "qapi/error.h" #include "qapi/clone-visitor.h" #include "qapi/qapi-visit-sockets.h" +#include "qemu/yank.h" #include "chardev/char-io.h" #include "qom/object.h" @@ -70,6 +71,7 @@ struct SocketChardev { size_t read_msgfds_num; int *write_msgfds; size_t write_msgfds_num; + bool registered_yank; SocketAddress *addr; bool is_listen; @@ -415,6 +417,12 @@ static void tcp_chr_free_connection(Chardev *chr) tcp_set_msgfds(chr, NULL, 0); remove_fd_in_watch(chr); + if (s->state =3D=3D TCP_CHARDEV_STATE_CONNECTING + || s->state =3D=3D TCP_CHARDEV_STATE_CONNECTED) { + yank_unregister_function(CHARDEV_YANK_INSTANCE(chr->label), + yank_generic_iochannel, + QIO_CHANNEL(s->sioc)); + } object_unref(OBJECT(s->sioc)); s->sioc =3D NULL; object_unref(OBJECT(s->ioc)); @@ -932,6 +940,9 @@ static int tcp_chr_add_client(Chardev *chr, int fd) } tcp_chr_change_state(s, TCP_CHARDEV_STATE_CONNECTING); tcp_chr_set_client_ioc_name(chr, sioc); + yank_register_function(CHARDEV_YANK_INSTANCE(chr->label), + yank_generic_iochannel, + QIO_CHANNEL(sioc)); ret =3D tcp_chr_new_client(chr, sioc); object_unref(OBJECT(sioc)); return ret; @@ -946,6 +957,9 @@ static void tcp_chr_accept(QIONetListener *listener, tcp_chr_change_state(s, TCP_CHARDEV_STATE_CONNECTING); tcp_chr_set_client_ioc_name(chr, cioc); + yank_register_function(CHARDEV_YANK_INSTANCE(chr->label), + yank_generic_iochannel, + QIO_CHANNEL(cioc)); tcp_chr_new_client(chr, cioc); } @@ -961,6 +975,9 @@ static int tcp_chr_connect_client_sync(Chardev *chr, Er= ror **errp) object_unref(OBJECT(sioc)); return -1; } + yank_register_function(CHARDEV_YANK_INSTANCE(chr->label), + yank_generic_iochannel, + QIO_CHANNEL(sioc)); tcp_chr_new_client(chr, sioc); object_unref(OBJECT(sioc)); return 0; @@ -976,6 +993,9 @@ static void tcp_chr_accept_server_sync(Chardev *chr) tcp_chr_change_state(s, TCP_CHARDEV_STATE_CONNECTING); sioc =3D qio_net_listener_wait_client(s->listener); tcp_chr_set_client_ioc_name(chr, sioc); + yank_register_function(CHARDEV_YANK_INSTANCE(chr->label), + yank_generic_iochannel, + QIO_CHANNEL(sioc)); tcp_chr_new_client(chr, sioc); object_unref(OBJECT(sioc)); } @@ -1086,6 +1106,9 @@ static void char_socket_finalize(Object *obj) object_unref(OBJECT(s->tls_creds)); } g_free(s->tls_authz); + if (s->registered_yank) { + yank_unregister_instance(CHARDEV_YANK_INSTANCE(chr->label)); + } qemu_chr_be_event(chr, CHR_EVENT_CLOSED); } @@ -1101,6 +1124,9 @@ static void qemu_chr_socket_connected(QIOTask *task, = void *opaque) if (qio_task_propagate_error(task, &err)) { tcp_chr_change_state(s, TCP_CHARDEV_STATE_DISCONNECTED); + yank_unregister_function(CHARDEV_YANK_INSTANCE(chr->label), + yank_generic_iochannel, + QIO_CHANNEL(sioc)); check_report_connect_error(chr, err); goto cleanup; } @@ -1134,6 +1160,9 @@ static void tcp_chr_connect_client_async(Chardev *chr) tcp_chr_change_state(s, TCP_CHARDEV_STATE_CONNECTING); sioc =3D qio_channel_socket_new(); tcp_chr_set_client_ioc_name(chr, sioc); + yank_register_function(CHARDEV_YANK_INSTANCE(chr->label), + yank_generic_iochannel, + QIO_CHANNEL(sioc)); /* * Normally code would use the qio_channel_socket_connect_async * method which uses a QIOTask + qio_task_set_error internally @@ -1376,6 +1405,12 @@ static void qmp_chardev_open_socket(Chardev *chr, qemu_chr_set_feature(chr, QEMU_CHAR_FEATURE_FD_PASS); } + yank_register_instance(CHARDEV_YANK_INSTANCE(chr->label), errp); + if (*errp) { + return; + } + s->registered_yank =3D true; + /* be isn't opened until we get a connection */ *be_opened =3D false; -- 2.20.1 --Sig_/iRyfdbDEBPIyWdTGPeW.cJ_ Content-Type: application/pgp-signature Content-Description: OpenPGP digital signature -----BEGIN PGP SIGNATURE----- iQIzBAEBCgAdFiEEg/qxWKDZuPtyYo+kNasLKJxdslgFAl+xEqkACgkQNasLKJxd sljKMQ/+IiPquplTOCutYGToUw49USUYvJUbouQ6o20ltwUhkoMsL5XW/iHr+miT j3p1pYUCv6Z3xmG0an5Fm5mGkqY091k/0SGFYp5fBMXhKBP8WUGYal6ggx8V3xAI DLLZeGEr2oQ56SbCMsnmpewNb9LSO9Ps/BGePfnMKBVrj3q0ljglQDypKAc3WnyO z4zv7X5YtACNEwwlGESYCf4GkPyyDZsNQQmj55IfGt83Xg6rdNavjoHaVw1dbbcT kF2PEwKsAymif8oWBSqod7l6m5W8UV6BJfSErMCCwgiSvzpv5MyDJxmaJSgvefOU 3306n8s24gyN4/GLmN10jW01iDSPH1REu0IRIV1ty17n1PW+bqknEAuacDbTbSv7 lsJ48vAVoutzxXD86dCmp7GGooe0EuJEJIy/AMIjKyzLH+gazzJXqSCDCVIks3b7 MV0bpAYXcd/t8JKoGNGRhoG5tcPHm8L+eX2UG1Ch1c31Mso4NN7UR32qYiGxGiaU CaEVhQbOWInmCOaYItiKR2p7q0/WIfh4ewLftT2406YGJ6tf3CkeBWUdO4R+xH/J SGFBT+taefxEFTMqLPvxqtdBlcUp4E8gUajSrq23ZQva+cIsLFD+NVGDUQlPmvcf D/kRkkHOZPENDBSNLwfzSsyQjNVpXyzNtPkRoJwwBDlDtd6yPpg= =Vow4 -----END PGP SIGNATURE----- --Sig_/iRyfdbDEBPIyWdTGPeW.cJ_-- From nobody Mon Apr 29 19:06:25 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=web.de ARC-Seal: i=1; a=rsa-sha256; t=1605440431; cv=none; d=zohomail.com; s=zohoarc; b=aBP3vocCw/BfKgQuQ/rm450xgvxUXsnGR3nORA59ZVdFfnzX8zFJnY15TWXqJlEump+5vnbyjGEETJsriExFfr9hEHPoFX1NPLuFtULA3aY12yb2ksm9X+177FD5rjYCaULPPE8oWIfWWw6TqkS2wmWwLgrTrZnOeWinVNUto3Y= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1605440431; h=Content-Type:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=KEqOWjiN3ifdzVrjiM/5DrIwr3X5HjMtufKl83vbrIY=; b=gPG4kkJKjTjBmq+fEPz8qiztNjGVHbTErZCd8ycszC+7poqC1kz1gKnextC+1mtedN753qixFXOaGIC59N35X2qyiQK9AXjMmw49EDM0gIRNFbBSklC25eY9B2l3cmKeYoMxWTgKrEfot7IT7KPyy9rY4qD0XZPQx/hCMlfhOU4= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1605440430998638.779857121746; Sun, 15 Nov 2020 03:40:30 -0800 (PST) Received: from localhost ([::1]:33410 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1keGOT-0001il-Pt for importer@patchew.org; Sun, 15 Nov 2020 06:40:29 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:57040) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1keGKU-0005A1-Da; Sun, 15 Nov 2020 06:36:22 -0500 Received: from mout.web.de ([212.227.15.3]:51063) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1keGKS-0008HQ-9Z; Sun, 15 Nov 2020 06:36:22 -0500 Received: from luklap ([87.123.206.172]) by smtp.web.de (mrweb004 [213.165.67.108]) with ESMTPSA (Nemesis) id 0MP2Sl-1kbDvV0KRz-006R2I; Sun, 15 Nov 2020 12:36:14 +0100 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=web.de; s=dbaedf251592; t=1605440174; bh=aOQZxDWLmA3ottt++HvQsb09XxJx64I2LDDCqr2+C3Q=; h=X-UI-Sender-Class:Date:From:To:Cc:Subject:In-Reply-To:References; b=OAqw/ZzjdvuCZ9tSBiXHSAw38C+gcz5IiFPpMNjav/t1dPIQn0onvVb02HG6r1Oc3 42aue7wf9M4Ybri2XvI0mPqL7GvvHVp8Y/IoSw6Bw8CHgLony0GfWGjqOd+ndY1I1e CQlVUtOVl0pg72/kjjCoPHpHPATjb+NacVMqA9S8= X-UI-Sender-Class: c548c8c5-30a9-4db5-a2e7-cb6cb037b8f9 Date: Sun, 15 Nov 2020 12:36:13 +0100 From: Lukas Straub To: qemu-devel Subject: [PATCH v11 4/7] migration: Add yank feature Message-ID: <483f47c06989ca8bf39ec2fd2233f429c677c5c9.1605439674.git.lukasstraub2@web.de> In-Reply-To: References: MIME-Version: 1.0 Content-Type: multipart/signed; boundary="Sig_/0sphafSrhgVLntwwPNZcnGP"; protocol="application/pgp-signature"; micalg=pgp-sha512 X-Provags-ID: V03:K1:mWoH5/HcwcRKM0Np/7jisdUpxLgKel3/Bq2HWGoTcCiZebGz5Tp uvgm0fKpERkMbprrEYRTEWGXBIHUd4E2w2pPFwLJVkdCZpc0ROdRP73UrkD0I897tRGzax+ rf73ehmMZwE/BwfcjizC63s2psBZmR8yQBBC1DgMzDluFvBcMn0PfRyfC+BzijXaiQ8ZjfV 4bY/7bYzTyvS+RICl9+4w== X-UI-Out-Filterresults: notjunk:1;V03:K0:0ZyHuWxBLxo=:JCYFZnJgMItf++0oi9Bqss 0G9wUwQ9d3cit890S4mi/vDiARro3Yhpzt64HM82GKfStRjkKesCO5x3I1CxL6Kke8P9trGyX 8bluvtM0zSwcj4ewXEbIl8ex1B07tkYlXnDUA2qMZ9TpyHbcyxst0PEjSbcxPysei02RaUAdk zKR+oiUU+BMzIhGgm6MbnOoWZ4BiX4vUjyZV+gWBSjfZGuw2FnBccgKl4D958n7schD1E6lXM gxEc5dXNd/J1RsvlezhMZmoxXlDHS7ThWrfUMnJEAwlRM0DvNI5lthPuowf/11vXRacnwLKh9 iixiWz3cHxzq77AIIJU56rCWw8V0h98pLX8gIT8m5ynIcEBIarP76Dm4ndihYNeqCPFF+jchb bX2zTyZUXQ8X4O876as8mq4h7PNMUK+Q/2pwn299oFDhgPsNj0M5n3+s3nhlqhA9AdNO59kxB 9uutchKVqH6oomaIvoG8crMd/GeKOKbmFK3JHgs38WJA9+VS2gehhcuAcqQMPBhN488GJH63L U2dBsUW+3vhCu2vtJee8dy70sLvt+Egl83NWS+fflgcSjI19mlDS+XgjgVEeGlAtL5jmUVocp I0gFgVE+qokk2fsVMAAnl2ajK0ktqerbSE+wfZgLeBeOWNr15H0StdQT/fE16pQz5nD8BMYoI hiWT9FXfowV9rlHy+aJJguFO/07SvMkuK7CVKLIBtU9LKDiE3B5RsHMxeBvkQZkgFVZTqpgWY EvZUgUdM4Y9BBU9xle249Qs1TYMbQRq3P6JhUjDTy7OAjWepQ8OUmiOvYYX2pkEqxg/ng3oB2 Q69RVd7WUzf1yvW5mRKL8FZL+GAVQE8/ODM6xZ7OSlKPDRjYgdYt1ijmD6zTgYvBnpI99/kIH /UBilirGGYYGmeYnV/ig== Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=212.227.15.3; envelope-from=lukasstraub2@web.de; helo=mout.web.de X-detected-operating-system: by eggs.gnu.org: First seen = 2020/11/15 06:36:18 X-ACL-Warn: Detected OS = Linux 3.11 and newer [fuzzy] X-Spam_score_int: -24 X-Spam_score: -2.5 X-Spam_bar: -- X-Spam_report: (-2.5 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_ENVFROM_END_DIGIT=0.25, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=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.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Kevin Wolf , "Daniel P. =?UTF-8?B?QmVycmFuZ8Op?=" , qemu-block , Juan Quintela , Markus Armbruster , "Dr. David Alan Gilbert" , Max Reitz , Paolo Bonzini , =?UTF-8?B?TWFyYy1BbmRy?= =?UTF-8?B?w6k=?= Lureau Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-Zoho-Virus-Status: 1 X-ZohoMail-DKIM: fail (Header signature does not verify) --Sig_/0sphafSrhgVLntwwPNZcnGP Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Register yank functions on sockets to shut them down. Signed-off-by: Lukas Straub Acked-by: Stefan Hajnoczi Acked-by: Dr. David Alan Gilbert --- migration/channel.c | 13 +++++++++++++ migration/migration.c | 25 +++++++++++++++++++++++++ migration/multifd.c | 10 ++++++++++ migration/qemu-file-channel.c | 7 +++++++ migration/savevm.c | 6 ++++++ 5 files changed, 61 insertions(+) diff --git a/migration/channel.c b/migration/channel.c index 8a783baa0b..35fe234e9c 100644 --- a/migration/channel.c +++ b/migration/channel.c @@ -18,6 +18,8 @@ #include "trace.h" #include "qapi/error.h" #include "io/channel-tls.h" +#include "io/channel-socket.h" +#include "qemu/yank.h" /** * @migration_channel_process_incoming - Create new incoming migration cha= nnel @@ -35,6 +37,11 @@ void migration_channel_process_incoming(QIOChannel *ioc) trace_migration_set_incoming_channel( ioc, object_get_typename(OBJECT(ioc))); + if (object_dynamic_cast(OBJECT(ioc), TYPE_QIO_CHANNEL_SOCKET)) { + yank_register_function(MIGRATION_YANK_INSTANCE, yank_generic_iocha= nnel, + QIO_CHANNEL(ioc)); + } + if (s->parameters.tls_creds && *s->parameters.tls_creds && !object_dynamic_cast(OBJECT(ioc), @@ -67,6 +74,12 @@ void migration_channel_connect(MigrationState *s, ioc, object_get_typename(OBJECT(ioc)), hostname, error); if (!error) { + if (object_dynamic_cast(OBJECT(ioc), TYPE_QIO_CHANNEL_SOCKET)) { + yank_register_function(MIGRATION_YANK_INSTANCE, + yank_generic_iochannel, + QIO_CHANNEL(ioc)); + } + if (s->parameters.tls_creds && *s->parameters.tls_creds && !object_dynamic_cast(OBJECT(ioc), diff --git a/migration/migration.c b/migration/migration.c index 87a9b59f83..a5add9d17d 100644 --- a/migration/migration.c +++ b/migration/migration.c @@ -56,6 +56,7 @@ #include "net/announce.h" #include "qemu/queue.h" #include "multifd.h" +#include "qemu/yank.h" #ifdef CONFIG_VFIO #include "hw/vfio/vfio-common.h" @@ -252,6 +253,8 @@ void migration_incoming_state_destroy(void) qapi_free_SocketAddressList(mis->socket_address_list); mis->socket_address_list =3D NULL; } + + yank_unregister_instance(MIGRATION_YANK_INSTANCE); } static void migrate_generate_event(int new_state) @@ -429,8 +432,14 @@ void qemu_start_incoming_migration(const char *uri, Er= ror **errp) { const char *p =3D NULL; + yank_register_instance(MIGRATION_YANK_INSTANCE, errp); + if (*errp) { + return; + } + qapi_event_send_migration(MIGRATION_STATUS_SETUP); if (!strcmp(uri, "defer")) { + yank_unregister_instance(MIGRATION_YANK_INSTANCE); deferred_incoming_migration(errp); } else if (strstart(uri, "tcp:", &p) || strstart(uri, "unix:", NULL) || @@ -445,6 +454,7 @@ void qemu_start_incoming_migration(const char *uri, Err= or **errp) } else if (strstart(uri, "fd:", &p)) { fd_start_incoming_migration(p, errp); } else { + yank_unregister_instance(MIGRATION_YANK_INSTANCE); error_setg(errp, "unknown migration protocol: %s", uri); } } @@ -1750,6 +1760,7 @@ static void migrate_fd_cleanup(MigrationState *s) } notifier_list_notify(&migration_state_notifiers, s); block_cleanup_parameters(s); + yank_unregister_instance(MIGRATION_YANK_INSTANCE); } static void migrate_fd_cleanup_schedule(MigrationState *s) @@ -2024,6 +2035,7 @@ void qmp_migrate_recover(const char *uri, Error **err= p) * only re-setup the migration stream and poke existing migration * to continue using that newly established channel. */ + yank_unregister_instance(MIGRATION_YANK_INSTANCE); qemu_start_incoming_migration(uri, errp); } @@ -2161,6 +2173,13 @@ void qmp_migrate(const char *uri, bool has_blk, bool= blk, return; } + if (!(has_resume && resume)) { + yank_register_instance(MIGRATION_YANK_INSTANCE, errp); + if (*errp) { + return; + } + } + if (strstart(uri, "tcp:", &p) || strstart(uri, "unix:", NULL) || strstart(uri, "vsock:", NULL)) { @@ -2174,6 +2193,9 @@ void qmp_migrate(const char *uri, bool has_blk, bool = blk, } else if (strstart(uri, "fd:", &p)) { fd_start_outgoing_migration(s, p, &local_err); } else { + if (!(has_resume && resume)) { + yank_unregister_instance(MIGRATION_YANK_INSTANCE); + } error_setg(errp, QERR_INVALID_PARAMETER_VALUE, "uri", "a valid migration protocol"); migrate_set_state(&s->state, MIGRATION_STATUS_SETUP, @@ -2183,6 +2205,9 @@ void qmp_migrate(const char *uri, bool has_blk, bool = blk, } if (local_err) { + if (!(has_resume && resume)) { + yank_unregister_instance(MIGRATION_YANK_INSTANCE); + } migrate_fd_error(s, local_err); error_propagate(errp, local_err); return; diff --git a/migration/multifd.c b/migration/multifd.c index 45c690aa11..1a1e589064 100644 --- a/migration/multifd.c +++ b/migration/multifd.c @@ -25,6 +25,9 @@ #include "trace.h" #include "multifd.h" +#include "qemu/yank.h" +#include "io/channel-socket.h" + /* Multiple fd's */ #define MULTIFD_MAGIC 0x11223344U @@ -974,6 +977,13 @@ int multifd_load_cleanup(Error **errp) for (i =3D 0; i < migrate_multifd_channels(); i++) { MultiFDRecvParams *p =3D &multifd_recv_state->params[i]; + if (object_dynamic_cast(OBJECT(p->c), TYPE_QIO_CHANNEL_SOCKET) + && OBJECT(p->c)->ref =3D=3D 1) { + yank_unregister_function(MIGRATION_YANK_INSTANCE, + yank_generic_iochannel, + QIO_CHANNEL(p->c)); + } + object_unref(OBJECT(p->c)); p->c =3D NULL; qemu_mutex_destroy(&p->mutex); diff --git a/migration/qemu-file-channel.c b/migration/qemu-file-channel.c index d2ce32f4b9..afc3a7f642 100644 --- a/migration/qemu-file-channel.c +++ b/migration/qemu-file-channel.c @@ -27,6 +27,7 @@ #include "qemu-file.h" #include "io/channel-socket.h" #include "qemu/iov.h" +#include "qemu/yank.h" static ssize_t channel_writev_buffer(void *opaque, @@ -104,6 +105,12 @@ static int channel_close(void *opaque, Error **errp) int ret; QIOChannel *ioc =3D QIO_CHANNEL(opaque); ret =3D qio_channel_close(ioc, errp); + if (object_dynamic_cast(OBJECT(ioc), TYPE_QIO_CHANNEL_SOCKET) + && OBJECT(ioc)->ref =3D=3D 1) { + yank_unregister_function(MIGRATION_YANK_INSTANCE, + yank_generic_iochannel, + QIO_CHANNEL(ioc)); + } object_unref(OBJECT(ioc)); return ret; } diff --git a/migration/savevm.c b/migration/savevm.c index 5f937a2762..1a3808998e 100644 --- a/migration/savevm.c +++ b/migration/savevm.c @@ -62,6 +62,7 @@ #include "migration/colo.h" #include "qemu/bitmap.h" #include "net/announce.h" +#include "qemu/yank.h" const unsigned int postcopy_ram_discard_version; @@ -3008,6 +3009,11 @@ int load_snapshot(const char *name, Error **errp) qemu_system_reset(SHUTDOWN_CAUSE_NONE); mis->from_src_file =3D f; + yank_register_instance(MIGRATION_YANK_INSTANCE, errp); + if (*errp) { + ret =3D -EINVAL; + goto err_drain; + } aio_context_acquire(aio_context); ret =3D qemu_loadvm_state(f); migration_incoming_state_destroy(); -- 2.20.1 --Sig_/0sphafSrhgVLntwwPNZcnGP Content-Type: application/pgp-signature Content-Description: OpenPGP digital signature -----BEGIN PGP SIGNATURE----- iQIzBAEBCgAdFiEEg/qxWKDZuPtyYo+kNasLKJxdslgFAl+xEq0ACgkQNasLKJxd slguUA/9HnNFbc4mf/ur7jUktXlnvSccmo+E0mCtm17dGkv/e+W+3UI9dF3iKiX1 MIAYpyIdg2qKZKypmi0xOpzpF+aHV44g4gIsS2heG6FbHy4vD1MqNS8bL2OHDhKh 3S2utvihzVwiQcW8/QS8wbISe3IIRV2NtEA6sF/TKH73ZcY3z7B4YSEhhMzrLBQc tbC5uh5M0QZVTBK56SHeEu5cOMNgqmUGPccUpBC1l2kGKTvuZG6yFY8y952ReSfc AgzJceWUnJZtxgwUiWihWPCRU3+OVNOiYTkU89TiRln9DXnJkZWYOMV/UIxgaUcB DEClMeExBM0yhr9cPCdmFKnf4vZGx7taQj69B0e4bMTM6wRdamgKX413SZ9QIze+ Gxy4jwKMtMkhBJJ0p+rUuEq9ckVsOd+laOdu6KCvV4ubhL9kpHpnda1+cVbtAPOV XtkKZDP4EG/d+lEaMxPFZ216k+Uz97Jm1pSipPh2WJbIdZfDbT5hprT/Jb8sB5tM m3tMtKwRIrqpDRMZr1GZ5Zn5FapenZDuvE0iNpc/uHPQBAT4CppjiRgWZ30UH4CO DW+7yRB2AxtLK3kA5R7PA3y0Nct+7/4gOPIpuZfi6NANhCWTi7QQhzOD3QdlLLuD K0Rqm7QqRparEfGP1Hv/5Gr58tWDDJah4K3cLW/hQKc4MwVaVQw= =YGNT -----END PGP SIGNATURE----- --Sig_/0sphafSrhgVLntwwPNZcnGP-- From nobody Mon Apr 29 19:06:25 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=web.de ARC-Seal: i=1; a=rsa-sha256; t=1605440440; cv=none; d=zohomail.com; s=zohoarc; b=nLsPFN3VptNOPgyPwHPYxx+3QewJZYg/akJ58htF4+9vYt920/3pg5zPbaTJcyjT5isxTOBHg7XqqULcnyBfK60Iz6VsiQEes0k5KAsAdodwscNeRWxL9iLWGvgkoVLZShq854SEA6KJ+Scq5GG8dBdwa+8QK2xfOWIriCyUP5g= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1605440440; h=Content-Type:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=+fEhoWAyPsFE4EuIJiOPRtd6+0/wnCMEU5Cq0NSEUJI=; b=exP7mSsilPLFQXgSTFs/tC3nOCp/NitdM/5HBRI2IX0hqVtSgzjUEUyAnuXJAtlf/9GjIvcuzVBU0w4spw1IWhq20tBnwO/4w+Y8PUFU6jEIxYjYIRWmT3+RcMYtWzyAV2htyUc8Iw9scpiRS0OEoUW9XGBxYOtaNl82VDdzbHY= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1605440440116984.6073995430359; Sun, 15 Nov 2020 03:40:40 -0800 (PST) Received: from localhost ([::1]:34312 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1keGOc-00024q-VJ for importer@patchew.org; Sun, 15 Nov 2020 06:40:38 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:57054) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1keGKX-0005GA-Bz; Sun, 15 Nov 2020 06:36:27 -0500 Received: from mout.web.de ([217.72.192.78]:37707) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1keGKV-0008Ig-Jd; Sun, 15 Nov 2020 06:36:25 -0500 Received: from luklap ([87.123.206.172]) by smtp.web.de (mrweb105 [213.165.67.124]) with ESMTPSA (Nemesis) id 1MT7aP-1kqkfN08Q3-00UcC6; Sun, 15 Nov 2020 12:36:18 +0100 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=web.de; s=dbaedf251592; t=1605440178; bh=9ZKQH1Famksq6matfj22LsnulMjl2YZVLuwzqiiJrag=; h=X-UI-Sender-Class:Date:From:To:Cc:Subject:In-Reply-To:References; b=cwA8nxX+Nx5LsZbc1CNdkTgIzPwubBweEoBesNjgmpmUhLagv6PFbMCuRygJ9Fff3 BOUYEVGc9G4nWslW6hx0ePYd867NkJmZgK+bM5mXvYzDVFXNlptZQ5uqpm2mNOxHR4 5ftqcN3DgELZ9PKS6JpJi7RWp2s3A9Psf86aBAIE= X-UI-Sender-Class: c548c8c5-30a9-4db5-a2e7-cb6cb037b8f9 Date: Sun, 15 Nov 2020 12:36:16 +0100 From: Lukas Straub To: qemu-devel Subject: [PATCH v11 5/7] io/channel-tls.c: make qio_channel_tls_shutdown thread-safe Message-ID: In-Reply-To: References: MIME-Version: 1.0 Content-Type: multipart/signed; boundary="Sig_/7nxYIaCb6l+Am23+Uv+7/fm"; protocol="application/pgp-signature"; micalg=pgp-sha512 X-Provags-ID: V03:K1:LKalL2J9P/p2G31XSWBsqgLXDL5YVCVAUrhGHYo+EypkPH1tD9m JBk3LutzgXL3PO11xYj9NrPLWGeMZ8MVJTrOE0UIK1JiFXNJZIY611RprBl7d/9BHhvF7L9 M9uHCGWwAEbLcIRCF9tFA+W6TlqfzgCrIzl9tCcPtnCF2qJrHxvxz42VmoQBuj3tXFBX5+X d7gFVzTtR9E6iwBwBH51Q== X-UI-Out-Filterresults: notjunk:1;V03:K0:07OHfzW9+VM=:2u/RlV8WzSB1n1lz5JPGn3 1gpxeUXrwbK/pEutoatLTlADNyxtvxjaksgzkr/qVZeOGgmZB3ewssX+jUxQz+MSqIXweK/Np MQMUOsh3TV3pUmUIcxp5J8p/d6ZMtFv6y4/8t9H/iKAEIklJHQhM3KrZUq/kDX7oBqs8rCLLU rDCUgoOg8Z/xaMZD7ifYjaK17r3d6s0ptRji325hUO7H0mPw6Nsuk4TwWaQ+zr2KE1NUm19TN LA79OpMPJuU4XrmRFWPd7gTSojebxr5doi6LgDTXv8omGck81596k0TnleXDdmyBCc+A8pYPE kfcdM+hkkkC7hNj4wofodlNsAOV0WxAcULsdLUlATHIMIJXAd+eQ05DtLjLpnwdtDqLNs6MRJ lk0cH1bGay7nRk7X+ZIOW65UdWTuACWbe/Dl7wUFfFfiNham67eoRQrYIUxjybUwKMSvLj+W/ vQRAd+kkmcfL/LTDKY2FvCYAdJTnXqMKZ6a+n9BTsJ4xkviZqhLboGus21bcwQmEGU4QIwiJp 3UTDHxf2l/rotZsrfMgnEtKG4+jds1yIgJ7sa7N5DAtH2LZmJVhB6R20I22pHSO8aiE91RHtZ 33tifZSqqUe2RSFkAS3doo3R2R9Fq9WbStmIsLHzzRBoyxJrq3GVw737DqsT1iuUaoNJmSxSw Q9fgdWRWlKWAN//Q52kLyhFki+VA/HLVWPsHvniEP4QFA4pRxVjkUknCatoZCUu85LNWTOGX/ 1wfEAAl03sgPh6yRMhcwVwCYb0qMcLtx7cRiYkDmCUAnQc/xsBQ2WFZPf7SoWyj6TJWZi0D49 U4qhh/aREjHVjldzG4pMKppi1Sey2SeFqRlVaSQ9bwiHTqp+vg4IMyOCinvecd2uvi3ZiGcpE sXvqsGM+5r4SUA81qwOA== Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=217.72.192.78; envelope-from=lukasstraub2@web.de; helo=mout.web.de X-detected-operating-system: by eggs.gnu.org: First seen = 2020/11/15 05:44:48 X-ACL-Warn: Detected OS = Linux 2.2.x-3.x [generic] [fuzzy] X-Spam_score_int: -24 X-Spam_score: -2.5 X-Spam_bar: -- X-Spam_report: (-2.5 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_ENVFROM_END_DIGIT=0.25, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=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.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Kevin Wolf , "Daniel P. =?UTF-8?B?QmVycmFuZ8Op?=" , qemu-block , Juan Quintela , Markus Armbruster , "Dr. David Alan Gilbert" , Max Reitz , Paolo Bonzini , =?UTF-8?B?TWFyYy1BbmRy?= =?UTF-8?B?w6k=?= Lureau Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-Zoho-Virus-Status: 1 X-ZohoMail-DKIM: fail (Header signature does not verify) --Sig_/7nxYIaCb6l+Am23+Uv+7/fm Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Make qio_channel_tls_shutdown thread-safe by using atomics when accessing tioc->shutdown. Signed-off-by: Lukas Straub Acked-by: Stefan Hajnoczi Reviewed-by: Daniel P. Berrang=C3=A9 --- io/channel-tls.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/io/channel-tls.c b/io/channel-tls.c index 388f019977..2ae1b92fc0 100644 --- a/io/channel-tls.c +++ b/io/channel-tls.c @@ -23,6 +23,7 @@ #include "qemu/module.h" #include "io/channel-tls.h" #include "trace.h" +#include "qemu/atomic.h" static ssize_t qio_channel_tls_write_handler(const char *buf, @@ -277,7 +278,8 @@ static ssize_t qio_channel_tls_readv(QIOChannel *ioc, return QIO_CHANNEL_ERR_BLOCK; } } else if (errno =3D=3D ECONNABORTED && - (tioc->shutdown & QIO_CHANNEL_SHUTDOWN_READ)) { + (qatomic_load_acquire(&tioc->shutdown) & + QIO_CHANNEL_SHUTDOWN_READ)) { return 0; } @@ -361,7 +363,7 @@ static int qio_channel_tls_shutdown(QIOChannel *ioc, { QIOChannelTLS *tioc =3D QIO_CHANNEL_TLS(ioc); - tioc->shutdown |=3D how; + qatomic_or(&tioc->shutdown, how); return qio_channel_shutdown(tioc->master, how, errp); } -- 2.20.1 --Sig_/7nxYIaCb6l+Am23+Uv+7/fm Content-Type: application/pgp-signature Content-Description: OpenPGP digital signature -----BEGIN PGP SIGNATURE----- iQIzBAEBCgAdFiEEg/qxWKDZuPtyYo+kNasLKJxdslgFAl+xErAACgkQNasLKJxd sli5MQ//TXB3c3+A736gDWM+c1DhMojBgLDAw0VkvqCGiQBSjDUf/2mUCilmu4lH gAQbbuYJwC315v/4gOkAiZoa7XPmz3Zq34kEbihIobAbRt9qFPNbEEFANUyrFu4d PUomtkgOr0/i+WGuIaTMmTJVXo5ROmXy7Wr5GBOnAv2kAT2zLSEr70QtZer83+y0 eXWoLH2req9VRgVIP/WoIj5P2WPs53Ds0OVHMGVIP4utiqo6xwUJ1bUflgIRM+np wvPgnHlctlX+5XA1/P4QjAaNXdPTFfAClgXERWCPmoMinjJCyS1B6Xbrud9Th6A5 W9JNlKsAF9EX99T4IYeYGB7W4W1T2fZ0iZ4+hGBMHLKXMfzErPPa8K+kzF3dvRpO 2RoJQJ9jO6pE4FOXD2CAaL9vdw4jYyb2yfmKLnSHtrNmBGqc9SnxNISzB9p0JhAS jJrle85olHjrJ9gZ6etp21hFh8BtvgfbnB0x0AhtQ2QO7dfAnMvsi0UjVT12f1ef aFvuorVZ1z1/wqahty2jP67qr0QLPniILkzGbHfjm21KEFwJOuYNIY/cxpV7F8xv JoXqI7LNiBpTHu4165zIsD6jzJQgM/yr7PPklIb2VI89EAm4/U8cwKouQfLlH1mh Q1/7lCnFB6FA6ZDW0H8LCheWor9vY0+qkIXdXBb/TePYExXaNJ4= =AU20 -----END PGP SIGNATURE----- --Sig_/7nxYIaCb6l+Am23+Uv+7/fm-- From nobody Mon Apr 29 19:06:25 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=web.de ARC-Seal: i=1; a=rsa-sha256; t=1605440440; cv=none; d=zohomail.com; s=zohoarc; b=kb/22XSCoYG/ML/9PrK0f0jfjrZV9cOqSIElowR2yXZ6Y17O+s+vOAZKiLPtNhgN5kq8sPTIJMLZl2Y+Nmh2Zoj0eUidhHmJ6FSLuiJ0hNprX0hBvkT0xY9cZq/JENq36C+dXVEUXfNDGe+B8K1kf6SATQ34uaGfn8ws7w/cQCw= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1605440440; h=Content-Type:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=1Lx3Y2RSJD9QsxDbap5njL5FyL6K64bC7ZbZajG/ANs=; b=hYTirQtqySRWqEyJA2OLnAU6Gl0E3eKz+NgD/HCvBkUzmfvYyLkyMw4DhE0FjrnBRvKkzv55ZsbKprE9QJftROPhl2CXIgluswZVyJ5V4WzvGKQFhkUx71adT9CDD1Var40SZg2vbYgOVXrqtMY0XoU1WMvrqnN+ZQJ9sAiwlzw= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1605440440870368.3828234506517; Sun, 15 Nov 2020 03:40:40 -0800 (PST) Received: from localhost ([::1]:34408 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1keGOd-00027L-Qz for importer@patchew.org; Sun, 15 Nov 2020 06:40:39 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:57074) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1keGKd-0005IP-7B; Sun, 15 Nov 2020 06:36:32 -0500 Received: from mout.web.de ([212.227.15.14]:57959) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1keGKZ-0008KB-C3; Sun, 15 Nov 2020 06:36:30 -0500 Received: from luklap ([87.123.206.172]) by smtp.web.de (mrweb003 [213.165.67.108]) with ESMTPSA (Nemesis) id 0MOAmi-1kawwD1Zlk-005biZ; Sun, 15 Nov 2020 12:36:21 +0100 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=web.de; s=dbaedf251592; t=1605440181; bh=Tgofz4TqQkbVOqI6lXeE1WM4V8ken3CEM4N4qkKocwc=; h=X-UI-Sender-Class:Date:From:To:Cc:Subject:In-Reply-To:References; b=eHd10ePVu7sVpvcWm71rMgc8xXXTm7VAR+g9mvhjZ+hy+NJ1diExXpy8H2GQJXL5A qvi/vlwMcIiAYtXYE21Ul6v+OswT49scMenCHl6+drNCNPeWPbz2OUU/Z2yn9vcVbT VYR2nuaS+z2dAwTlT1zavqwYAG6gZU7Ywcj5whlQ= X-UI-Sender-Class: c548c8c5-30a9-4db5-a2e7-cb6cb037b8f9 Date: Sun, 15 Nov 2020 12:36:20 +0100 From: Lukas Straub To: qemu-devel Subject: [PATCH v11 6/7] io: Document qmp oob suitability of qio_channel_shutdown and io_shutdown Message-ID: In-Reply-To: References: MIME-Version: 1.0 Content-Type: multipart/signed; boundary="Sig_/p7IR+zRG8c0v8ah8ko8OIdR"; protocol="application/pgp-signature"; micalg=pgp-sha512 X-Provags-ID: V03:K1:4WA08NBdqkAsO9E/3zg0TxOLscciiFJKvLnGw9ZdPa9t154hdWd 3VFaoODXvStoeeyXfaZJXgaAYsI8zWl+X3B5DGSnVbNkaAUqdCU7EUpHB3uutO6wz4T5XVN c/GTxZZDr0L0hs4niJrBkhfv3OiAB3DvCqt+CtjOP8ek14qu/5KJcNJC6aiGzh3iT4+9vAr Y/jPIs0KJu3Wn4WJE+K+g== X-UI-Out-Filterresults: notjunk:1;V03:K0:1einL2Cuem8=:TdVj3uetgao/9HQHdBp6zg ESpwNPe7HfQ+8HrK3Pm7xySZtJ5F89ulI+H2AiyvLnr4s9j5blhYn2b0Iju3tC2XZ97Pe+8xL EUBYkcmyRaV/62vy3QcYgcK8vurLbJCVrwKrTAzzYleWUTpKa7CXUwnQgll1me6hH50AbMBo2 04s0zNXrCe6jG/BVCmbI/Bk4IzAKq/xabN6cfK0X3UrdUcIZoHu/B1ZW5gqVvR19haKmyoXt2 /ln2Ugy4rW6OXvSmu+C7IHyRx3HEFO22xbu3CIr5S1W20I7srSkLqeNdeCtW6hrCMX9mEwDup I7WvEzRCagRVOCNAoY9UbfTzrKoKmDAIYCzvrvuIK1+bsg8FeytSHjL5YT5DjfAdWwEHyh/Cg bg6/2nDk5T54CSB3qa+PIqk4GlVrBxM1/CHta+2Ju3lxzaitFFnbQsXqC83GebybfqyABB+/n 29MKj19i5TxHg6dpVHEbUquMU+DVgDHB1ZIQqnxOdHT0pb+KUJAXHwssLGDTi0HtSPoP4TmZb lDHPvQ5RwoQiB/5dwU20NYeRGHMAvPk/m+FmDaLFbibrel1vyV9b2QDrfBHWgGt5CGX11bg9A vHuSf2hA1XgJe/h02SMxkKTQ59tuWWwugmOTK7MgIQ/IFIgKGXhiqYigxK3l81Nh+cHG2wwnF kYyFtGZ+iZZaWZE9Ar5CIqYHUKTBv3xiU3wPOwFuUTlYkgZWTh8C6xJtUNgqAUEDGCY92RP8o FedAg97D1MYEXmdoXdGeqsLdfU9YpXMHrRLvXcgISjaYeqZUxpC5XiJNQaghKlFxxGdQ61d9X F5OT34pLplvGwaenJxoiGEDZ7TeDA6SCNvTen/6Zi4GvmTlC60xQEBg0521FpK8FWCTdABqfx A1OkqDIVstZz0RZbx1BA== Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=212.227.15.14; envelope-from=lukasstraub2@web.de; helo=mout.web.de X-detected-operating-system: by eggs.gnu.org: First seen = 2020/11/15 06:36:03 X-ACL-Warn: Detected OS = Linux 2.2.x-3.x [generic] [fuzzy] X-Spam_score_int: -24 X-Spam_score: -2.5 X-Spam_bar: -- X-Spam_report: (-2.5 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_ENVFROM_END_DIGIT=0.25, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=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.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Kevin Wolf , "Daniel P. =?UTF-8?B?QmVycmFuZ8Op?=" , qemu-block , Juan Quintela , Markus Armbruster , "Dr. David Alan Gilbert" , Max Reitz , Paolo Bonzini , =?UTF-8?B?TWFyYy1BbmRy?= =?UTF-8?B?w6k=?= Lureau Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-Zoho-Virus-Status: 1 X-ZohoMail-DKIM: fail (Header signature does not verify) --Sig_/p7IR+zRG8c0v8ah8ko8OIdR Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Migration and yank code assume that qio_channel_shutdown is thread -safe and can be called from qmp oob handler. Document this after checking the code. Signed-off-by: Lukas Straub Acked-by: Stefan Hajnoczi Reviewed-by: Daniel P. Berrang=C3=A9 --- include/io/channel.h | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/include/io/channel.h b/include/io/channel.h index 4d6fe45f63..ab9ea77959 100644 --- a/include/io/channel.h +++ b/include/io/channel.h @@ -92,7 +92,8 @@ struct QIOChannel { * provide additional optional features. * * Consult the corresponding public API docs for a description - * of the semantics of each callback + * of the semantics of each callback. io_shutdown in particular + * must be thread-safe, terminate quickly and must not block. */ struct QIOChannelClass { ObjectClass parent; @@ -510,6 +511,8 @@ int qio_channel_close(QIOChannel *ioc, * QIO_CHANNEL_FEATURE_SHUTDOWN prior to calling * this method. * + * This function is thread-safe, terminates quickly and does not block. + * * Returns: 0 on success, -1 on error */ int qio_channel_shutdown(QIOChannel *ioc, -- 2.20.1 --Sig_/p7IR+zRG8c0v8ah8ko8OIdR Content-Type: application/pgp-signature Content-Description: OpenPGP digital signature -----BEGIN PGP SIGNATURE----- iQIzBAEBCgAdFiEEg/qxWKDZuPtyYo+kNasLKJxdslgFAl+xErQACgkQNasLKJxd slisPg//UzdNkPvdTJi5VXHohfoMmQkhAjn29JD1SpwM9tuug53jbBKdYzuHag6n F9rADR+Ea+oVWTaQJv8CfiB1wIwwVszyKIoIihFF9AGMfKP6prohk0PHlosvq0iu dv1fCEv3eFMKkgiHUJ3Pk/zKUftJEsAwpnsL81+/mmQ7NYkqDTZ66z95ROtiwuFY vETs6mxZSaxw7S6yhpaidShJJyO5O/VrEiLc0a6vfawmdTBzoJoscLMYlSBxSvYf sEmda6gVN9ZEyZn7O8EX4D89hoe++5xRCbGQ99heLEf+VnkYS3UorSx5zLlwIh1K NzYkObOLCSH19rWtqBvNpFS+bVkkEsa2fKY+JBQCwyf4tKa+JginDbrk9wHe8Ci9 IjbwYzyEP9ssreT17LkG5k6FeLWNb8pORhYHgbCVN952PQNess/Sg0iSAg8BAYZ5 s1IgqOVWD+bIskXxUg7EwEpciZvuwy5dmub94mFNU2xGf27UI2eQRqZfuhHHGbC9 7Jb9zuLDiZNggIHLc1YQ94CVDVcRGZvKygKfzKiqxGIP6/tSFpIfQuXZSvkiOnIv +PEQ5EZxv0ubxKckwA4TR5PTPsf2GqJP34HwIxlz4N9dqhNkOHp/B9HGVV3zFqXq agL3QbIgm6FprOx9f3fXvU4dhoRnh8W4o5j8j3gopgr1RAVvmyE= =PzI1 -----END PGP SIGNATURE----- --Sig_/p7IR+zRG8c0v8ah8ko8OIdR-- From nobody Mon Apr 29 19:06:25 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=web.de ARC-Seal: i=1; a=rsa-sha256; t=1605440587; cv=none; d=zohomail.com; s=zohoarc; b=J0XY+qR99e4vC8TlGEaI/Gl48dVUqTCQak/MyAxZB+CFBk1U/t6YRjZSL/MPcjlgvDQvR0T6ttHMQ5FsLbOlISs7Rj5xF69CUl1nin9Vy7AaI4uKukLvfDepdL2VqPYS3OIyQ60BDltVUgnaklqGv7aIqeXD73SYK2+vVS3Vs5U= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1605440587; h=Content-Type:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=5Psl3zHiHQPudweY0ddMlmOJLACPoollGjHJ4BbViRc=; b=Jcmg68ZEh4T21lmmKArQEZt3EEonDJeMeSAT9UYzkDvEis3UqjK69XpcoQ3RarmDIR2I4tR4CnUoVSxK3MnZVAiZ4rcjUdr+8xArSskfgNzt6EC8WF7YjGf70Ab8xtlX7/JDSj05h3Ug9RgP15NrY9d3hfA/ovQA7g8AWI4rAGU= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1605440587977585.0845997790408; Sun, 15 Nov 2020 03:43:07 -0800 (PST) Received: from localhost ([::1]:41188 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1keGR0-0004x7-N8 for importer@patchew.org; Sun, 15 Nov 2020 06:43:06 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:57086) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1keGKh-0005MM-90; Sun, 15 Nov 2020 06:36:35 -0500 Received: from mout.web.de ([212.227.17.12]:43159) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1keGKe-0008L7-V0; Sun, 15 Nov 2020 06:36:35 -0500 Received: from luklap ([87.123.206.172]) by smtp.web.de (mrweb101 [213.165.67.124]) with ESMTPSA (Nemesis) id 0MVtxM-1kkxMn2TTE-00X27P; Sun, 15 Nov 2020 12:36:25 +0100 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=web.de; s=dbaedf251592; t=1605440185; bh=JmiqDl6XpRwd1d8HX6JcVAODaYhiNxH8lCQr3soufF8=; h=X-UI-Sender-Class:Date:From:To:Cc:Subject:In-Reply-To:References; b=JX5yhI1SeTQ9SLHqcYZgQjpRANVAQiISnXb1edk0t1zw2xaPeSajklRH9m5MTMSTr oJr7gxg8O9Ib6z0Da5/A9ONnvJRJNx17vm1lO6aI4Ne09xyeU5j+AOGb8+aCBHR1ni gCGDA99xvoMde71cL90Yn4T/gEGvmaM+4Ua0E330= X-UI-Sender-Class: c548c8c5-30a9-4db5-a2e7-cb6cb037b8f9 Date: Sun, 15 Nov 2020 12:36:23 +0100 From: Lukas Straub To: qemu-devel Subject: [PATCH v11 7/7] tests/test-char.c: Wait for the chardev to connect in char_socket_client_dupid_test Message-ID: <1318bc2b2d8254b972bc9f2a5fcc05cd79eee513.1605439674.git.lukasstraub2@web.de> In-Reply-To: References: MIME-Version: 1.0 Content-Type: multipart/signed; boundary="Sig_/501dvskr5C.ifACNmwoBDgd"; protocol="application/pgp-signature"; micalg=pgp-sha512 X-Provags-ID: V03:K1:9wFlkpRheyIy9h6oIeWXW2Ov7DXp3V8BQLa9zJNStbbkZE6iXeK L8uJoaO9guY41UgkqwSNs7srRUZBZoYDashCBjvsa4HmboQoS7bGbV0sIrJ2gf4ylLOC+/z UBcOLEAU9H8XcytdCwpCZOpDCxRLyPaqRVoWqigGoD48lS0eQQK6k9KmQBa9Tu25xKH4/HK C5cLcWXzi/jZPa2kIDCaw== X-UI-Out-Filterresults: notjunk:1;V03:K0:/DRjsa7S6Os=:vP6F0VYDJVzWwzM5KFCooc Zfn17Fcp3+nwK08UBJdtDMHPW/84V1Ns+pr87ukSqR9u1ASNXt7byttMEiuRxaLmYJp1LMrBD 8KyBu4X1rN8WAQ1iqec/7SC0y0Kao8AdVwXBRpTUcMzLYJxhJKAU6rFxdESKepJ0jJVnP5eLc a7rKl4OMiTrkM48n4TCoUKl45gvLsXepe/Lt1ouxQzKBWzcx69N3lj6kCElKZ2b00mWL3KhAu m+aKlfrSCuBTMyXea6vnarQOUg9MnPAJH+wlvPX+PMg3xC1sOh5xh7yFr3NiQnJvholejUcxD mWvqQdF46esUofh/ygJXMytu4nxDDaqmoF7gFc8LDhET1ROUDdTkv/GNIp8HisBTgjkPQ5KjC B+8W5bNPKEMVWKTPJQyaHSjPAjiMs/S1UbRgbAW7syyYP1twQlRSrulqSY9KDzYkOpTSq3FMX 8hsDw+1L19+tudhNm66m215+qZU7X1+zhiPaTUl+O4VrOPjHrfapUuWxzGv690qkNqicT9Owx SfkK9yHLQOZ8yk2eBtTg2rfLzLW+czHl26hQAxySLFPT3UPSG4Ke2dgq1GQ8Z37YWDV5DyIRM NEYQ7U8iqe5/rA/uHPBjaZhzNkdxN9nuOSFZB5AfP6+UYIXU/E6tCa7sFd2VmyAvHy0pSHUJO O3i3K7gHxQkjYYn6zmowbggAI0vHWT6d80HQxCeCoffX6CFbf0jkM38cFLwEDVohP2TIZ8+zi IPOcT/0lBGKoA4+S4LQCMkqpKtXjNjJ6xPfuHXp+wFTweBxax3mSqEjn3eNIBSWU3C+PCdGtf 24L8eD9hZs7a5MKKsWy06+FI9w/xBzbra6Qn8P68WWnTAQRVMRzPX8fwPD3LngbhnV63HPzrU hrRHi13WRnvG32WnOLUg== Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=212.227.17.12; envelope-from=lukasstraub2@web.de; helo=mout.web.de X-detected-operating-system: by eggs.gnu.org: First seen = 2020/11/15 06:36:31 X-ACL-Warn: Detected OS = Linux 2.2.x-3.x [generic] [fuzzy] X-Spam_score_int: -24 X-Spam_score: -2.5 X-Spam_bar: -- X-Spam_report: (-2.5 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_ENVFROM_END_DIGIT=0.25, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=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.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Kevin Wolf , "Daniel P. =?UTF-8?B?QmVycmFuZ8Op?=" , qemu-block , Juan Quintela , Markus Armbruster , "Dr. David Alan Gilbert" , Max Reitz , Paolo Bonzini , =?UTF-8?B?TWFyYy1BbmRy?= =?UTF-8?B?w6k=?= Lureau Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-Zoho-Virus-Status: 1 X-ZohoMail-DKIM: fail (Header signature does not verify) --Sig_/501dvskr5C.ifACNmwoBDgd Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" A connecting chardev object has an additional reference by the connecting thread, so if the chardev is still connecting by the end of the test, then the chardev object won't be freed. This in turn means that the yank instance won't be unregistered and when running the next test-case yank_register_instance will abort, because the yank instance is already/still registered. Signed-off-by: Lukas Straub Reviewed-by: Daniel P. Berrang=C3=A9 --- tests/test-char.c | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/test-char.c b/tests/test-char.c index 9196e566e9..aedb5c9eda 100644 --- a/tests/test-char.c +++ b/tests/test-char.c @@ -937,6 +937,7 @@ static void char_socket_client_dupid_test(gconstpointer= opaque) g_assert_nonnull(opts); chr1 =3D qemu_chr_new_from_opts(opts, NULL, &error_abort); g_assert_nonnull(chr1); + qemu_chr_wait_connected(chr1, &error_abort); chr2 =3D qemu_chr_new_from_opts(opts, NULL, &local_err); g_assert_null(chr2); -- 2.20.1 --Sig_/501dvskr5C.ifACNmwoBDgd Content-Type: application/pgp-signature Content-Description: OpenPGP digital signature -----BEGIN PGP SIGNATURE----- iQIzBAEBCgAdFiEEg/qxWKDZuPtyYo+kNasLKJxdslgFAl+xErcACgkQNasLKJxd sliRsxAAk9W1zhjA7kvgJcNPzjK5d4wzkQgY3PcFBXznNlPkM+LfBYobQzJkNttO IJuWajFr7eV7DMeSQfzPHdn7J4fBL/KZb6V6sttp/UyHITkiZ2nSE8TX8Myrt/r5 BfUaauc+y9nLhOEi6ZRONdzUIU8JMruRF0ruYCjFScDBXxUgPSalrJoUtJcH3Rrc Deagcj5hW4oQcCsM59HyUdXO8iv5Hf0ybR9ilWfLkz5LWCY99fOzA4ZoQEH2xnFh hTsv93XgIwlMZhwcgR2UDKSEk6hXpSaiWjStHLsmFGBsjm6+uVnImT+BGTns4P+C M0CPJbp+35XwL7fkrkXIUROot6Ms9kwndnvG4jKCSltCHG5QKB/U2JUyZ2zpLj40 eZY6HYNuv6wdRHGYrt6auq8yc/ZG0xmhyYRXFB4mBiykeFh9fVPpOjmyeTp275+f ZZRlctOQ32Nmd68uWiQYNWWA9IGxEIG5nZv1S2giZYBlz6YMpOEFIUd2trqtE3QT /2NqoJdvRzNP8swrSHZZ+QX1OpIky+0Y9ytEywLs6/gPuZ5wkh8viTw/uVNc46Tl y22Cpxl2vvyDN/yGhKIZKGgtENSUsJXDBNzp/6YUqZ/uXNPK8UPASxyG/zb1863C RMDwnYIK/ZSXlB/eFHOXPVziWOKT9tj5SOGnM0NaECvCiTravSY= =dlMT -----END PGP SIGNATURE----- --Sig_/501dvskr5C.ifACNmwoBDgd--