From nobody Wed Oct 29 20:33:40 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1525957775826567.4485092138705; Thu, 10 May 2018 06:09:35 -0700 (PDT) Received: from localhost ([::1]:33869 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fGlKB-0002f8-2j for importer@patchew.org; Thu, 10 May 2018 09:09:35 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:42220) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fGlGK-0007nP-IB for qemu-devel@nongnu.org; Thu, 10 May 2018 09:05:37 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fGlGG-0006MO-Jr for qemu-devel@nongnu.org; Thu, 10 May 2018 09:05:36 -0400 Received: from mx3-rdu2.redhat.com ([66.187.233.73]:58616 helo=mx1.redhat.com) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1fGlGG-0006MK-F7 for qemu-devel@nongnu.org; Thu, 10 May 2018 09:05:32 -0400 Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.rdu2.redhat.com [10.11.54.5]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 0DA5D818A6AB; Thu, 10 May 2018 13:05:32 +0000 (UTC) Received: from dell-r430-03.lab.eng.brq.redhat.com (dell-r430-03.lab.eng.brq.redhat.com [10.37.153.18]) by smtp.corp.redhat.com (Postfix) with ESMTP id 0BBDC63F55; Thu, 10 May 2018 13:05:28 +0000 (UTC) From: Igor Mammedov To: qemu-devel@nongnu.org Date: Thu, 10 May 2018 15:04:38 +0200 Message-Id: <1525957478-250605-1-git-send-email-imammedo@redhat.com> In-Reply-To: <19eb43f8-3bdc-fbfe-47c1-bcc1de7a64ba@redhat.com> References: <19eb43f8-3bdc-fbfe-47c1-bcc1de7a64ba@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.11.54.5 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.8]); Thu, 10 May 2018 13:05:32 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.8]); Thu, 10 May 2018 13:05:32 +0000 (UTC) for IP:'10.11.54.5' DOMAIN:'int-mx05.intmail.prod.int.rdu2.redhat.com' HELO:'smtp.corp.redhat.com' FROM:'imammedo@redhat.com' RCPT:'' X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 66.187.233.73 Subject: [Qemu-devel] [PATCH] qdev: let machine hotplug handler to override bus hotplug handler X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: pagupta@redhat.com, pbonzini@redhat.com, david@gibson.dropbear.id.au, david@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" it will allow to return another hotplug handler than the default one for a specific bus based device type. Which is needed to handle non trivial plug/unplug sequences that need the access to resources configured outside of bus where device is attached. That will allow for returned hotplug handler to orchestrate wiring in arbitrary order, by chaining other hotplug handlers when it's needed. PS: It could be used for hybrid virtio-mem and virtio-pmem devices where it will return machine as hotplug handler which will do necessary wiring at machine level and then pass control down the chain to bus specific hotplug handler. Example of top level hotplug handler override and custom plug sequence: some_machine_get_hotplug_handler(machine){ if (object_dynamic_cast(OBJECT(dev), TYPE_SOME_BUS_DEVICE)) { return HOTPLUG_HANDLER(machine); } return NULL; } some_machine_device_plug(hotplug_dev, dev) { if (object_dynamic_cast(OBJECT(dev), TYPE_SOME_BUS_DEVICE)) { /* do machine specific initialization */ some_machine_init_special_device(dev) /* pass control to bus specific handler */ hotplug_handler_plug(dev->parent_bus->hotplug_handler, dev) } } Signed-off-by: Igor Mammedov --- include/hw/qdev-core.h | 11 +++++++++++ hw/core/qdev.c | 6 ++---- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/include/hw/qdev-core.h b/include/hw/qdev-core.h index 9453588..e6a8eca 100644 --- a/include/hw/qdev-core.h +++ b/include/hw/qdev-core.h @@ -286,6 +286,17 @@ void qdev_init_nofail(DeviceState *dev); void qdev_set_legacy_instance_id(DeviceState *dev, int alias_id, int required_for_version); HotplugHandler *qdev_get_machine_hotplug_handler(DeviceState *dev); +/** + * qdev_get_hotplug_handler: Get handler responsible for device wiring + * + * Find HOTPLUG_HANDLER for @dev that provides [pre|un]plug callbacks for = it. + * + * Note: in case @dev has a parent bus, it will be returned as handler unl= ess + * machine handler overrides it. + * + * Returns: pointer to object that implements TYPE_HOTPLUG_HANDLER interfa= ce + * or NULL if there aren't any. + */ HotplugHandler *qdev_get_hotplug_handler(DeviceState *dev); void qdev_unplug(DeviceState *dev, Error **errp); void qdev_simple_device_unplug_cb(HotplugHandler *hotplug_dev, diff --git a/hw/core/qdev.c b/hw/core/qdev.c index f6f9247..885286f 100644 --- a/hw/core/qdev.c +++ b/hw/core/qdev.c @@ -261,12 +261,10 @@ HotplugHandler *qdev_get_machine_hotplug_handler(Devi= ceState *dev) =20 HotplugHandler *qdev_get_hotplug_handler(DeviceState *dev) { - HotplugHandler *hotplug_ctrl; + HotplugHandler *hotplug_ctrl =3D qdev_get_machine_hotplug_handler(dev); =20 - if (dev->parent_bus && dev->parent_bus->hotplug_handler) { + if (hotplug_ctrl =3D=3D NULL && dev->parent_bus) { hotplug_ctrl =3D dev->parent_bus->hotplug_handler; - } else { - hotplug_ctrl =3D qdev_get_machine_hotplug_handler(dev); } return hotplug_ctrl; } --=20 2.7.4