From patchwork Fri Jul 31 09:26:34 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Lukas Straub X-Patchwork-Id: 277224 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-9.8 required=3.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH, MAILING_LIST_MULTI, SIGNED_OFF_BY, SPF_HELO_NONE, SPF_PASS autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 960DDC433E1 for ; Fri, 31 Jul 2020 09:30:10 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 5372A208E4 for ; Fri, 31 Jul 2020 09:30:10 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=web.de header.i=@web.de header.b="e8V465pn" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 5372A208E4 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=web.de Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Received: from localhost ([::1]:46560 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1k1RMf-00012U-DF for qemu-devel@archiver.kernel.org; Fri, 31 Jul 2020 05:30:09 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:41942) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1k1RJL-0007bD-5p; Fri, 31 Jul 2020 05:26:43 -0400 Received: from mout.web.de ([212.227.15.4]:39459) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1k1RJI-0003Fv-Uu; Fri, 31 Jul 2020 05:26:42 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=web.de; s=dbaedf251592; t=1596187595; bh=e7XrG0q0BggR4NGeAWzNMkAErCEdihn+gE4jYSP5rWc=; h=X-UI-Sender-Class:Date:From:To:Cc:Subject:In-Reply-To:References; b=e8V465pnppyUEPGK4GWEKL3urJQn5QNNRLAEeQUWYYSbB6uBb+4HKns4AvXUlMXcP 8I3cZ4XTgwXFmkAbEqdGXyKwwFZSDkJK4Mn5leZni4tjk6g50VotGusHB7f/6R9qnx JHL5n8G7oyoDPkXhnlJDSK1lhNdZMpDibjNiwHO8= X-UI-Sender-Class: c548c8c5-30a9-4db5-a2e7-cb6cb037b8f9 Received: from luklap ([88.130.61.42]) by smtp.web.de (mrweb002 [213.165.67.108]) with ESMTPSA (Nemesis) id 0LpOKb-1kfkD81cKj-00fDVF; Fri, 31 Jul 2020 11:26:35 +0200 Date: Fri, 31 Jul 2020 11:26:34 +0200 From: Lukas Straub To: qemu-devel Subject: [PATCH v6 1/9] Introduce yank feature Message-ID: <48e682c12802af768f99a6fbc32f2a163d7f508f.1596184200.git.lukasstraub2@web.de> In-Reply-To: References: MIME-Version: 1.0 X-Provags-ID: V03:K1:EmEr73zI2BFlut3t2aFjGkVd+p1oq3kCqhgyzrNfaNGeI9QavkX OOv/C4YFP5SHb8uLVij91vnLlbXKfeO0u9bjMfYItVSj5b8oTQuaGaveQESmbrd2K1awZAS pWJgMfI44n9Yc1kcYyt4ODAvud8grWaBul5IRgIivONPAXsWdWFp7PV6Tb8n5+3WBbX4DCS 6+2fpmUuXfffH1uVJR3BA== X-UI-Out-Filterresults: notjunk:1; V03:K0:R/PyQxy+cUQ=:15BeITMb+itL+pMtixCrkk Z2OoUrur26MSjnQogPHjHsqIIk/oAJZmA2j0lYTvHWwJjeCYSDHGvCjETW9QLuK49ovkK0DvI lFU9WEuIh9GdDexxLxa0ZE+u52W8ViwHe3/pg1z9V4x2++jDDq2JZz0JDfqutQwiPnjbhXiK9 5umfccqXXF5ge7ca+bizBpSVlLtdtky4vANIIjNmO2pPG/BQvbP8I+804K6FzbcixNSCYtYpV 1wYIsIoCxXCMS84GJ9YkUQE//IStqYv6IFJ0/fWwtEej525Mx4dbksFTh5SNYv+WUVq98U4zx PpcPzjLt1AHwZnYrD2jBX9ZsiOsu9bk8HGh1sGu2zGgu3vi5Gr/pfhQ7bVUN/USMv4toeV0YS O/bSj/WYy6gtXEaR3PqnpUBWTr5G1JXekGdzmKExMNStQbs3Bb88HsCYp9ByI07/BRA7FdOpW FuJiIl87rYmhkuNSjt/ph3Rl3aF+7FHy7Kf+9RQr6LDK+BiM5kIzcD8Wd0dRziz6TZSzJUO5e oDlGViUnkY4Nj5Is0GgA+zy+2Tk0s3wMvy2j373p4DLbTXsUP9ljgoLtQfuBkTW1OnlWuDt5P 9N5S/aIjaWu/DguSQNRqsRbL0NbgSUTrM8vib8dKHvy4pbDrgW/DpiLAJjbKUTG7DX23aLt22 WzEEAeE4Kc2XLJZ2/vUswJSadws14npa1Y8/36ZQOrvu81YjUuCQmI+Qn34KzBv6LUDnQz9Bo g2x7nErxOnW9xDq0a2CDHQ/RqOpt7iRlRxFhmv5ZyQM0umHaAR0GToVDnbpoXB+c0HS2R4ni5 DtP6OgzQNQqQvCbfL+8O6L79hZWeKO02DZ8dXagDH5lXrKN0MS4HJng6KTue3e/upMgelvtzw Oj6L2X54iNGkWtP4fGXtuTY+ZWebJNYmvz0dpxAiZd4FKYyZYCijnGQ5RY0GnJ8rLG2PsYeeK XTzuGNUFg7IlcWm4KTh7+gN5hvOeTRxuO/pUhzzWgpGnEoURVK7ImU+ZFMCP22jRBz+eS3Ge1 65B9cPawfiXC4D+RE5ZTKyHX7D+5PXmNpIsyZf3g+OSy2FA702WXeynvJkLmefwI+mQiyv6Ug 8CASvn/wjQgTwEwTpo9YQzFgywMoET4gMoqNHx36lIPnQHv3xS49W8pvoLPc0oXwSeNj6TA2l DdHXtU9hQVtJ13o1x3IbPcZV9IUX+ftuwffOd4tf70yBOfTlLjGHUqTX/UUnqbimFO23XBZWk Rh8hsqJ/DcphqPYx3lNpKNUDsPMRDAPfaw9YHMA== 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/07/31 05:26:39 X-ACL-Warn: Detected OS = Linux 2.2.x-3.x [generic] X-Spam_score_int: -25 X-Spam_score: -2.6 X-Spam_bar: -- X-Spam_report: (-2.6 / 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.01, RCVD_IN_MSPIKE_WL=-0.01, 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 , "Dr. David Alan Gilbert" , Max Reitz , Paolo Bonzini , =?utf-8?q?Marc-Andr=C3=A9?= Lureau Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: "Qemu-devel" 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 Reviewed-by: Daniel P. Berrangé Acked-by: Stefan Hajnoczi --- include/qemu/yank.h | 79 +++++++++++++++++++ qapi/misc.json | 45 +++++++++++ util/Makefile.objs | 1 + util/yank.c | 179 ++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 304 insertions(+) create mode 100644 include/qemu/yank.h create mode 100644 util/yank.c -- 2.20.1 diff --git a/include/qemu/yank.h b/include/qemu/yank.h new file mode 100644 index 0000000000..294094ba74 --- /dev/null +++ b/include/qemu/yank.h @@ -0,0 +1,79 @@ +/* + * QEMU yank feature + * + * Copyright (c) Lukas Straub + * + * This work is licensed under the terms of the GNU GPL, version 2 or later. + * See the COPYING file in the top-level directory. + */ + +#ifndef YANK_H +#define 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 yank + * function is registered for this instance. + * + * This function is thread-safe. + * + * @instance_name: The globally unique name of the instance. + */ +void yank_register_instance(const char *instance_name); + +/** + * yank_unregister_instance: Unregister a instance. + * + * This unregisters a instance. Must be called only after every yank function + * of the instance has been unregistered. + * + * This function is thread-safe. + * + * @instance_name: The name of the instance. + */ +void yank_unregister_instance(const char *instance_name); + +/** + * yank_register_function: Register a yank function + * + * This registers a yank function. All limitations of qmp oob commands apply + * to the yank function as well. + * + * This function is thread-safe. + * + * @instance_name: The name of the instance + * @func: The yank function + * @opaque: Will be passed to the yank function + */ +void yank_register_function(const char *instance_name, + YankFn *func, + void *opaque); + +/** + * yank_unregister_function: Unregister a yank function + * + * This unregisters a yank function. + * + * This function is thread-safe. + * + * @instance_name: The name of 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 char *instance_name, + YankFn *func, + void *opaque); + +/** + * yank_unregister_function: 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); +#endif diff --git a/qapi/misc.json b/qapi/misc.json index 149c925246..4bd17270ed 100644 --- a/qapi/misc.json +++ b/qapi/misc.json @@ -1614,3 +1614,48 @@ ## { 'command': 'query-vm-generation-id', 'returns': 'GuidInfo' } +## +# @YankInstances: +# +# @instances: List of yank instances. +# +# Yank instances are named after the following schema: +# "blockdev:", "chardev:" and "migration" +# +# Since: 5.1 +## +{ 'struct': 'YankInstances', 'data': {'instances': ['str'] } } + +## +# @yank: +# +# Recover from hanging qemu by yanking the specified instances. +# +# Takes @YankInstances as argument. +# +# Returns: nothing. +# +# Example: +# +# -> { "execute": "yank", "arguments": { "instances": ["blockdev:nbd0"] } } +# <- { "return": {} } +# +# Since: 5.1 +## +{ 'command': 'yank', 'data': 'YankInstances', 'allow-oob': true } + +## +# @query-yank: +# +# Query yank instances. +# +# Returns: @YankInstances +# +# Example: +# +# -> { "execute": "query-yank" } +# <- { "return": { "instances": ["blockdev:nbd0"] } } +# +# Since: 5.1 +## +{ 'command': 'query-yank', 'returns': 'YankInstances', 'allow-oob': true } diff --git a/util/Makefile.objs b/util/Makefile.objs index cc5e37177a..13faa98425 100644 --- a/util/Makefile.objs +++ b/util/Makefile.objs @@ -45,6 +45,7 @@ util-obj-$(CONFIG_GIO) += dbus.o dbus.o-cflags = $(GIO_CFLAGS) dbus.o-libs = $(GIO_LIBS) util-obj-$(CONFIG_USER_ONLY) += selfmap.o +util-obj-y += yank.o ####################################################################### # code used by both qemu system emulation and qemu-img diff --git a/util/yank.c b/util/yank.c new file mode 100644 index 0000000000..4e66d5a2c2 --- /dev/null +++ b/util/yank.c @@ -0,0 +1,179 @@ +/* + * QEMU yank feature + * + * Copyright (c) Lukas Straub + * + * This work is licensed under the terms of the GNU GPL, version 2 or later. + * 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-misc.h" +#include "io/channel.h" +#include "qemu/yank.h" + +struct YankFuncAndParam { + YankFn *func; + void *opaque; + QLIST_ENTRY(YankFuncAndParam) next; +}; + +struct YankInstance { + char *name; + QLIST_HEAD(, YankFuncAndParam) yankfns; + QLIST_ENTRY(YankInstance) next; +}; + +static QemuMutex lock; +static QLIST_HEAD(yankinst_list, YankInstance) head + = QLIST_HEAD_INITIALIZER(head); + +static struct YankInstance *yank_find_instance(const char *name) +{ + struct YankInstance *tmp, *instance; + instance = NULL; + QLIST_FOREACH(tmp, &head, next) { + if (!strcmp(tmp->name, name)) { + instance = tmp; + } + } + return instance; +} + +void yank_register_instance(const char *instance_name) +{ + struct YankInstance *instance; + + qemu_mutex_lock(&lock); + assert(!yank_find_instance(instance_name)); + + instance = g_slice_new(struct YankInstance); + instance->name = g_strdup(instance_name); + QLIST_INIT(&instance->yankfns); + QLIST_INSERT_HEAD(&head, instance, next); + + qemu_mutex_unlock(&lock); +} + +void yank_unregister_instance(const char *instance_name) +{ + struct YankInstance *instance; + + qemu_mutex_lock(&lock); + instance = yank_find_instance(instance_name); + assert(instance); + + assert(QLIST_EMPTY(&instance->yankfns)); + QLIST_REMOVE(instance, next); + g_free(instance->name); + g_slice_free(struct YankInstance, instance); + + qemu_mutex_unlock(&lock); +} + +void yank_register_function(const char *instance_name, + YankFn *func, + void *opaque) +{ + struct YankInstance *instance; + struct YankFuncAndParam *entry; + + qemu_mutex_lock(&lock); + instance = yank_find_instance(instance_name); + assert(instance); + + entry = g_slice_new(struct YankFuncAndParam); + entry->func = func; + entry->opaque = opaque; + + QLIST_INSERT_HEAD(&instance->yankfns, entry, next); + qemu_mutex_unlock(&lock); +} + +void yank_unregister_function(const char *instance_name, + YankFn *func, + void *opaque) +{ + struct YankInstance *instance; + struct YankFuncAndParam *entry; + + qemu_mutex_lock(&lock); + instance = yank_find_instance(instance_name); + assert(instance); + + QLIST_FOREACH(entry, &instance->yankfns, next) { + if (entry->func == func && entry->opaque == opaque) { + QLIST_REMOVE(entry, next); + g_slice_free(struct YankFuncAndParam, entry); + qemu_mutex_unlock(&lock); + return; + } + } + + abort(); +} + +void yank_generic_iochannel(void *opaque) +{ + QIOChannel *ioc = QIO_CHANNEL(opaque); + + qio_channel_shutdown(ioc, QIO_CHANNEL_SHUTDOWN_BOTH, NULL); +} + +void qmp_yank(strList *instances, + Error **errp) +{ + strList *tmp; + struct YankInstance *instance; + struct YankFuncAndParam *entry; + + qemu_mutex_lock(&lock); + tmp = instances; + for (; tmp; tmp = tmp->next) { + instance = yank_find_instance(tmp->value); + if (!instance) { + error_set(errp, ERROR_CLASS_DEVICE_NOT_FOUND, + "Instance '%s' not found", tmp->value); + qemu_mutex_unlock(&lock); + return; + } + } + tmp = instances; + for (; tmp; tmp = tmp->next) { + instance = yank_find_instance(tmp->value); + assert(instance); + QLIST_FOREACH(entry, &instance->yankfns, next) { + entry->func(entry->opaque); + } + } + qemu_mutex_unlock(&lock); +} + +YankInstances *qmp_query_yank(Error **errp) +{ + struct YankInstance *instance; + YankInstances *ret; + + ret = g_new0(YankInstances, 1); + ret->instances = NULL; + + qemu_mutex_lock(&lock); + QLIST_FOREACH(instance, &head, next) { + strList *entry; + entry = g_new0(strList, 1); + entry->value = g_strdup(instance->name); + entry->next = ret->instances; + ret->instances = entry; + } + qemu_mutex_unlock(&lock); + + return ret; +} + +static void __attribute__((__constructor__)) yank_init(void) +{ + qemu_mutex_init(&lock); +} From patchwork Fri Jul 31 09:26:45 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Lukas Straub X-Patchwork-Id: 277223 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-9.8 required=3.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH, MAILING_LIST_MULTI, SIGNED_OFF_BY, SPF_HELO_NONE, SPF_PASS autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 73CEDC433E0 for ; Fri, 31 Jul 2020 09:33:48 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 1D94E208E4 for ; Fri, 31 Jul 2020 09:33:48 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=web.de header.i=@web.de header.b="crUpuB2t" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 1D94E208E4 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=web.de Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Received: from localhost ([::1]:52540 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1k1RQB-0003hb-7k for qemu-devel@archiver.kernel.org; Fri, 31 Jul 2020 05:33:47 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:41988) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1k1RJW-0007hD-UJ; Fri, 31 Jul 2020 05:26:55 -0400 Received: from mout.web.de ([212.227.17.12]:39677) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1k1RJU-0003Gy-5B; Fri, 31 Jul 2020 05:26:54 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=web.de; s=dbaedf251592; t=1596187607; bh=wrF87AxrlvPP8Zny62NkjRU+1B5hmL1ZilzlmOqAocY=; h=X-UI-Sender-Class:Date:From:To:Cc:Subject:In-Reply-To:References; b=crUpuB2toA7muLJ5c1tkF6CFO6bFpy844Tl5jpyxVmE0QrMm8sgDfi5dOtVPTWDIa CObQ53LXkc6pJ8oP40Lk4LounQPg3rl1Wr7ZNRjIM1q+X4hlG3Gtc+lJ+T/fJPRCRo t/1bHSVtgtc6Om9hSEyHR5Z9I/nXAEzUhO+axrcU= X-UI-Sender-Class: c548c8c5-30a9-4db5-a2e7-cb6cb037b8f9 Received: from luklap ([88.130.61.42]) by smtp.web.de (mrweb106 [213.165.67.124]) with ESMTPSA (Nemesis) id 1MDMzM-1jt9qy3dJ8-00AVSm; Fri, 31 Jul 2020 11:26:46 +0200 Date: Fri, 31 Jul 2020 11:26:45 +0200 From: Lukas Straub To: qemu-devel Subject: [PATCH v6 4/9] migration: Add yank feature Message-ID: <7ed75e5566229179827f025c6393f460e3a726a2.1596184200.git.lukasstraub2@web.de> In-Reply-To: References: MIME-Version: 1.0 X-Provags-ID: V03:K1:nOYWEBwxDAKj7jiSvoauAr1N9o5OkOD1swv3yhL/SIbWOckhnZG W4DXE1D7jKxWeuAOvx+S3c6e60oCcU9cMJ8jFf7yMgrmlpDOeu2Q96QppUKzpT4pm+6X7oJ 2d8LZFIdAPkCSYf3hJM6OeZlyp2Umw21oHb8QcABWzPRVzJcDAf/L/PrRiIXO5qsVE0AEeY aMHDwT0aD5YVwe8vaAEBg== X-UI-Out-Filterresults: notjunk:1; V03:K0:VpzTzLDA9zA=:q/hv1pkateKiDvBafH9OTQ s6MYCSYnxfO7RIIfYdaCKSSLLAleUBnQmI/COWNDpGJBXO7tfl0tfhVMsmaqmAWseFNDSX5T/ 2p74IFIMSQsLoEY5o3KzShNqaz3hg/BTeN3oJgATXNnzHteIPvYcY5FLJ3NSYOgjTeApi8vF+ C9wsAFHw+nPk1pvKYxQGgtC7y8jjOr7j+R99htsp4JawgQU5cgwBH+vnN3rqrSoIVPOkN8EXw 2T63yauQuWksZYkPYNGvZloxvGLGz0hyCwpM2V/43f8JPnZf4f77yDHmS4+5wrfY5ku/RgqLj nJIyqYWG9n7dr93x4icO5g3R01U0+6VT+Ae21/KPURQUfhHJh8ZjKvzqVpdxuej3ofjPeZJrA I/ZxA9fk/IxcIOaJFzKUT78ayBKpnVBPZo00inCKU/ydj8zgDoqzYF2d83OQ4G/znIVVbYDaH I18NvpzVRbzL7yMk+y06SkVD/q3LilmOIemi5W64AY3hQ89PyzOrzSraoupMts5A4yNbDUoGB bzSSdIxXjBooxO4KXFyFUkBbFnRdD3hw9vPUtfzkmhCReQu9lIGBIWy9DOIO3ZZoGDMDwEsvq ECIaB1PYvV8xTnGPFGAyJ6oJdsT8bgjF/UJv5eI0FFCP3J1Pv1q6yVDOSXAfDX8s0SyBXyJxJ yheMWQmMMqte6y71ufrm9PwD3UoeMG5BtHPBOpfpfmoKYA6iCny++5w4wCqMYxuWrmbBsguQ4 NHrOPZ3AZajs7WDOdgs9z3m4nUpUSPk0yCLP/bRJhBG/vxPrfBdFOQl8XOI3F1XkeU2i0DJu6 FeWC1a23eF2Hmbv0DTiIi/cOuorDxd9Ysi3MYPJv27x0E4MExz07OmWBAeTF5B46SsbJ8Rbgc lUtps/ug6pZj8XmTAKit3WdIi4pg0cPXDi3DP+lQXdzjX3OfMqi0EySC2lZa76F5Wvp7MxEIb EyvhGDgYVTFO5OGRM1ZJD5DUdiVTmysVrTufD3kk9z6fUBIWfEw1HkLlrQd4pbXK0XFtDWdv0 iQ1pekyTbfwBFc/PPXH5NhMyDoK84Kacxw9WhwDaBORdpzonl1KR1VL3AibcNXtQRFVP2b+rB Iw8GbQy+qfpPgZjSNYeko7YDbyi9Wn8q2Pfw1EITOHhe/j8r9I2uHnsUO7OTc49AgBgwiSLUx wVIlf52+eSHAFhuFsFS3/nMtveMSFWJmlqF3RfGSeBUkt7TlmelqvTMzVncZJxnH7QuqqsBOb VYw9naukWcOeJlXnotkHER8jKGEF7yPmMAtPVeA== 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/07/31 05:26:36 X-ACL-Warn: Detected OS = Linux 2.2.x-3.x [generic] X-Spam_score_int: -25 X-Spam_score: -2.6 X-Spam_bar: -- X-Spam_report: (-2.6 / 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.01, RCVD_IN_MSPIKE_WL=-0.01, 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 , "Dr. David Alan Gilbert" , Max Reitz , Paolo Bonzini , =?utf-8?q?Marc-Andr=C3=A9?= Lureau Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: "Qemu-devel" Register yank functions on sockets to shut them down. Signed-off-by: Lukas Straub Reviewed-by: Daniel P. Berrangé Acked-by: Stefan Hajnoczi --- migration/channel.c | 12 ++++++++++++ migration/migration.c | 18 +++++++++++++++++- migration/multifd.c | 10 ++++++++++ migration/qemu-file-channel.c | 6 ++++++ migration/savevm.c | 2 ++ tests/Makefile.include | 2 +- 6 files changed, 48 insertions(+), 2 deletions(-) -- 2.20.1 diff --git a/migration/channel.c b/migration/channel.c index 20e4c8e2dc..21fc8046b9 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 channel @@ -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_generic_iochannel, + QIO_CHANNEL(ioc)); + } + if (s->parameters.tls_creds && *s->parameters.tls_creds && !object_dynamic_cast(OBJECT(ioc), @@ -67,6 +74,11 @@ 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_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 8fe36339db..29fefcb7dc 100644 --- a/migration/migration.c +++ b/migration/migration.c @@ -55,6 +55,7 @@ #include "net/announce.h" #include "qemu/queue.h" #include "multifd.h" +#include "qemu/yank.h" #define MAX_THROTTLE (32 << 20) /* Migration transfer speed throttling */ @@ -243,6 +244,8 @@ void migration_incoming_state_destroy(void) qapi_free_SocketAddressList(mis->socket_address_list); mis->socket_address_list = NULL; } + + yank_unregister_instance("migration"); } static void migrate_generate_event(int new_state) @@ -380,7 +383,9 @@ void qemu_start_incoming_migration(const char *uri, Error **errp) const char *p; qapi_event_send_migration(MIGRATION_STATUS_SETUP); + yank_register_instance("migration"); if (!strcmp(uri, "defer")) { + yank_unregister_instance("migration"); deferred_incoming_migration(errp); } else if (strstart(uri, "tcp:", &p)) { tcp_start_incoming_migration(p, errp); @@ -395,6 +400,7 @@ void qemu_start_incoming_migration(const char *uri, Error **errp) } else if (strstart(uri, "fd:", &p)) { fd_start_incoming_migration(p, errp); } else { + yank_unregister_instance("migration"); error_setg(errp, "unknown migration protocol: %s", uri); } } @@ -1662,6 +1668,7 @@ static void migrate_fd_cleanup(MigrationState *s) } notifier_list_notify(&migration_state_notifiers, s); block_cleanup_parameters(s); + yank_unregister_instance("migration"); } static void migrate_fd_cleanup_schedule(MigrationState *s) @@ -1935,6 +1942,7 @@ void qmp_migrate_recover(const char *uri, Error **errp) * only re-setup the migration stream and poke existing migration * to continue using that newly established channel. */ + yank_unregister_instance("migration"); qemu_start_incoming_migration(uri, errp); } @@ -2071,7 +2079,9 @@ void qmp_migrate(const char *uri, bool has_blk, bool blk, /* Error detected, put into errp */ return; } - + if (!(has_resume && resume)) { + yank_register_instance("migration"); + } if (strstart(uri, "tcp:", &p)) { tcp_start_outgoing_migration(s, p, &local_err); #ifdef CONFIG_RDMA @@ -2085,6 +2095,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"); + } error_setg(errp, QERR_INVALID_PARAMETER_VALUE, "uri", "a valid migration protocol"); migrate_set_state(&s->state, MIGRATION_STATUS_SETUP, @@ -2094,6 +2107,9 @@ void qmp_migrate(const char *uri, bool has_blk, bool blk, } if (local_err) { + if (!(has_resume && resume)) { + yank_unregister_instance("migration"); + } migrate_fd_error(s, local_err); error_propagate(errp, local_err); return; diff --git a/migration/multifd.c b/migration/multifd.c index d0441202aa..2c9863e770 100644 --- a/migration/multifd.c +++ b/migration/multifd.c @@ -24,6 +24,9 @@ #include "trace.h" #include "multifd.h" +#include "qemu/yank.h" +#include "io/channel-socket.h" + /* Multiple fd's */ #define MULTIFD_MAGIC 0x11223344U @@ -866,6 +869,13 @@ int multifd_load_cleanup(Error **errp) for (i = 0; i < migrate_multifd_channels(); i++) { MultiFDRecvParams *p = &multifd_recv_state->params[i]; + if (object_dynamic_cast(OBJECT(p->c), TYPE_QIO_CHANNEL_SOCKET) + && OBJECT(p->c)->ref == 1) { + yank_unregister_function("migration", + yank_generic_iochannel, + QIO_CHANNEL(p->c)); + } + object_unref(OBJECT(p->c)); p->c = NULL; qemu_mutex_destroy(&p->mutex); diff --git a/migration/qemu-file-channel.c b/migration/qemu-file-channel.c index d2ce32f4b9..d8f8384fea 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,11 @@ static int channel_close(void *opaque, Error **errp) int ret; QIOChannel *ioc = QIO_CHANNEL(opaque); ret = qio_channel_close(ioc, errp); + if (object_dynamic_cast(OBJECT(ioc), TYPE_QIO_CHANNEL_SOCKET) + && OBJECT(ioc)->ref == 1) { + yank_unregister_function("migration", yank_generic_iochannel, + QIO_CHANNEL(ioc)); + } object_unref(OBJECT(ioc)); return ret; } diff --git a/migration/savevm.c b/migration/savevm.c index a843d202b5..bbbdbd8ea2 100644 --- a/migration/savevm.c +++ b/migration/savevm.c @@ -63,6 +63,7 @@ #include "migration/colo.h" #include "qemu/bitmap.h" #include "net/announce.h" +#include "qemu/yank.h" const unsigned int postcopy_ram_discard_version = 0; @@ -2935,6 +2936,7 @@ int load_snapshot(const char *name, Error **errp) qemu_system_reset(SHUTDOWN_CAUSE_NONE); mis->from_src_file = f; + yank_register_instance("migration"); aio_context_acquire(aio_context); ret = qemu_loadvm_state(f); migration_incoming_state_destroy(); diff --git a/tests/Makefile.include b/tests/Makefile.include index c7e4646ded..e733918269 100644 --- a/tests/Makefile.include +++ b/tests/Makefile.include @@ -452,7 +452,7 @@ tests/test-qdev-global-props$(EXESUF): tests/test-qdev-global-props.o \ $(test-qapi-obj-y) tests/test-vmstate$(EXESUF): tests/test-vmstate.o \ migration/vmstate.o migration/vmstate-types.o migration/qemu-file.o \ - migration/qemu-file-channel.o migration/qjson.o \ + migration/qemu-file-channel.o migration/qjson.o util/yank.o \ $(test-io-obj-y) tests/test-timed-average$(EXESUF): tests/test-timed-average.o $(test-util-obj-y) tests/test-base64$(EXESUF): tests/test-base64.o $(test-util-obj-y) From patchwork Fri Jul 31 09:27:00 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Lukas Straub X-Patchwork-Id: 277221 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-9.8 required=3.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH, MAILING_LIST_MULTI, SIGNED_OFF_BY, SPF_HELO_NONE, SPF_PASS, URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id DCA4CC433DF for ; Fri, 31 Jul 2020 09:45:13 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 79EE220829 for ; Fri, 31 Jul 2020 09:45:13 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=web.de header.i=@web.de header.b="c7Oezxlb" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 79EE220829 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=web.de Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Received: from localhost ([::1]:42826 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1k1RbE-0003iI-9c for qemu-devel@archiver.kernel.org; Fri, 31 Jul 2020 05:45:12 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:42052) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1k1RJk-0007oJ-Jd; Fri, 31 Jul 2020 05:27:08 -0400 Received: from mout.web.de ([212.227.15.3]:36171) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1k1RJi-0003Iv-Um; Fri, 31 Jul 2020 05:27:08 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=web.de; s=dbaedf251592; t=1596187622; bh=EuJZnhDdT/XNOaCKZvdlajlxeYo8brk4aoRtdHhMqZw=; h=X-UI-Sender-Class:Date:From:To:Cc:Subject:In-Reply-To:References; b=c7Oezxlb0shLuK2NvAs1GhGQPamxnyINjMtGmy9O5I8U+z8IdIue9OA2XdoTa03DO TDtsaFXcuq3iq5ruB/jXk7PUFFayjwnaw/TnIyQAU/AYMzmT5IaCw0jzbQ7FPnsNSA 5zdfUmWnmyYMFfMrbnYlW/669UZfKY8Kc/YMUb+o= X-UI-Sender-Class: c548c8c5-30a9-4db5-a2e7-cb6cb037b8f9 Received: from luklap ([88.130.61.42]) by smtp.web.de (mrweb005 [213.165.67.108]) with ESMTPSA (Nemesis) id 1MVaYi-1kBEvK0QjM-00RWVu; Fri, 31 Jul 2020 11:27:02 +0200 Date: Fri, 31 Jul 2020 11:27:00 +0200 From: Lukas Straub To: qemu-devel Subject: [PATCH v6 7/9] MAINTAINERS: Add myself as maintainer for yank feature Message-ID: <14a7a25d32cb021d9b4f03318dd7ef9bb47133f3.1596184200.git.lukasstraub2@web.de> In-Reply-To: References: MIME-Version: 1.0 X-Provags-ID: V03:K1:psJT6U/QISliVQvFy7CpWW6m4Rr19kTOMdoNMIYEexy3xvELOYS +O/FHqzaiFgvHKx+w5IbTAP3EHN9cxOlGuWQtPbUhft/cEbXCXNPEYHDW0fX2/aBCmKsJVm D01SMRfV3ZWtPDG30bPug1asUa10kzYmMOkIID0XcbuOl8nV6znzSYxUGrEMyZ6YWQIEaId jyi8P31Qe4nOwJZAENfCA== X-UI-Out-Filterresults: notjunk:1; V03:K0:RU5pCBk1Sow=:OaAO1nLHWxnFEXnSuuSSbn v/0qNAIpAyhIg+VzS8QK/Ho40IPpg/rRej8MHSUzR6x6S/+v9URMnKBqAGULYaGdNtun9sR15 9L/Nj32wnxzrlkKx0JJOjfHXit64NZinBbnk+hmGbm/cxEhga5NkYLfD3rhwIwMjVpIIkJl8+ I3r0v8ka5znqQKeeGxXhXVBhzeg7rMYbc0jqRuydfYgLKzH/3skgkkF1IHDzLL+Y/bg1AR1SN wfrto5SfrJYkha4q/9F1d+i/gouLmoS5eWoc2UALZeShzbo6rsqymDlcboToHZQ9iH3k7q1ua 4RLWxjWORlb3pgC0abdY0ADFN+objj2ld/F28r0e3maLTTkULs4BNsfAtx/HRRneC4Ix9ZMuB Xaohm7q7MAvH2+NRco+gpaIrj5nnSkbHsv8pw5pqGnUJkziR/YsszWfG1/WIv+7bw6z7pRjJo aklsC24OLthXPsSYZrmpRmYv5ECabkyGLKwlWMGenI4DhI7q2X+TaiY3uj6EvxG8MZdrx8DYw U495zjYcOXqv/RQHY6HPrCeUzUnWZgYhHJ28W+X/GNktMEzcUdNds2NGfqXMCeknruJ31NyXU 0d6yTZIsz2BXVnqcCS7ZJ5yjNA9eGWjbN18vetNp/oNpKhK+J8xqECydDfajhoWpHRETI0yxK tflUj9SL00QCr+deF5dyCO7/K66FEs0NuHqCam8bZ4a0OXGP2t0XhaeyWEevcNLmdBv30/+bw rHlLbm9p4wvSfjOJmL36Bnqj5kbkwfLH9eLi6YPq6mfUhrWUlgQnsZw/u1qdX3ay2Y2kEF7R+ gfBA8nZ6k78WLDJJYHS0dHuc7sBsgu97cUYLkPo+a94g93mVKvamTlPfQlxNgKoZwruGKhUVx fktaqVXtsc0SzFg2WnUDETApzhu2I5GlOpwC5SyPLPl/PJGZXtpwOjZR4JPM6NVNikl+C+AP4 7LEgjqGuRTsXTZytzeXfZcZvunCro+q2fGiHJHGlM2bwuNfWdK1We09MMl26F7YkXE1kQiFoM TFbOFGzROQt1cVksKIio/yQHMbhvzmbor+zPLqOTVo72tLlcjZQOjv2eFCluCfpYcbPUUrimT vNNscuRcX+FvawObtF7FQ1Vrx6MGZO/EQ6gWo8pcpl29JRwcc/PibsWbQdbk16Bdo7YtT6wT4 sFZZtAw3JTrKM80IYuGS55xDnUnBDW54zQKAhLfXImNqoUPHtn6hb8jjIDV9NOcpBsVFL6lYy 3myGjY7J+DNiE/UAZaCwganD7YGi+JvgD03MpWw== 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/07/31 05:10:35 X-ACL-Warn: Detected OS = Linux 3.11 and newer X-Spam_score_int: -25 X-Spam_score: -2.6 X-Spam_bar: -- X-Spam_report: (-2.6 / 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.01, RCVD_IN_MSPIKE_WL=-0.01, 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 , "Dr. David Alan Gilbert" , Max Reitz , Paolo Bonzini , =?utf-8?q?Marc-Andr=C3=A9?= Lureau Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: "Qemu-devel" I'll maintain this for now as the colo usecase is the first user of this functionality. Signed-off-by: Lukas Straub Reviewed-by: Daniel P. Berrangé Acked-by: Stefan Hajnoczi --- MAINTAINERS | 6 ++++++ 1 file changed, 6 insertions(+) -- 2.20.1 diff --git a/MAINTAINERS b/MAINTAINERS index 0886eb3d2b..bf5075a637 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -2614,6 +2614,12 @@ 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 + COLO Framework M: zhanghailiang S: Maintained From patchwork Fri Jul 31 09:27:04 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lukas Straub X-Patchwork-Id: 277222 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-9.8 required=3.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH, MAILING_LIST_MULTI, SIGNED_OFF_BY, SPF_HELO_NONE, SPF_PASS autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 955A6C433E1 for ; Fri, 31 Jul 2020 09:36:05 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 5FB6720829 for ; Fri, 31 Jul 2020 09:36:05 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=web.de header.i=@web.de header.b="bxzYYSdx" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 5FB6720829 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=web.de Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Received: from localhost ([::1]:55806 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1k1RSO-00059D-0c for qemu-devel@archiver.kernel.org; Fri, 31 Jul 2020 05:36:04 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:42070) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1k1RJp-0007sF-9J; Fri, 31 Jul 2020 05:27:13 -0400 Received: from mout.web.de ([217.72.192.78]:44603) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1k1RJn-0003JH-Hp; Fri, 31 Jul 2020 05:27:12 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=web.de; s=dbaedf251592; t=1596187625; bh=NSowfk+zdZfBN/U0N2yBWTJeqtU0sa+7Wn61uH1ecNA=; h=X-UI-Sender-Class:Date:From:To:Cc:Subject:In-Reply-To:References; b=bxzYYSdxqLVscnidGrbqaUlRaya6/sTI0Bs3sDDqzBb/9fYL+YQqrjFatF4nqQXh5 cLONVZP96AI0E0+xn3fLGgijdM1AEOsiTt5HYjZTKTKbQ7+gdA+9LZqZ8GX6OwN2TA B3lx05RyKNtTLUnLpXPfqjRnCXg/+U2l1ahgj9wM= X-UI-Sender-Class: c548c8c5-30a9-4db5-a2e7-cb6cb037b8f9 Received: from luklap ([88.130.61.42]) by smtp.web.de (mrweb106 [213.165.67.124]) with ESMTPSA (Nemesis) id 1M43Kc-1k1RJh30jo-000154; Fri, 31 Jul 2020 11:27:05 +0200 Date: Fri, 31 Jul 2020 11:27:04 +0200 From: Lukas Straub To: qemu-devel Subject: [PATCH v6 8/9] chardev/char.c: Check for duplicate id before creating chardev Message-ID: In-Reply-To: References: MIME-Version: 1.0 X-Provags-ID: V03:K1:f1CtYLThf3u08hoLWCEmQjAxIGLMDlS9MedX3jm4SsU3viGlXOd TrvQX0JeM54bfTubYHR2Jbx8cauWxvFY9GXlFFTDiDzVNvd6CnOo3mbqAHFtUqN+t/yE2q+ nnflLogIF9STqBbDpUKyKwX6HBVVgKnzsoiWD0E2g2WL8hIQ3W84BBROF77Zaq00diE65Lk zYwSDnm2DUNuCICIF4EOA== X-UI-Out-Filterresults: notjunk:1; V03:K0:zU0f4ePo6I0=:UO0wF9GXwgJpvgm/fexQ0s /BKm8PDWG023Nv1vGdbjXZs9KFxR/vZGK9OkxPlXiktOIyF5rbohx4WVwGGtzeda7RQ77aiaL eAu/i+Tx1nrY9tl592uethasixtBc+6qh30KSOsc2jfqY2YgdfsykSz6s671UDPPNP3pi4qxd SJd7Bc8UPTyvVSOR+3EcrO76tTUta0ULTV8Kif4/my7xjX/SL+65rjudQKzBnylw/S90Urbe0 gToGnfOEtv9YOaG0BW+kze7L+HJ7pOr2vZoaMwN0Cs5dlG8zjX3DmmI49yxRqqPLhH9D8TWUc wmWim9k3IwQMFxKd/tmQobphoexV6LINA4YmYCKs6/E+mXmasoZx3Urwmil2Q2D/flh01gGD7 VrwYDamwGXjcWy9cZzQQ+sYRaM/Q/2b5zU+3VO0VUAHgXU8gsvWQsWAemk1iF7IHpRcYZRYA6 5ua0iFzM+ppLZh8Gku+Z4I4PQdaXQXTu47NZKTpOXbdlwxeCHdRbt0KafRZOR5hxpaLobEmTH CuBu3gIJlvQwuA1OQW+gkGz2HS/Ujx0YMhfWQx7rEW8nmakk7tCjyqZakLWbH61QCtFyOPIF2 lkutlPbAUHQsGATL3fGA7speHA8HlrSYjc68G3fdGIf1t2JO51b5B8zT+CxwooiHPKrmBlQvn Xusf4FD0FQbawOQzDnKsn4h2kFXnFuq7W6fP7rQXd9DnPF57BHDfSVEcypR+/G/j1VmmE/s6c dfu0uryOaUXacxlPzdhLSJpzx056Ttk2HcvmdohTM3zv4eunwxU0FLhJL79NFK6Z/v964MLm3 hF6h7Cz8xobWpnOCjXEPuH/lA4XF2bEVAxuxc7YVfZBHSKqkJ28WB4iX/0078o9CPCYvQT+An TrgPShg6neIy9W82R+sm1yAAe+YmyaQ+1xjztNw9ZKF+aNG1D33Wp9AZ763B1yp24OJ8va8GE 8j0yFHkth5pClxfdKaAb87777zcsJ2MmRbXJjmJNYrgBJYkglxWd2MTlLw39FQzeWy4h+0cBv Zaahdn6pj9U4WLaN/nmtiAwuzwKBqK8h7YbH86bBXsXvXjMbSzxddlnIE5xaPRniuy1aYuyG+ QtIQCJ08+2v8bJtk/vhO6Y8du9TCrtDppYtWHjej1lhehbKyXWuYR14l45JtDKbxGF8MwonIw MQ55se8RR2TlDev7dyjP1cZasRlZ2PvpC4XVjpgy6jRZP0TTeUV5k7ZV2vinpHpxL09KlE7Ys rf9qDZkFs00XPIHLgtB1CgWFQA2iHsETGc7aJ1w== 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/07/31 03:52:36 X-ACL-Warn: Detected OS = Linux 2.2.x-3.x [generic] X-Spam_score_int: -34 X-Spam_score: -3.5 X-Spam_bar: --- X-Spam_report: (-3.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=-1, 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 , "Dr. David Alan Gilbert" , Max Reitz , Paolo Bonzini , =?utf-8?q?Marc-Andr=C3=A9?= Lureau Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: "Qemu-devel" yank_register_instance (called when creating the new chardev object) aborts if the instance already exists. So check for duplicate id before creating the new chardev to prevent this. Signed-off-by: Lukas Straub --- chardev/char.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) -- 2.20.1 diff --git a/chardev/char.c b/chardev/char.c index 77e7ec814f..ce041dface 100644 --- a/chardev/char.c +++ b/chardev/char.c @@ -951,6 +951,11 @@ static Chardev *chardev_new(const char *id, const char *typename, assert(g_str_has_prefix(typename, "chardev-")); + if (id && object_resolve_path_component(get_chardevs_root(), id)) { + error_setg(errp, "Chardev '%s' already exists", id); + return NULL; + } + obj = object_new(typename); chr = CHARDEV(obj); chr->label = g_strdup(id); @@ -969,11 +974,7 @@ static Chardev *chardev_new(const char *id, const char *typename, } if (id) { - object_property_try_add_child(get_chardevs_root(), id, obj, - &local_err); - if (local_err) { - goto end; - } + object_property_add_child(get_chardevs_root(), id, obj); object_unref(obj); }