From nobody Tue Nov 18 07:45:27 2025 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=1609167889; cv=none; d=zohomail.com; s=zohoarc; b=Ka0vCu7OYBSi2LthqVLCdXIXuQzFiH1ASUEDX0Em2mLulb/UDEOnaFEc6vxoJL90qk/JQ372GiMhl365WwD6YB55hMEwb94CduY1POJwlig8Uo9bQH9SJOps5H2U3Jr1L+GZ3OjrBOioAZIV9IN+KrkLvgVI1B/1BS/A9Phxueo= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1609167889; 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=Vn+XF6Sr0TDiAtxVIitmKRqlABcM8PyyUgQ/LNeo3c8=; b=cha79k2MyUikPDaIUfF8s+cftBx5EhipxGxlgin7ixdaXDWQ6kbRY8GsDACSTiYJRTn7QO7qX95Z1pHj2gmh9NIFZWRB43qIRUWDTNzgA7qfNmJGYipDDtGZvcyIll69+1cxqQQVyVAuv4aP0G2orW3Do1rERJGNfg+HlKwOE24= 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 1609167889217424.4432854460184; Mon, 28 Dec 2020 07:04:49 -0800 (PST) Received: from localhost ([::1]:37564 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1ktu4m-0007yc-5S for importer@patchew.org; Mon, 28 Dec 2020 10:04:48 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:47682) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kttyv-0002ab-FV; Mon, 28 Dec 2020 09:58:45 -0500 Received: from mout.web.de ([212.227.15.4]:34979) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kttyt-0006UE-0j; Mon, 28 Dec 2020 09:58:45 -0500 Received: from gecko.fritz.box ([94.134.180.94]) by smtp.web.de (mrweb003 [213.165.67.108]) with ESMTPSA (Nemesis) id 0MWS0g-1kW8jW3Hkg-00Xe1m; Mon, 28 Dec 2020 15:58:36 +0100 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=web.de; s=dbaedf251592; t=1609167517; bh=c6FfVc+byKtb69C0CFFTeXZSrqu/gbhekO2xdI6rVjo=; h=X-UI-Sender-Class:Date:From:To:Cc:Subject:In-Reply-To:References; b=I/Nspn5Pxl+zQ9w9iJyXC5QT99Il7TnnmCOd3zVw/Tj+wSstDqTjWpf8qzzcTi7zO vgA/7NcM7mOdZIJh9j3RQSfNzyLnpff7ZyN2HoKeSFYUQJk3j2uEPzOmIAV26pvnZ1 ql+Z05N0eovRjIt6lrxCEzd9eq2ut5BPUdgmSsvM= X-UI-Sender-Class: c548c8c5-30a9-4db5-a2e7-cb6cb037b8f9 Date: Mon, 28 Dec 2020 15:58:35 +0100 From: Lukas Straub To: qemu-devel Subject: [PATCH v13 1/7] Introduce yank feature Message-ID: <6cd43b6001d1421d59053879ffab303777dd2518.1609166587.git.lukasstraub2@web.de> In-Reply-To: References: MIME-Version: 1.0 Content-Type: multipart/signed; boundary="Sig_/nj_kbc4gUi2ziHJ0vxwBbfp"; protocol="application/pgp-signature"; micalg=pgp-sha256 X-Provags-ID: V03:K1:2tWTsCqAfa5KSq74wRLpOaKm+eGbnoS0hXuJQTiNnqhBC5OWlGD PowzzciY6HoIB08aQ48r1/G1r54Wwt7Y8OmHCXHqJFw1jO1W1OkyHPp8y8gKzMXTQ7j6HXb EO8FNJhg1QKBuci9cLRkJjhvbwPN4WN8BuNSPnz4JD/lVc5pke+1qEUnPoVoP25EiwKUqd/ H3VYmc1hX0dS1gF8rYuiQ== X-UI-Out-Filterresults: notjunk:1;V03:K0:0ScizXyWWAg=:eJFgfLXTM7oQuA5Z5mF+FQ MuJxMWCQ8lI3CmjM76pI8pg7AHFfmwDoU+06P64cu041hOf4sSAJTuBhaBW/YnyGyaV2zlj4D HKBRVKDp/1ZU5FYMqRQqEzV4C8IBdOHdz186dNy6QOHcsLs7NKNoIwP6Al/N3ZrnKxmCpQMno gZBHY1KdrNMOt4twTbZB/LGZyc+6q1/hB8hoIEkVOg+px/aJ5Np2uSr44xRwpxSUE+mBTv0gi HWsQ9K5ycAvJdtXWhiAy4JyOPRwwtNwb4CrcdIKBMkMlpoWISyZRaKH33AzYhTUVGUIij/Uco hOMtw4dvv8SivZSTxudg5GTZ9XvAzbp8gruSNZFM+oevO9cYeId0FkPGYhlNLqV0EavRPzc6t LvcVRF6/8TBGFiCfSO/f+NqkCUmRUrkjm+Q5NqcmPqMvJNLNSgE6GacyFwtRxNYd6ZwrAPj8E /nzVwshVhFYnfdAxEKPQXueXVQxr59tQ6rSHwKkiVhnql7RWcC5IZpkmCVZZeNfEGW/x85U5O Fb5OMBiCyuoh1X707o+q/sxCG31d7CLq1U2Y/RDfAQgOHUiqWFI+OZqDveUQ0yFsMI69l9aq3 ES5pgmFnE5uSq0ptmqZ/EEHLQvIKLHSG8SOFLZk1RTw5epAKMb7xoMRJ1m6TdYWr3WgO1WZUW bAE1P+vhKnrse+infbE5mosI8sI8188LgU8udVIQL3DkEOy0rBeUB4Q35mE9JiI/bWSsVOugS Ad1TuqnkZRj01iOs6xr25NxARuu/b9wOTuf31iBsgJ9rBXvUKi0BrZ3MG/0sM6knWCIWYpL4B zEtOF/KxlxHQCaudERrQQH80K4wZyg6ISt/jNB4ltXaE6kGnrv07RDwmJTHfIjZAkJi/UA+FX 3QqL2nq+n1THH1rdx8gndttJQZ2j+OaQyudx4fzIw= 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-Spam_score_int: -9 X-Spam_score: -1.0 X-Spam_bar: - X-Spam_report: (-1.0 / 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, RCVD_IN_SORBS_WEB=1.5, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=no 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?= =?UTF-8?B?XA==?=" , qemu-block , Juan Quintela , Markus Armbruster , "Dr. David Alan Gilbert" , Max Reitz , =?UTF-8?B?TWFyYy1BbmRyw6k=?= Lureau , Paolo Bonzini , =?UTF-8?B?TWFyYy1BbmRyw6k=?= 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_/nj_kbc4gUi2ziHJ0vxwBbfp 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 | 97 ++++++++++++++++++++ qapi/meson.build | 1 + qapi/qapi-schema.json | 1 + qapi/yank.json | 119 ++++++++++++++++++++++++ util/meson.build | 1 + util/yank.c | 206 ++++++++++++++++++++++++++++++++++++++++++ 7 files changed, 432 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 1e7c8f0488..f465a4045a 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -2716,6 +2716,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..5b93c70cbf --- /dev/null +++ b/include/qemu/yank.h @@ -0,0 +1,97 @@ +/* + * 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. + * + * Returns true on success or false if an error occured. + */ +bool 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..3d5c872598 --- /dev/null +++ b/util/yank.c @@ -0,0 +1,206 @@ +/* + * 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 "qemu/lockable.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_instance_equal(const YankInstance *a, const YankInstance = *b) +{ + if (a->type !=3D b->type) { + return false; + } + + switch (a->type) { + case YANK_INSTANCE_TYPE_BLOCK_NODE: + return g_str_equal(a->u.block_node.node_name, b->u.block_node.node= _name); + + case YANK_INSTANCE_TYPE_CHARDEV: + return g_str_equal(a->u.chardev.id, b->u.chardev.id); + + case YANK_INSTANCE_TYPE_MIGRATION: + return true; + + default: + abort(); + } +} + +static YankInstanceEntry *yank_find_entry(const YankInstance *instance) +{ + YankInstanceEntry *entry; + + QLIST_FOREACH(entry, &yank_instance_list, next) { + if (yank_instance_equal(entry->instance, instance)) { + return entry; + } + } + return NULL; +} + +bool yank_register_instance(const YankInstance *instance, Error **errp) +{ + YankInstanceEntry *entry; + + QEMU_LOCK_GUARD(&yank_lock); + + if (yank_find_entry(instance)) { + error_setg(errp, "duplicate yank instance"); + return false; + } + + entry =3D g_new0(YankInstanceEntry, 1); + entry->instance =3D QAPI_CLONE(YankInstance, instance); + QLIST_INIT(&entry->yankfns); + QLIST_INSERT_HEAD(&yank_instance_list, entry, next); + + return true; +} + +void yank_unregister_instance(const YankInstance *instance) +{ + YankInstanceEntry *entry; + + QEMU_LOCK_GUARD(&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_free(entry); +} + +void yank_register_function(const YankInstance *instance, + YankFn *func, + void *opaque) +{ + YankInstanceEntry *entry; + YankFuncAndParam *func_entry; + + QEMU_LOCK_GUARD(&yank_lock); + entry =3D yank_find_entry(instance); + assert(entry); + + func_entry =3D g_new0(YankFuncAndParam, 1); + func_entry->func =3D func; + func_entry->opaque =3D opaque; + + QLIST_INSERT_HEAD(&entry->yankfns, func_entry, next); +} + +void yank_unregister_function(const YankInstance *instance, + YankFn *func, + void *opaque) +{ + YankInstanceEntry *entry; + YankFuncAndParam *func_entry; + + QEMU_LOCK_GUARD(&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_free(func_entry); + 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_LOCK_GUARD(&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"); + 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); + } + } +} + +YankInstanceList *qmp_query_yank(Error **errp) +{ + YankInstanceEntry *entry; + YankInstanceList *ret; + + ret =3D NULL; + + QEMU_LOCK_GUARD(&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; + } + + return ret; +} + +static void __attribute__((__constructor__)) yank_init(void) +{ + qemu_mutex_init(&yank_lock); +} -- 2.29.2 --Sig_/nj_kbc4gUi2ziHJ0vxwBbfp Content-Type: application/pgp-signature Content-Description: OpenPGP digital signature -----BEGIN PGP SIGNATURE----- iQIzBAEBCAAdFiEEg/qxWKDZuPtyYo+kNasLKJxdslgFAl/p8psACgkQNasLKJxd slgT2w/+MNnZ71nYJlVF3xhLR6tF6e7mUk7800nRcwW18iwYo+0PwL1gGamofduV zR11WQEmmkkuQ/XYVF8zjLJXmpJ9fG+h81yV3DJ6n8sjzXtg0BsP2iVjkaXXUfUG r4Y+thXdYpD+OPeWwgFwjJTenuLe7i4sW8Svar+kBakDxKb+SsRC2Oc4FRVpGqN7 u1z2nEi2JHjHiHOLxUOUg4N5tYXEymCPG0OLykhROuylzYEnFUH4yJQ+2Adjhoq2 YQaOzVfOXnq6P/Pf1VOfVMY22MJdlZlnKW/7+TN2bpqww2tZFgeZSN26cNmeIaxw 75EX7a7iuTiaKUna12ScM0mT3gu1c8Toolguu/iO/oreKfgJYkF6C0Aaca8wl62B GDvZbCS5NKXiQrZqeexwVlwPKIojdHB1YLl/TJn8NWbBoovbAQ0jVCuMTp2eipMC pIYKRHv6/t4Rh0ApZc59O/mCuwA+uUPClVjl76fMWP+LWeNwIgHbvu2+nKs5X5Ye WVEv9pRdeFCFQnEqIgxECPYFJLfrIJolrhyIT3vCk09UjpPV4kdj3+y9bZjqwN7y mkcxVEnUEqTDpcYit8tBEa1+TTlx7qKMguKFosNZogvqyyrlRwPD6+Ax526dW5aS OPno2F24X//ClKKOs7IQ3reDmSERz+BgfpHryFVP382pa5eJp3s= =BFaG -----END PGP SIGNATURE----- --Sig_/nj_kbc4gUi2ziHJ0vxwBbfp-- From nobody Tue Nov 18 07:45:27 2025 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=1609167678; cv=none; d=zohomail.com; s=zohoarc; b=VtAG8b9lmQQNGEn+b4s1hk4l/44CuxPjGFRQPxe4Usu3Ht9C04m7r+zKt3sonZYCmB4FP5uzAyV1hwN2SA9UNE/zjmCyDxHUcbGZ2pU/1op0ywjsx7KM3PIkpSoqQ5cwo9274XuYAFGCcE6xjI4RS5jTfARh09jWoaA8JwedN2w= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1609167678; 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=/+Su0HIaWHVGW4btQQJzjDXFUyR+qgBNz44qpRl/J/A=; b=FZdD+8XhowaaMVEU89suYIaFHtdoF9kAQe4u2CzqZ1njhUQ+KlbJfPYG2SSJVeEebyu8Djn82L71BRquGqdrpr5PhlUCiXGLSwiVIVBdNMUw6TS9d8DeTatLw6NnOirtmGEkyaB5BEtebidZf6GrCSk00YrPILoNPv0abpEy2L0= 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 1609167678079964.1633330642317; Mon, 28 Dec 2020 07:01:18 -0800 (PST) Received: from localhost ([::1]:58122 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1ktu1K-0004Uz-Cb for importer@patchew.org; Mon, 28 Dec 2020 10:01:14 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:47696) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kttyy-0002ht-Vm; Mon, 28 Dec 2020 09:58:49 -0500 Received: from mout.web.de ([212.227.15.3]:35287) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kttyw-0006WZ-Fb; Mon, 28 Dec 2020 09:58:48 -0500 Received: from gecko.fritz.box ([94.134.180.94]) by smtp.web.de (mrweb001 [213.165.67.108]) with ESMTPSA (Nemesis) id 0M8iaa-1kjysm309M-00C9tm; Mon, 28 Dec 2020 15:58:40 +0100 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=web.de; s=dbaedf251592; t=1609167521; bh=T4A3ilGwAbF90vtErWpBdiQVImD8ftOS+IC4LA4ftbU=; h=X-UI-Sender-Class:Date:From:To:Cc:Subject:In-Reply-To:References; b=DTU2AOKUMakoyfWS9SrPevAd0m89GUIASNxI2AlAlS5inmUOkLCg5WSENbTv/h1H5 y2PNg8jttGAcSIeZP8v8eObU5Dj+duVGs+N9zDfcxyM3OxG5v2ptwqP75yH1Youz/m m5NuOwk15QeNOxO8uwPmY+YgD7eN+en3ctfo3Yyw= X-UI-Sender-Class: c548c8c5-30a9-4db5-a2e7-cb6cb037b8f9 Date: Mon, 28 Dec 2020 15:58:38 +0100 From: Lukas Straub To: qemu-devel Subject: [PATCH v13 2/7] block/nbd.c: Add yank feature Message-ID: In-Reply-To: References: MIME-Version: 1.0 Content-Type: multipart/signed; boundary="Sig_/tdJnSkUxEzevk7+lrKsTLPu"; protocol="application/pgp-signature"; micalg=pgp-sha256 X-Provags-ID: V03:K1:G0w67OFLaENv2vzxi1SrNtssVnNqXIxTjSqGhAxj1qycx/QdUG2 ORV6gcRB77qi7h8GEspJ9uu0xDbUr8Fo6zwyQO2e6bGr56rZjoShOqAV402q43KQm7jkVea UlvWHKrUbLOrhJJ3MyRIfXhzrMzyM+2IBT4Ikp2uKZrMFyr6FldDEGfqRc4tnoMyE1Dia3f 7WGI2baKEJ+W2DbtFQvfA== X-UI-Out-Filterresults: notjunk:1;V03:K0:GR8zCho2baQ=:awB82v/HhCQel8cFNYfMik bQ9bZXlwhtsxzCVsQDoYyvV8DCq2mphQoAcw/OufXtPap2Y6IsaDCQIygse0eHN9DNjSqAp+x c+piYsytXCKg2tANo7GCfHPu4p788CRM2XMr2FLmbk3h7uwIV5ooGUwc7+xP36AwPoUFBSU/E E+zZKMfY7JXNJsEbtooBFM8rhlw2gKfFCouCotIFHzUZqS+Pi6YpOoFgrwlAppdCtp6/wz3ED 3dBa99/AxvwYeJ0kaIXdjfreUzXGBoEymoqfWb2fTe/op4G5VNJVDc4Q2kFdb0chYUPwTjBec 4IeFHZ+UwgaDy4MSjzk2UljGGgQ2Uwq1Gm85kfzqinnSrrhJDXa6zKeJ9Il6bSeoLkF8aYUMg uh8/BgK2Oo7T/jTd964xPncApFAa8GTgGz/s5k8EadU8SPtp+LTR9Ds31oMPlvle5tKkDbyI9 DQswKlqbXm0KtRBYi6Wpqe7iQKUeJCTfOm8jXNweRlNKbR0EcDJTtD12+cd3Lsjk7mdsI4Mrw VxjtzwGTFn+NlH6akhwwr5XSfUO+AKwTFpc+jMu75VighYG001NBKerCn/sKNMSmwD12DOnSK q9bh8+MXMGQZstxoTnCGEInkREukVBcDhoQu1kd0V6ioHWVrnKo74n1JTr+jw8cCB/fwX6nDL Zk0hI4xYjNRbX75PUX1DXkT/7N8qAkUuBszM63jQIJYdFfk7fRdMh69/x7NKQ1gnPeH2GVtwl bHkxHGJ2+1drif+6F90an8zw8Xi0dqSP/r4QTP5h9Ufgd5UBs5lErH5VGw7d0Jpr34QzalH65 61KoX3CBgdeEUpjWob+oL4n0af8h7s1pySWzwpl2vkub2olwFNLjewCbzKYiZuonknntSdVps zL/65Xd1DoXsj+mjth2GK1b/4KmbCWkonwmE0bfAM= 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-Spam_score_int: -9 X-Spam_score: -1.0 X-Spam_bar: - X-Spam_report: (-1.0 / 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, RCVD_IN_SORBS_WEB=1.5, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=no 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?= =?UTF-8?B?XA==?=" , qemu-block , Juan Quintela , Markus Armbruster , "Dr. David Alan Gilbert" , Max Reitz , =?UTF-8?B?TWFyYy1BbmRyw6k=?= Lureau , Paolo Bonzini , =?UTF-8?B?TWFyYy1BbmRyw6k=?= 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_/tdJnSkUxEzevk7+lrKsTLPu 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 | 153 +++++++++++++++++++++++++++++++--------------------- 1 file changed, 92 insertions(+), 61 deletions(-) diff --git a/block/nbd.c b/block/nbd.c index 42536702b6..0f8d17db6a 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,22 @@ 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); + if (!yank_register_instance(BLOCKDEV_YANK_INSTANCE(bs->node_name), err= p)) { + 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 +2356,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.29.2 --Sig_/tdJnSkUxEzevk7+lrKsTLPu Content-Type: application/pgp-signature Content-Description: OpenPGP digital signature -----BEGIN PGP SIGNATURE----- iQIzBAEBCAAdFiEEg/qxWKDZuPtyYo+kNasLKJxdslgFAl/p8p4ACgkQNasLKJxd slj8tw/8Dz8p4z6+0+XSIesJ3T85I7iF9UUnUTj6ozdh4i+topr/KQOJ8BYf9WG3 qQ1uC89gIIaUGJN6Ldj1kp/VKSeFnUbQsN/M/GhKqSQHercl99xcCI/QHA6ngxLz UZqnU/aF4oQAg3y4EZ2TmVzlwEO+5yrPNo/FfF2F63vlZovYlPaDpm14P3oXZXVf uV8HWGoRU8zyXAriLgCwqhxFoJEzrJU8y1ke8YDsU0ctfqzidQ03SM7OOv2uKY6u jashBb3K8Hsoa7TcLlAjsAQl879NWDg0zfN0sHTBJdoEh+IgTugFh4XpXKWVZ5Gl PJMi60hcQux+yALeREt2nYu8K2QvtbuFXBKUqxlQC1EG/q68M0RbR8Ac/WnnE9U2 BZaRb8d/svRIiwkkCu/O3GAN/F5CRFoM5pwcYn9lkq70xNDQ4AM7rJmB0KvToRQS VUfkKLV7jHQOQdpw62yaw5rhYxBXrxovFa12ikIunbsSJBlw9ETGfzZIajJUGnMk jDs6xhb71rmBWxuDUvWaS1yuSUUD28UpLbRaDBXh9IwzrbdcFrC/BQmws8Psh431 LrNn0alhWT/5hqletpILjvEFvaE/ICOxI4ppZOQmDtouAN8FNuHconNz/b077QL0 tSUy6VB1ol3m6/1hOUUh8IF1iT9FZSmYJXEx8119I6fwJrM9Gw0= =3oAr -----END PGP SIGNATURE----- --Sig_/tdJnSkUxEzevk7+lrKsTLPu-- From nobody Tue Nov 18 07:45:27 2025 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=1609167695; cv=none; d=zohomail.com; s=zohoarc; b=Sm65ivNycgQ3Yz4WbI4wUH0Uk9AwP+8VndMngWmo0JrEZVRXAbiMp8jYknLlbTeLm862MaMgteT3VD1XPsmW2YpKggdOVFnKPQcbIOR14+5K1QlcwkEAktfO/vgvHTcSbTPFTrTGZVBDpj/kl3FB88WVgbz0PZ2AgCeYwYPbeUE= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1609167695; 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=ELz1vVkb5zLI12zKIeeb11ZCt5q5s7kma5wZIB8BxWU=; b=NXCDU34oTfM6ptxeLkJ5/XnhtZhjpZWFJK5SR9fhNkup0d1p1PJmQhsWF/yr02OCrGw8Q54+0Mk1hbDjLvxC/RtsP9lrk/ofOwLblXuz57Pb5ZVukdVJXCzV0LRFatoFO1hL0d9Jh74gUn8AaH+PGLSpxHnUfkTA1SHv1gyGRos= 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 1609167695622713.6992452468666; Mon, 28 Dec 2020 07:01:35 -0800 (PST) Received: from localhost ([::1]:58270 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1ktu1c-0004Ym-4b for importer@patchew.org; Mon, 28 Dec 2020 10:01:32 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:47708) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kttz2-0002nH-2l; Mon, 28 Dec 2020 09:58:52 -0500 Received: from mout.web.de ([212.227.15.14]:49571) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kttz0-0006Xg-9a; Mon, 28 Dec 2020 09:58:51 -0500 Received: from gecko.fritz.box ([94.134.180.94]) by smtp.web.de (mrweb005 [213.165.67.108]) with ESMTPSA (Nemesis) id 1MsrdM-1k0hvo18B6-00tKSk; Mon, 28 Dec 2020 15:58:44 +0100 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=web.de; s=dbaedf251592; t=1609167524; bh=rdd77FcqNCutE2kHAJBRJCbMv1+7m5qLzrH7zZjBrOQ=; h=X-UI-Sender-Class:Date:From:To:Cc:Subject:In-Reply-To:References; b=YKDAC77zs/ZEOyM72L10tE+qpy9tE9fmlUOF/2IpnbkYPfc+LzJybuKKj3nEVdYTV tjEV0OJm87+jRmiHhw7Rh5ftSKlu+4TmYuqC4Ygt1CH266opsAaOX6zMPUq92tM8VD V418M9IvZ9RC0Jtja7aVC7rczEv3i82CiFyxtK+U= X-UI-Sender-Class: c548c8c5-30a9-4db5-a2e7-cb6cb037b8f9 Date: Mon, 28 Dec 2020 15:58:42 +0100 From: Lukas Straub To: qemu-devel Subject: [PATCH v13 3/7] chardev/char-socket.c: Add yank feature Message-ID: <9db0fd19a99e1dc7fd6e612fe279716233243b14.1609166587.git.lukasstraub2@web.de> In-Reply-To: References: MIME-Version: 1.0 Content-Type: multipart/signed; boundary="Sig_/RLan_yhHKjNO8sw.RsoZ1YH"; protocol="application/pgp-signature"; micalg=pgp-sha256 X-Provags-ID: V03:K1:mNnqpqSLcVNNstD50aqEZfKE0lMAq7FVK63IGtfTl4O63IUXCJF 780B4bM4asv3N55b2+ggMZX3rLM8a2BmhW/g6vLa4A1E4jZJqEyaSj/RMp8DG6sOqbqyG2k hb6RJcBe1Mgg51yzs1ruhhdkg8qC/74UDROPlvmoyX+KGsKaEY+9JtHTZbMYLjMzDvL2aSX +x/OZL8zL73eAFYeU+ZOQ== X-UI-Out-Filterresults: notjunk:1;V03:K0:xuQM6I52PnY=:Ho4WxRMJp1UblYLT6fEPm5 RA8gdrjj/Ku4loyGFavBP/PQhEQc0atSoxJSJk45zGVH95JJWH3C31VR08A+B1Admj6mM8j8x yV8r53tNbKm/TlRo1e9afyc6kvpqH6ud5quMcNsn85vW93bfbItyQkZvQyHMT2z+rozHSJFjx bhK7gN97H9i/YlC1LMAKHKLrzc+1V612yNqZT3ZA3ZZ9XMAq6hzcFlEyEX71txi6hQSkG3HaO fdZc2/X9g0lqgC/awkmsgK7+wq6Xj+TlyRWmcrjtG8CE3PGqRdzlmS84ynPNwLZWJDTstLRVQ 2ueaR7HxYmkKKuD2pfPlDwWqOeamot1Cn5Sdt1XJIfRVZpkTAx/cPKdCj5z0QD1rSKAqn2GQm QmkoJIsbNeuVGt0UmuIQWagjhJY4JRlYrONnIeE+Fu9K+CNMylqdDe27zxfxwbHFDHHtCehs9 6Xinck+50EiY6FKKLmj1jeNQBzrjPNaJSmXy07/L09yeskTjHJIKOxePFqNFMbMciuicM7Xsr 2vuDSAfYsFWtP51ZC3ecD1shtV0/s+TDKusmTEC8ME5iGVRC8UcAsYiq4AIunyi2RYEaC/Vgv HgloNoOWCC+ggef4+byZ/ttq/iaz6FI/0/Fo70KUaAvB5Kw+7uqr+3clSmKdjmwFHx5HOc6NM LvLk89zMPONA/Wa4F4uKbaNJ9THtkkOCsIRZ0KxkSVMfl/rvlCTiUGv0eEOA6HL1c8bYydJxY tQoX4M0qHF0FjCVwSPjpWBiOaCVuRQ36d7x35zDLk6YwdtUSdjrx9EHssSIoqZI74GHzMhoL2 RrKe0CGaHWMqb9J20W9En4pV/Sv3GE6/99d5yfv8rg4RRjJhzgY1B/CsCJHGrwH8audbfOGjx KUVIR1qBFZqLnvCPxbZjcqPlAA33QCc2a9XUrbaUA= 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-Spam_score_int: -10 X-Spam_score: -1.1 X-Spam_bar: - X-Spam_report: (-1.1 / 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, RCVD_IN_SORBS_WEB=1.5, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=no 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?= =?UTF-8?B?XA==?=" , qemu-block , Juan Quintela , Markus Armbruster , "Dr. David Alan Gilbert" , Max Reitz , =?UTF-8?B?TWFyYy1BbmRyw6k=?= Lureau , Paolo Bonzini , =?UTF-8?B?TWFyYy1BbmRyw6k=?= 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_/RLan_yhHKjNO8sw.RsoZ1YH 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 | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/chardev/char-socket.c b/chardev/char-socket.c index 213a4c8dd0..8a707d766c 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,11 @@ static void qmp_chardev_open_socket(Chardev *chr, qemu_chr_set_feature(chr, QEMU_CHAR_FEATURE_FD_PASS); } + if (!yank_register_instance(CHARDEV_YANK_INSTANCE(chr->label), errp)) { + return; + } + s->registered_yank =3D true; + /* be isn't opened until we get a connection */ *be_opened =3D false; -- 2.29.2 --Sig_/RLan_yhHKjNO8sw.RsoZ1YH Content-Type: application/pgp-signature Content-Description: OpenPGP digital signature -----BEGIN PGP SIGNATURE----- iQIzBAEBCAAdFiEEg/qxWKDZuPtyYo+kNasLKJxdslgFAl/p8qIACgkQNasLKJxd sljFrA/9FU2VviIBIypuyHVorTGpxE08NZ4nmyZWuVf2e508X8W1+bq9wq2xydpX OSMDa3RD72zpLdMOk3+m11LIF0LCK+pOtIGLXS1lj427u2ukaexuHpT1cS2B8jXH GaPvPCHRoguURGs5l4Z5qvY6OrOukn9acyY1lwQVpy/yPV0BJpjuH9beeXjCVEL6 fCC0+YofeYEdua0VW2mjqqYQ1llGypVpSYxU6ejqz/ftu8ShYdr9XT3bluLKl5ep ddJzDJie8EG5rFPCl2rdpnU3XBuOMss+Ow+5OhRo+4K1y9gOrBklVk7JocFg3r67 fz+KceqBRrYSwuLUksZeSHpLBacLHvf5Z/MYSPhL0qp/XM+YtdJf3Zo72byoUngw IbbqRqLVQwiHjZmjzWTZ7VZTaV/9M3/RAm4DK2sCSwR1WldpzyJ1Mhtkw24G2X/0 KJBHOc9SN2mntTFL8U76yhHrBQTGL1C5PsPuVCMFxqe4BxUYBn1uQi8g1TUWG2Ud 0HhM9lfK+d1LCyMuxe19B82erGoltTeiE279zjxswxK5ki+33OQ06lXnoeFPHzGJ km88+1bopvDn+NMwF7oRh5TiPO535zqpbU9IqWPHE/2Lz9UtD0+VXEl6twB+bJDA dGilzT4Dqf7okuIPKbXHo9wtNnyyyvKgwoWEQRvYFhHmEG+q/ok= =R/1t -----END PGP SIGNATURE----- --Sig_/RLan_yhHKjNO8sw.RsoZ1YH-- From nobody Tue Nov 18 07:45:27 2025 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=1609167813; cv=none; d=zohomail.com; s=zohoarc; b=UUo4Jb69HxWL3YuB/c9cqh5Umm20P0sgz6xR4dq4PVJ4caIJaQCH7lTvjK0wBNWjI0oATuaTR0BCbCBBRCWZofUVvlP8oMctVzStqPeLINqCBgVEbuH1L9ZRIBR9ccqU63UuMgC6H8GDcftR0acuk6lpXTsC5Xq3lQLMRI6EHxU= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1609167813; 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=qJqUBJI80lLPYr63lqEZmMq3HEBebwDipqX61uOTUVI=; b=cSBS/Fh85Tbapa+1bWzVb3gX04RQ0aee45kXnQKsP5ONl/V+NY/zxXXaL9AbOrxWRUsz3o1kN/QPZWmSRSdwmoQDeWr79im8n7SH2IfFfdD1XHgXSyxgEbrGH6TkUTA7iILk7fcQ0nZ7eZF8oKoEDboclylhwAvZp3LM5ayl3D8= 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 1609167813122909.5723623873859; Mon, 28 Dec 2020 07:03:33 -0800 (PST) Received: from localhost ([::1]:32824 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1ktu2T-0005xv-S8 for importer@patchew.org; Mon, 28 Dec 2020 10:02:25 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:47740) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kttz7-0002yU-3r; Mon, 28 Dec 2020 09:58:57 -0500 Received: from mout.web.de ([212.227.15.3]:60253) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kttz4-0006ZG-S9; Mon, 28 Dec 2020 09:58:56 -0500 Received: from gecko.fritz.box ([94.134.180.94]) by smtp.web.de (mrweb002 [213.165.67.108]) with ESMTPSA (Nemesis) id 0LbImQ-1kA5Z40g8I-00kvWP; Mon, 28 Dec 2020 15:58:48 +0100 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=web.de; s=dbaedf251592; t=1609167528; bh=gnqP+PjsQ+2XVKsqF0NL/y9CLxmi5xk6iZ+6W4OvvWU=; h=X-UI-Sender-Class:Date:From:To:Cc:Subject:In-Reply-To:References; b=J0Inf82Zrhl/uijAgU8lY0SBYPtRhO1qYlUvezaBKUWePHwugYkyZuy0dtpjg3FCC h51p2OATpdcvab/z6m7vbsmMB5sXxQ1obVDeKgu/xhMasnNQouJ9wTO6tdSSFBzjLn jGrpnOlUvcxEvtcxDBI+KX7aPvrr3zk92inGIFeI= X-UI-Sender-Class: c548c8c5-30a9-4db5-a2e7-cb6cb037b8f9 Date: Mon, 28 Dec 2020 15:58:46 +0100 From: Lukas Straub To: qemu-devel Subject: [PATCH v13 4/7] migration: Add yank feature Message-ID: In-Reply-To: References: MIME-Version: 1.0 Content-Type: multipart/signed; boundary="Sig_/k.lJhpPiy6YPDGyIX/lZlos"; protocol="application/pgp-signature"; micalg=pgp-sha256 X-Provags-ID: V03:K1:p7VzboNkqcyJ6k+MN6He5G4OAo97kBTf9xTZHcKbTA7gFcbK62v OEZJyXsMup76ITN9UakzAFfmjZSSu9MHkN1dC6ob8YqcSizvzDuFtFjnW9D3TOvQDWuTal4 s4P6v/ijeiwB9RjJO0ync3b09Jw6jrgOv8DJL6ldyPDlrPzym8yY4y7ADf5MR7uOVHCl/xh zkIXFKaPy5+aocMfTX11Q== X-UI-Out-Filterresults: notjunk:1;V03:K0:tkpxx+039F8=:vrgMBZ2gCN4JWdKXD2j8zi bRRKB1UcA+8fw1ODQx78vodtymki86g8qqPXSh7xplpiEibMdIoH4at5n3QxKpkhkodbXeRgI vpzLQXGVDhZ9aewNKWo2k8ti8afFafKj6LK75Bma0eOd8g2a7+S1+WSxeuynYS6YpcU4uysBq Kh22fMV30mjF2Rucsrl/z0UDwJhaHtRdVbrO9/ZYToxWROjwh4edZXi7LT9O7ZZYwFmP9ZcMU swVP47pTy17DSS2bZyoUiRSFheMC+wsIxBlxVqlNyP1MPcwY2v2vikRUGY+NB0gqWpImczVdl oAOupJ0BLuLnBm1n3M6LIYL8NNOL7His+g5zYOZ+YU9fqTYlezOEzux4I5jMQ11Wk8EnIedgG JOfu5sUGkQ9sfIWbcbsk0ALTbrH3HNUDdykyqjVsIHALXRGUPjbV03LVrP2sPnKBPEsf8cgQh 0ddkM1Xq8PndUfNMeikqo6xYL5SBSOrzSaaejCkS833ItD1LCNnn2dv3yJmneNjCtTSJ2KanE gfBWsYT4wxODYH56uqcyWhYkYeabEZ+9qB2BNEVZaaRG07CQGj19F8apWCMFu4J3Y6vyC6OiV 7q0Pl7Dqx/TYXXmXzxUrT4T5lh46A2E2YO+0/IFOcih+LuVBPO8+P2Sa+iEsMs03gs2p2vyO1 RrwKiLqG4CD4/Bxafcyr6X44iaaUdaJ9szfB7ucAGKh+aLifNjd8NAkodbupVZcXnKI60+KT1 yxXL2x+4prpZZ+itdYJazrIlSt5EfS7hP35n7Ah/5zaEgBUCJv3EuR4fLdnEZI/kjhs/SXW2J f+Rxr7IelBxR2qj/y5nJ73oPJe0TJiPw6TrOR7baF6DYeEoOZ/hnUAXNmAp2MR/DMdGrRkTGU ppXIRMNqLlRTYbD+ggl0F+gWC9edwVchUcBSFTn6M= 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-Spam_score_int: -9 X-Spam_score: -1.0 X-Spam_bar: - X-Spam_report: (-1.0 / 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, RCVD_IN_SORBS_WEB=1.5, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=no 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?= =?UTF-8?B?XA==?=" , qemu-block , Juan Quintela , Markus Armbruster , "Dr. David Alan Gilbert" , Max Reitz , =?UTF-8?B?TWFyYy1BbmRyw6k=?= Lureau , Paolo Bonzini , =?UTF-8?B?TWFyYy1BbmRyw6k=?= 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_/k.lJhpPiy6YPDGyIX/lZlos 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 | 22 ++++++++++++++++++++++ migration/multifd.c | 10 ++++++++++ migration/qemu-file-channel.c | 7 +++++++ migration/savevm.c | 5 +++++ 5 files changed, 57 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 e0dbde4091..92f7cb70b2 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" @@ -254,6 +255,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) @@ -418,6 +421,10 @@ static void qemu_start_incoming_migration(const char *= uri, Error **errp) { const char *p =3D NULL; + if (!yank_register_instance(MIGRATION_YANK_INSTANCE, errp)) { + return; + } + qapi_event_send_migration(MIGRATION_STATUS_SETUP); if (strstart(uri, "tcp:", &p) || strstart(uri, "unix:", NULL) || @@ -432,6 +439,7 @@ static void qemu_start_incoming_migration(const char *u= ri, Error **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); } } @@ -1737,6 +1745,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) @@ -2011,6 +2020,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); } @@ -2148,6 +2158,12 @@ void qmp_migrate(const char *uri, bool has_blk, bool= blk, return; } + if (!(has_resume && resume)) { + if (!yank_register_instance(MIGRATION_YANK_INSTANCE, errp)) { + return; + } + } + if (strstart(uri, "tcp:", &p) || strstart(uri, "unix:", NULL) || strstart(uri, "vsock:", NULL)) { @@ -2161,6 +2177,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, @@ -2170,6 +2189,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..b3c29776db 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,10 @@ int load_snapshot(const char *name, Error **errp) qemu_system_reset(SHUTDOWN_CAUSE_NONE); mis->from_src_file =3D f; + if (!yank_register_instance(MIGRATION_YANK_INSTANCE, errp)) { + ret =3D -EINVAL; + goto err_drain; + } aio_context_acquire(aio_context); ret =3D qemu_loadvm_state(f); migration_incoming_state_destroy(); -- 2.29.2 --Sig_/k.lJhpPiy6YPDGyIX/lZlos Content-Type: application/pgp-signature Content-Description: OpenPGP digital signature -----BEGIN PGP SIGNATURE----- iQIzBAEBCAAdFiEEg/qxWKDZuPtyYo+kNasLKJxdslgFAl/p8qYACgkQNasLKJxd sliKoBAAmSklPTThfY9rstMAEwK+ErtMC9GTTsQ/A/Ea8yBdW8HcBVn6GC4DCdgz zwC1QPdUUDVm7TkI0UXs6TzIiQzdF1fKoC8hotvYlpIIvaykbhxdbGpo0uWFtgJF m+1g1WHBuut3J86J0WUd4s1TUsNdDY8p3+M+lKJoZOJSnRrHtHR2RKMM68p5saD6 7pLm1IAKtkkFIWM14V2avCqUSXyHU7fCJp2CkT9Eo6kbZJ53/0JUiZquWVKNhr0N 0qz7z9QIUDjcHH+YocDdWu8d4fyjc25T9HS84EiJjRHAlk0kTuu4ylGQ6LxkPHzn ickrd0O5MPo0B7HhUlCLF6zo+8bAiee4RdQ+ntrmuWRQiof4w5EFZEaXFH1x0QT2 Gfu5hqDInJl92VwNqnQvxxIhSY3+ldlxkDAJZ4RuvEGezgCe+SS7wZ1GOCaBULuU miu/kCUEVBjzl620+mpPiCTQc3UJAn77Wz2KSJoLRFYbByf28Fb8oCwR6a31YWfw Tz/Ti5YNMPC3rlCI1btmW+3k3V2JP19e4p80m6xis39uJ9PCuFKVqb1pSserJCZC m0owELDU744JQd/vlzLbpJVCXLjqiej3xAlMjr1IdQ9wfW3ul5zWYn3YzO4tQZlv dwLyN50Gilu685Rnrh1b6g+pFlEK1eafJ1AR9uR6FGeVz0EOknI= =T7mT -----END PGP SIGNATURE----- --Sig_/k.lJhpPiy6YPDGyIX/lZlos-- From nobody Tue Nov 18 07:45:27 2025 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=1609167939; cv=none; d=zohomail.com; s=zohoarc; b=imdDy1Z7KL8pDl/wmPjn37YjFXw09Mo1L6/NnyxdNo4+edZ38MjkJaOC0hFtxTcuHRvH2kBhGhTYcpk3yZAEITEKOLu4YktfWGaaHbChDixnSOrh3d5gbqgkMN+bHiJW2oZMXMVIDC+OGvXcnIti+JMJHiwaez+SkXxlDl03hIU= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1609167939; 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=LYxBEDOiq6WwvsPlAB7VMHAGUuKX9SAL61JmhfDflJ8=; b=k2jSRPgFRcPKyc8PHiGeskPkYtla0P5P5frYafnjzNOnu//snq8f3JZPGYmoGxW/z8rVl9e1RMwrRM7YCIH+ZB3RjfX4oQPtBuedyEdwJem42ZndxQY70s/Qube9OkNcBqH7sDy/QFKx3oVh+Y3n6o503288KojUQaSo7+ca214= 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 1609167939003700.6900007123592; Mon, 28 Dec 2020 07:05:39 -0800 (PST) Received: from localhost ([::1]:39966 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1ktu5a-0000dL-8Y for importer@patchew.org; Mon, 28 Dec 2020 10:05:38 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:47756) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kttz9-00032O-6m; Mon, 28 Dec 2020 09:59:00 -0500 Received: from mout.web.de ([212.227.15.4]:59115) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kttz7-0006Zq-JB; Mon, 28 Dec 2020 09:58:58 -0500 Received: from gecko.fritz.box ([94.134.180.94]) by smtp.web.de (mrweb006 [213.165.67.108]) with ESMTPSA (Nemesis) id 1MBjMO-1kjysh31kS-00CUF6; Mon, 28 Dec 2020 15:58:51 +0100 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=web.de; s=dbaedf251592; t=1609167531; bh=xTxUnzjUnA38dyvVmkYbdHX7AdjG9X3ODr8poi3pd+k=; h=X-UI-Sender-Class:Date:From:To:Cc:Subject:In-Reply-To:References; b=osapwambrY5+EuJLAYoCEnCrDE4KwbxytPw65sUGxExvpzAKqnPjbT6ArBcPuENIK G6udYIgdLiKqwyMs7plTq+qaQbq89/sqSAVxPCiJW5Wp89DorOA1kjwV3S3oEZWSB4 XCH5Vh5UdeAJGbOqWz9VLtUYv8en5Bgfs/JB5IUo= X-UI-Sender-Class: c548c8c5-30a9-4db5-a2e7-cb6cb037b8f9 Date: Mon, 28 Dec 2020 15:58:50 +0100 From: Lukas Straub To: qemu-devel Subject: [PATCH v13 5/7] io/channel-tls.c: make qio_channel_tls_shutdown thread-safe Message-ID: <4708cdb2a270bc363d6de2d0b9ad74425ed0e2d1.1609166587.git.lukasstraub2@web.de> In-Reply-To: References: MIME-Version: 1.0 Content-Type: multipart/signed; boundary="Sig_/ZouMWtKK7q31XoOZfLk=Ud+"; protocol="application/pgp-signature"; micalg=pgp-sha256 X-Provags-ID: V03:K1:FS3mPOW/xfR9/6RJ1LbTyEDjnN7d0W+MxhW4iy6p7eeyZwtcKl+ FbJ5DKFBoePg8SYxzIlefXLbaT2AbwNOUyGVYtAJ+xjv/bX9dnl2mA8yCSVb71kTbIlPH5F UKUwMQgdHh6v8oo6nrO9euKbXpKQQnVJmbY9dfv/l0nglUYc0wgvO3LTl0Nq7fxjXay5gpc h4v8+HNkBXQLUBb5xB+MA== X-UI-Out-Filterresults: notjunk:1;V03:K0:f+ilFZRGpYY=:oa133+4ec7G8NksZOSap+E zWjOCxo0kpJXN5mFNkRhIzm7Nvsov4stMm4CTypRhSMub7p5YnKkYfNgjkdiEnecU7izDEPZY t8J77LbZuE2PEUtv3Uz1XR49LxdHj2ZO5Rja/E7oZrzxEwoElwfCbokCOLOTWG8i2udlZVjGT u4X7KOvOxbDziEImBiLJavhMiPVwk+PnezqMuf+nTV2kufWbGSciRnk7F4JLwaJbL/YIADYeC aPtjlKQ7LT8+dVRFieIFucsbEyRox6O/dLaa9hphsShGL5Hq39CupMKhSZovkWMJeMAtNFidE 3MdZ9DSPZZxt8qE5zK7tg5tPUxVIRAIVCz+/8Ir7vsCu3sKweJFKbqYMJoYR0t8MfU8vd1UIN JFVY3zan30fdfDwXZFhIFKq+1U2nIU+YImm2I75ur7mXPYUXhScKvHUm1Vkji7nFfdCm6pWEc IDtXzKL0MWX0oPz74+N2oL6o+BwP9wJRHZR0BUZ63CIdgwdCwcp4sbbRbKDuItD4N0eoJtlC1 V4heEZjRcJcBXdNqtBIyxzLb9rBG+iTIF64uVI07fFYQg1NWFC5AMSxnm5qCVN1OJO8WvVlwQ 8CVHwamy1PhEW+upqRvWjJJQW7JbqKocr+/fBx9JoWQeeXIzrYtjxWq2VJEbb+HUw9SBjOiB0 DyixDFpehuYsI0EtUJgD8rq0IMwXfyVq0yIDO/NEhch6nvqhYgSS+FlXfWRBwMqs3jF6XMbuk 21BXiA6f29zzWl/0BqHiSdMfGnmn/lVNoyVSDxJHV6Mtk6KMgwx5+4xbNzmwjIGRY0d0zUb2T wrKLO2XEjrPqQoao4g70aO3wfPn8qZEXNypOC3+vhnkCl36u/LaR8KfjSAuVSLgtVGop5w5ix 8Klzpw9YcORw3GqhYRo9D1TywFel2k4jI7XysSF5c= 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-Spam_score_int: -9 X-Spam_score: -1.0 X-Spam_bar: - X-Spam_report: (-1.0 / 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, RCVD_IN_SORBS_WEB=1.5, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=no 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?= =?UTF-8?B?XA==?=" , qemu-block , Juan Quintela , Markus Armbruster , "Dr. David Alan Gilbert" , Max Reitz , =?UTF-8?B?TWFyYy1BbmRyw6k=?= Lureau , Paolo Bonzini , =?UTF-8?B?TWFyYy1BbmRyw6k=?= 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_/ZouMWtKK7q31XoOZfLk=Ud+ 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.29.2 --Sig_/ZouMWtKK7q31XoOZfLk=Ud+ Content-Type: application/pgp-signature Content-Description: OpenPGP digital signature -----BEGIN PGP SIGNATURE----- iQIzBAEBCAAdFiEEg/qxWKDZuPtyYo+kNasLKJxdslgFAl/p8qoACgkQNasLKJxd slih0RAAiVvPtZzfGwM4vN9rQ9LxFQmfYTp5kmTEejWUBnhJk3uSk7DhpApXCPHY Jom3X5ZJMyXFJ5kDSbNWFiDT/HN4fKHiDnaJGFUt0kcFv6pmXdm42arZCordxYNR X5/F5IyePJmja8P3kKIYexg2n3DKKKmwxyEVyulWijqNZviL/W9btTHoMx9U3Oup +AhD18M9j37LYrAYd+u7IV+SPET9pFVkf1RLbJ/c2UdEsIr5lgAryvn2eA0iB7TB V7K4tdpp4imwSaDfmdxD6+nfLfomRePgln+R4Z8gBKV8l6e0uFh1ChaOHE/mGXCK Rb7LaPm+9b3ra2AvV3IEOznQgbVM14XR6vlduoaopgrM6KRE4r27UweD7JYrYdeD Jc5zFyxQu5OCv6mPb0h0oSuhKvm/UId2Cdvnf7cBLBjXeBY0tqym6P5JwfdsP1yG m6R33ugGrOj15I7FZzxHj32dzLNopz/9+tu16BwKFISXTRe9dYN/UP8vBcGaAQGz rKnR/e7mx2lmqdoWbW0uoKcXyRCxDpbCmzq5Jd/y7hV1QnyEPGDofDe6ayWtKINM 9hHRL2Wp5+e2rhUzzmTu+bnTf2XtWhAzOggygFY3Bb5JNghn2H3t5wTvqQEp8WvM KT+nkXcYAkFtqMNmB4swEe7TOSX7L4EZU7ja3HTSc39q/ta1d/0= =GA7G -----END PGP SIGNATURE----- --Sig_/ZouMWtKK7q31XoOZfLk=Ud+-- From nobody Tue Nov 18 07:45:27 2025 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=1609167919; cv=none; d=zohomail.com; s=zohoarc; b=YhLhkOTE2ZYGrM7jzt5cz77qwHzyDagW0qQf0Crp6rRzAbF+AWu0SZ9hYh/qEfpIP1voffReOUfAnUj9Po993P6BEcR8QQjlmmxFKQN3w/3s+vDEjgkuDal3YimouKZF0Pc772cZETBL4MMey+IhGQrZ6PZnHUbHpbjiDewyMzU= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1609167919; 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=sLuXX8PPTHqStzmYh+GoGQgsC+qoISJNo5zc44wlH0o=; b=Cf+xnQ78LLAd2qcCRW9UemGIV0rLcJshQAwC5cKvAbA5bhEk/6d77h0s4VZUxpgl8XDDUNRtAJpTH7WEmyX82iClq5P1/2d55m5mQoQBkdwkLQ1o2drSZer2+q/fCobhjwUb0HMXYswpoUmXZGDwVmpf4W3YKip+A1jwysWnyIo= 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 1609167919215955.1871750652444; Mon, 28 Dec 2020 07:05:19 -0800 (PST) Received: from localhost ([::1]:38560 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1ktu5G-0008Sb-4N for importer@patchew.org; Mon, 28 Dec 2020 10:05:18 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:47768) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kttzC-00034W-BM; Mon, 28 Dec 2020 09:59:03 -0500 Received: from mout.web.de ([212.227.15.14]:37419) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kttzA-0006b5-N3; Mon, 28 Dec 2020 09:59:02 -0500 Received: from gecko.fritz.box ([94.134.180.94]) by smtp.web.de (mrweb005 [213.165.67.108]) with ESMTPSA (Nemesis) id 1MJFhX-1kaJjI0e2l-00KXg3; Mon, 28 Dec 2020 15:58:55 +0100 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=web.de; s=dbaedf251592; t=1609167535; bh=QI3mrNzj10vI74Bk2dsysQrsN0HaknZHWM9x8Uj2gFQ=; h=X-UI-Sender-Class:Date:From:To:Cc:Subject:In-Reply-To:References; b=SU+sOdTQ+YOmRiMuVdSjXnLpc186keWvf3HsjDTxMB6HF6XWaREUI4Ple45u6apja c/tBOlDv0zoXU9SwQyjnWcqDA2GusGuwUw0ZfSbp4Cm54D00HfBgW4mG2Qi0Gl3Eb/ NgCrBNwxW4TN73GoQ8cTc1FudlwR0wcRfBohnll8= X-UI-Sender-Class: c548c8c5-30a9-4db5-a2e7-cb6cb037b8f9 Date: Mon, 28 Dec 2020 15:58:53 +0100 From: Lukas Straub To: qemu-devel Subject: [PATCH v13 6/7] io: Document qmp oob suitability of qio_channel_shutdown and io_shutdown Message-ID: <4bb8a3f8653353f03cbc796b96871ca3c1925a8d.1609166587.git.lukasstraub2@web.de> In-Reply-To: References: MIME-Version: 1.0 Content-Type: multipart/signed; boundary="Sig_/TfPekmIxY3g.3UgTV.YJgxz"; protocol="application/pgp-signature"; micalg=pgp-sha256 X-Provags-ID: V03:K1:BkGuW1TGI1SKPefLGGhR51hSelAGPd72ry/Iq/SD+JnPoyRKeAo WR6S6/ZMl8inQ859TiD1lRU1et/7/KSUPCrpNQZH7Hatk35aVEhSRBtEC7E00yY2PbeZqvg jk8PoievXn0qcQu7+lNbv/r08mrJac+Ug7+5ror0zb6bXL66HpLK9EtcNe2Kt0oTlxJy1Hj 8WSntlyjukZ8GD64jqQUg== X-UI-Out-Filterresults: notjunk:1;V03:K0:7FUe3J/NMhI=:aPpOCjoU5QNM3H7vlJz5fh JAFkEU5KRn2wzmI3wn+zsgX0ZETvHmpIEHm3MOaTz3Z0d4Hc4hq2yDtprMR3rtvZui00Gbg3w iAwr78yMhLq51hTIVxhghF2WePGQxwCwH9PBT7xTFaVWpg5+mOsu+NsIQdPCeV2Gv8g0dT9XL u6MWA+KwzmNjK4jYHB8zmoc/iAg7XIJX8ztrgGPSRs5t+ig/z8JznmbK1vIB56MnmFXkrqcDe K9VvEoJsRM5LXh8kF+8qEqpYLk8UkQHFnJbDI0zpbCSnj9OB4j2+bClC6x2WzFlSXQB/jdnGo uIiKw+e4SWo1DH1FOcW/V7Jogcj0bxrzOPYHtLv38lMEmYS7tfM+lOVkwLm6Acjmb3sfxhqyU qjcoulbVUWtrze/Z4is6tq0g7GxvLatzCZC35eewuaNlMNgWdsRqQCwnw6oYjIZoayIXr3T20 eL7ViYIJcX7TCJlZVrdsF3RKCBSLYTeoA2vy7j3bf2yJgGx+NZ53H2I/FlIgsPEdMiW/JYUiq 4erKdpmNtTcfdk1baQMuApsQg8YKX0Rbpu9CaHjAv6NKq9/Nm80sJ7KKpAjzzbLhLPNd2A0tp eBD0cFIf1+ckV5H42g2tHlcihU1OgNgIXAec609aGG95bYBu7HJOxpXfUNeC9JFETmuP6+BTh k6e6AL6NrQIebQok6N+/F5+MrDHEggt6Kcz1RLBjB2vmLCoEEKQwldpjtdl4Zr5L+w1ODjH+v NTAZwpQquypHIPYnCZ45Mwv/SieK+JPRfgR7Ah4ZaIgYK47jK2TdB2PX+3xS0ETDCbrCfZxdU QsMJuJsBANmgzjrJW7aJznh5TMRWi5JOqg+9/uK/lDnAYgBDqYdkOyHA31FUYYfWBLgPnRheH PLqfgdN2jIrY5lnn3tS4XMGMezmWbt8KTF3zR6K0k= 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-Spam_score_int: -10 X-Spam_score: -1.1 X-Spam_bar: - X-Spam_report: (-1.1 / 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, RCVD_IN_SORBS_WEB=1.5, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=no 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?= =?UTF-8?B?XA==?=" , qemu-block , Juan Quintela , Markus Armbruster , "Dr. David Alan Gilbert" , Max Reitz , =?UTF-8?B?TWFyYy1BbmRyw6k=?= Lureau , Paolo Bonzini , =?UTF-8?B?TWFyYy1BbmRyw6k=?= 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_/TfPekmIxY3g.3UgTV.YJgxz 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.29.2 --Sig_/TfPekmIxY3g.3UgTV.YJgxz Content-Type: application/pgp-signature Content-Description: OpenPGP digital signature -----BEGIN PGP SIGNATURE----- iQIzBAEBCAAdFiEEg/qxWKDZuPtyYo+kNasLKJxdslgFAl/p8q0ACgkQNasLKJxd slgcjA/9FZ9QtcrreXZj2Jy/65hiYC2bbeg9ZnTLu1TfKS3JdnTiudVQf1S0sdAg JheAevF+0lUdzDMeM3yLkxC+s73X+c6ZSHl39o3SW7XVoHCcHzcFLhgwslm2wkKF /TPt2/fOqD8FDjxZLdwBc0AWbq7g7v+cuRHQ4PtXChBnisMIkrsjtYfcwSzRrefZ T6+TQwJhf6+Yc4tXJsauPdVrElTXjm8TUOPQm1RyMHgMhayKOA696900JCZy4oOX vU1NvyNf9ZFelI12yAw4Nf3N7KieyRkwgW1mpgTIxmQfEoWBX1hjbdOipE0Wgxpf zkv1Y6XiDe3Hb78sRnngew/yf8N6ydKMAinh/eWr2jxr2ETf3qEc37s2ON55hJvA dwJWeXNCM7W25PlwJD3QdtTxu4T5b3oHtza7V7gg8Hw6gs1mmjT5cjS3j+7fuFcT 6Su/sxMw4SHfQa+aRkQAIURIQQ9EtmIoBDzO/yJLMTusLOoKzwi3TrqgyWsh2foX uy68rmOAJDvh3QZeukA6yL5qhXVA7BMAW9wwWjKf18zOCE6Q2qj+pZ1Jf6lIu7VZ Czqs/ysUo5OYvWzfzX7QXaYxLydEdZsMEadN44TwXGBDPpfReMvlVpziqfS0fhuu XUJfz+DNxmxMUQzKWazjYNrqOdSJdTtSca3b2STWbEvzPJZ8hNQ= =uORr -----END PGP SIGNATURE----- --Sig_/TfPekmIxY3g.3UgTV.YJgxz-- From nobody Tue Nov 18 07:45:27 2025 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=1609168086; cv=none; d=zohomail.com; s=zohoarc; b=WxghJRagn/wTvXePhiQcWoJTjILCm1q6UuK3HBpjyhg8xYg6osJweJRlra674/3Qc6cne455EGnlswlfuIw+JInl3xWSPylvsFtXeCAbq7pvHmtlObhz38pgsGUtCmVTL61fF9Ug15OfF/Giw600z1fGyMfwKRqojj28r9MUQnM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1609168086; 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=TAK++oLR+OF7dpg6tUwMY/bqa1aCVwYhVaVnFSrYq3o=; b=hMqa6UGZLJV1azRl8boSVHZp7Nape75UYCyaTPt98+1BzoVCamyHEGaqILTRY+ryuYTdFASVSvZSHpUCO2KtVRtXrsS9/4BamNrR6LrihVoUiEtwb2LkK72yJkx0AqB/Y2AdRKxgzmjI+bFDH0aXu4NUJqy9Z+n2SMdFun48eu0= 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 1609168086778885.6874647058715; Mon, 28 Dec 2020 07:08:06 -0800 (PST) Received: from localhost ([::1]:45530 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1ktu7v-0003C9-TR for importer@patchew.org; Mon, 28 Dec 2020 10:08:04 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:47796) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kttzH-00039R-BF; Mon, 28 Dec 2020 09:59:07 -0500 Received: from mout.web.de ([212.227.15.4]:52939) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kttzE-0006c1-RX; Mon, 28 Dec 2020 09:59:06 -0500 Received: from gecko.fritz.box ([94.134.180.94]) by smtp.web.de (mrweb006 [213.165.67.108]) with ESMTPSA (Nemesis) id 1MCXVX-1klLGL2qDz-009SnD; Mon, 28 Dec 2020 15:58:58 +0100 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=web.de; s=dbaedf251592; t=1609167538; bh=ipBmsX1SFyAij89NB6kxoOpqTTdNm75hepOGVJoieTA=; h=X-UI-Sender-Class:Date:From:To:Cc:Subject:In-Reply-To:References; b=lgHODEMwIBYTs2U0Twxbv7frDFEc/gs2942//wkYIJ0uepUETGrevHwrhFGutZsYC 50ltj3ISUsMWqcAT2N+9Ia53e3pOyC9/Ous2fg1uQnLr3N2EB4robZc1O/fuISGt43 A7VfqqVjnbhZ1TV+9wjbUUDya12w0Xtm0yzmWCqA= X-UI-Sender-Class: c548c8c5-30a9-4db5-a2e7-cb6cb037b8f9 Date: Mon, 28 Dec 2020 15:58:57 +0100 From: Lukas Straub To: qemu-devel Subject: [PATCH v13 7/7] tests/test-char.c: Wait for the chardev to connect in char_socket_client_dupid_test Message-ID: <164d36294fb8d85727e9561ed26e449514f719ff.1609166587.git.lukasstraub2@web.de> In-Reply-To: References: MIME-Version: 1.0 Content-Type: multipart/signed; boundary="Sig_/G9s=tPd95V5mxr=7vco_rF1"; protocol="application/pgp-signature"; micalg=pgp-sha256 X-Provags-ID: V03:K1:DGCGrIHVEJ69kqZBeKPYSSR++LiiAPZjDAQ2kTpqyYvvAaWfj8P XJJxS/GKWB9bJPJUpqzSWI2lNwBeKS6qGd0b+vFuPXgH+7LbYLFXGdPj2E/RSUmRyYtKkkk DDIE9P2FlJ0x9INvMk5ZkDfApG7WyarD/Bh3frP+MhhiBjM3pkYTBjb2aWIK4bt6r/3BQrj OJa8/9jHyN2mQujJW4SAA== X-UI-Out-Filterresults: notjunk:1;V03:K0:DMHKrTPWo38=:hlhWgb+p+SYiB1S5oXXcFj Hi1bXRDiqe9ofhV5DSBEADzekLqV/ycEwcwu/saZSY9wJnbEXQUi5VD1qMr3FzQdD0ddRHPmt 2prNv23FGKBa+jTYvHfJ/Jtduy4c0PBS0vVbA+mhZFOKKdqvSiFGjbrqYcF/q9KTAjqLCiscJ 5ejp5SxFSkSEMEKQct5NfRD7W5IOkig5nzZb2L9+eONDtktHJ+vsRh8Vi5kpkGfr6Lujo9L/0 7MO2mnW/grz6Zc6YZ4gCaDGC+5TFM/ni7Nuzg8KrlM3E4LcvOFa6JNkRfqPFS/LrAzrJN+Ces YN+gth/5Im87wRVETAEd9zlcEb5jkygVkvOHLGyFMUHHp5o99lFkxCuwAlC+ijnJ+LP4LFkgH 6Pk7Lj2TqOl34EoYn68NbSY6tPGF9ONXG++QLJONry+YR6UbHbNPWD9ivYCE5HhXQEWbSy6dr /IskCBicHKB+KXlTRPTftHg8lgcE8hekhESl20X8QcMJoY2lHieLkZ2VSnUni6wg5yBraxCPl FU7GN4n4jP9vkHQxa5T8BxAeLFI96A7dRbLKZgPcQpSjGFIc+iulmae/OasDquRiwvnXgKzRa Q5gs+nFQpaqxlTYVKj575IaaQcRTGf98Gg4vLZHyvE8nf0YzLNmkSoLoicKm1+HbNgUXSZCP0 WpT0gya3Sp5P8Grv6AN5hA638oFIRL8HjA8AGxnOe1BQWO8F198uCEZAWQvKIHNCeCyFJQUcD Ah3Azc5hqc6V7QtdwNgiuRIs6K9iLyEGAlI6VMoGi/sXBjjV/WU++u07/IBANE0MIoAq+U3QV 8Akn8vRC4bzgpSJlpA2DiSqAByDnPMPFXVUHnhh2g/R6tuaV7x/TELkTmt9O+Q/L0S4bq19C9 +CyNY/DNtXoaY6F96xau6Jdeohc73/DWTLHNcG15s= 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-Spam_score_int: -9 X-Spam_score: -1.0 X-Spam_bar: - X-Spam_report: (-1.0 / 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, RCVD_IN_SORBS_WEB=1.5, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=no 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?= =?UTF-8?B?XA==?=" , qemu-block , Juan Quintela , Markus Armbruster , "Dr. David Alan Gilbert" , Max Reitz , =?UTF-8?B?TWFyYy1BbmRyw6k=?= Lureau , Paolo Bonzini , =?UTF-8?B?TWFyYy1BbmRyw6k=?= 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_/G9s=tPd95V5mxr=7vco_rF1 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 953e0d1c1f..41a76410d8 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.29.2 --Sig_/G9s=tPd95V5mxr=7vco_rF1 Content-Type: application/pgp-signature Content-Description: OpenPGP digital signature -----BEGIN PGP SIGNATURE----- iQIzBAEBCAAdFiEEg/qxWKDZuPtyYo+kNasLKJxdslgFAl/p8rEACgkQNasLKJxd slj63A//f4EPdB1qdhJtdwpPuLXxpuhAl6SXnejqopIpjLlpxD8oC2nXOHQTqyJo mKoJ18VzaAmAaObWorZncAw1+tiohy8hgqTD6PJ3LhGTvfQy8lqEuCbsPVTh21Ye XG+7hbHJYQnm8ev7YmJjqD9B/tLNRxmKCsSl6MX6s1NJ2NxZB0Vfa2IVQaFkAvRz 16p4bxyBm/NWdO/iynRMu1ur02fZGdGIoBHnzfCONr2ScOIZYGmXZnpqv7Hpbg2e VtMj6riWYEhZLPm4dWb7O1W0c3tuvwqIKjDYcgm4xnwyKHPdfNpA0+ZQh7OFsF1U Chw2RVKFblwlCfUHgDsbNZlEuI9y+jQjIEJK5l/8l3h9da9VL3QP1O9jWwit5ePR kpPe5dC8vhb8a++JaJW7S9lelWGwKeDiFVR0eIvQsZDxl/aEQZn5Rjx6ZACl+/hD O6VJjfnhpdSKO4SbzXEZ3CPpsmHYaHKNRyrdMJxW7g4Rv0CK6/iJLw7IW56jHQNR XaRiGGMCOeOP2HqOczCnrvOwYCUDaR2J8XJ1MwXogk+mV/GqZP65WKoxQTRT+LH1 VRZzwHGDTJF+CbT/47LAVp2D4JUXRg5JzWWgraAorhVXuZ50xWpdwDvW4qUDV5lE D6htXOvYEyLHFiiN+rxvDpUcgkK64T3rFpo+QWVVYAYvmwNOatQ= =g8bo -----END PGP SIGNATURE----- --Sig_/G9s=tPd95V5mxr=7vco_rF1--