From: Peter Xu <peterx@redhat.com> To: qemu-devel@nongnu.org Cc: "Daniel P. Berrangé" <berrange@redhat.com>, "Eduardo Habkost" <ehabkost@redhat.com>, "Michael S. Tsirkin" <mst@redhat.com>, "Jason Wang" <jasowang@redhat.com>, "Alex Williamson" <alex.williamson@redhat.com>, peterx@redhat.com, "Eric Auger" <eric.auger@redhat.com>, "Bandan Das" <bsd@redhat.com>, "Igor Mammedov" <imammedo@redhat.com>, "Paolo Bonzini" <pbonzini@redhat.com>, "Richard Henderson" <rth@twiddle.net> Subject: [Qemu-devel] [PATCH v3 2/4] qdev/machine: Introduce hotplug_allowed hook Date: Mon, 16 Sep 2019 16:07:16 +0800 [thread overview] Message-ID: <20190916080718.3299-3-peterx@redhat.com> (raw) In-Reply-To: <20190916080718.3299-1-peterx@redhat.com> Introduce this new per-machine hook to give any machine class a chance to do a sanity check on the to-be-hotplugged device as a sanity test. This will be used for x86 to try to detect some illegal configuration of devices, e.g., possible conflictions between vfio-pci and x86 vIOMMU. Reviewed-by: Eric Auger <eric.auger@redhat.com> Signed-off-by: Peter Xu <peterx@redhat.com> --- hw/core/qdev.c | 17 +++++++++++++++++ include/hw/boards.h | 9 +++++++++ include/hw/qdev-core.h | 1 + qdev-monitor.c | 7 +++++++ 4 files changed, 34 insertions(+) diff --git a/hw/core/qdev.c b/hw/core/qdev.c index 60d66c2f39..cbad6c1d55 100644 --- a/hw/core/qdev.c +++ b/hw/core/qdev.c @@ -237,6 +237,23 @@ HotplugHandler *qdev_get_machine_hotplug_handler(DeviceState *dev) return NULL; } +bool qdev_hotplug_allowed(DeviceState *dev, Error **errp) +{ + MachineState *machine; + MachineClass *mc; + Object *m_obj = qdev_get_machine(); + + if (object_dynamic_cast(m_obj, TYPE_MACHINE)) { + machine = MACHINE(m_obj); + mc = MACHINE_GET_CLASS(machine); + if (mc->hotplug_allowed) { + return mc->hotplug_allowed(machine, dev, errp); + } + } + + return true; +} + HotplugHandler *qdev_get_bus_hotplug_handler(DeviceState *dev) { if (dev->parent_bus) { diff --git a/include/hw/boards.h b/include/hw/boards.h index 2289536e48..be18a5c032 100644 --- a/include/hw/boards.h +++ b/include/hw/boards.h @@ -166,6 +166,13 @@ typedef struct { * The function pointer to hook different machine specific functions for * parsing "smp-opts" from QemuOpts to MachineState::CpuTopology and more * machine specific topology fields, such as smp_dies for PCMachine. + * @hotplug_allowed: + * If the hook is provided, then it'll be called for each device + * hotplug to check whether the device hotplug is allowed. Return + * true to grant allowance or false to reject the hotplug. When + * false is returned, an error must be set to show the reason of + * the rejection. If the hook is not provided, all hotplug will be + * allowed. */ struct MachineClass { /*< private >*/ @@ -224,6 +231,8 @@ struct MachineClass { HotplugHandler *(*get_hotplug_handler)(MachineState *machine, DeviceState *dev); + bool (*hotplug_allowed)(MachineState *state, DeviceState *dev, + Error **errp); CpuInstanceProperties (*cpu_index_to_instance_props)(MachineState *machine, unsigned cpu_index); const CPUArchIdList *(*possible_cpu_arch_ids)(MachineState *machine); diff --git a/include/hw/qdev-core.h b/include/hw/qdev-core.h index de70b7a19a..aa123f88cb 100644 --- a/include/hw/qdev-core.h +++ b/include/hw/qdev-core.h @@ -280,6 +280,7 @@ void qdev_set_legacy_instance_id(DeviceState *dev, int alias_id, int required_for_version); HotplugHandler *qdev_get_bus_hotplug_handler(DeviceState *dev); HotplugHandler *qdev_get_machine_hotplug_handler(DeviceState *dev); +bool qdev_hotplug_allowed(DeviceState *dev, Error **errp); /** * qdev_get_hotplug_handler: Get handler responsible for device wiring * diff --git a/qdev-monitor.c b/qdev-monitor.c index 8fe5c2cad2..148df9cacf 100644 --- a/qdev-monitor.c +++ b/qdev-monitor.c @@ -615,6 +615,13 @@ DeviceState *qdev_device_add(QemuOpts *opts, Error **errp) /* create device */ dev = DEVICE(object_new(driver)); + /* Check whether the hotplug is allowed by the machine */ + if (qdev_hotplug && !qdev_hotplug_allowed(dev, &err)) { + /* Error must be set in the machine hook */ + assert(err); + goto err_del_dev; + } + if (bus) { qdev_set_parent_bus(dev, bus); } else if (qdev_hotplug && !qdev_get_machine_hotplug_handler(dev)) { -- 2.21.0
WARNING: multiple messages have this Message-ID (diff)
From: "Michael S. Tsirkin" <mst@redhat.com> To: qemu-devel@nongnu.org Cc: "Peter Maydell" <peter.maydell@linaro.org>, "Daniel P. Berrangé" <berrange@redhat.com>, "Eduardo Habkost" <ehabkost@redhat.com>, "Peter Xu" <peterx@redhat.com>, "Eric Auger" <eric.auger@redhat.com>, "Paolo Bonzini" <pbonzini@redhat.com> Subject: [Qemu-devel] [PULL 06/10] qdev/machine: Introduce hotplug_allowed hook Date: Tue, 17 Sep 2019 11:10:59 -0400 [thread overview] Message-ID: <20190916080718.3299-3-peterx@redhat.com> (raw) Message-ID: <20190917151059.xA0vuO95KVt0_F0y1Vx58FKUl6uuMtXW6Ry4sG34Qd0@z> (raw) In-Reply-To: <20190917151011.24588-1-mst@redhat.com> From: Peter Xu <peterx@redhat.com> Introduce this new per-machine hook to give any machine class a chance to do a sanity check on the to-be-hotplugged device as a sanity test. This will be used for x86 to try to detect some illegal configuration of devices, e.g., possible conflictions between vfio-pci and x86 vIOMMU. Reviewed-by: Eric Auger <eric.auger@redhat.com> Signed-off-by: Peter Xu <peterx@redhat.com> Message-Id: <20190916080718.3299-3-peterx@redhat.com> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com> --- hw/core/qdev.c | 17 +++++++++++++++++ include/hw/boards.h | 9 +++++++++ include/hw/qdev-core.h | 1 + qdev-monitor.c | 7 +++++++ 4 files changed, 34 insertions(+) diff --git a/hw/core/qdev.c b/hw/core/qdev.c index 60d66c2f39..cbad6c1d55 100644 --- a/hw/core/qdev.c +++ b/hw/core/qdev.c @@ -237,6 +237,23 @@ HotplugHandler *qdev_get_machine_hotplug_handler(DeviceState *dev) return NULL; } +bool qdev_hotplug_allowed(DeviceState *dev, Error **errp) +{ + MachineState *machine; + MachineClass *mc; + Object *m_obj = qdev_get_machine(); + + if (object_dynamic_cast(m_obj, TYPE_MACHINE)) { + machine = MACHINE(m_obj); + mc = MACHINE_GET_CLASS(machine); + if (mc->hotplug_allowed) { + return mc->hotplug_allowed(machine, dev, errp); + } + } + + return true; +} + HotplugHandler *qdev_get_bus_hotplug_handler(DeviceState *dev) { if (dev->parent_bus) { diff --git a/include/hw/boards.h b/include/hw/boards.h index 2289536e48..be18a5c032 100644 --- a/include/hw/boards.h +++ b/include/hw/boards.h @@ -166,6 +166,13 @@ typedef struct { * The function pointer to hook different machine specific functions for * parsing "smp-opts" from QemuOpts to MachineState::CpuTopology and more * machine specific topology fields, such as smp_dies for PCMachine. + * @hotplug_allowed: + * If the hook is provided, then it'll be called for each device + * hotplug to check whether the device hotplug is allowed. Return + * true to grant allowance or false to reject the hotplug. When + * false is returned, an error must be set to show the reason of + * the rejection. If the hook is not provided, all hotplug will be + * allowed. */ struct MachineClass { /*< private >*/ @@ -224,6 +231,8 @@ struct MachineClass { HotplugHandler *(*get_hotplug_handler)(MachineState *machine, DeviceState *dev); + bool (*hotplug_allowed)(MachineState *state, DeviceState *dev, + Error **errp); CpuInstanceProperties (*cpu_index_to_instance_props)(MachineState *machine, unsigned cpu_index); const CPUArchIdList *(*possible_cpu_arch_ids)(MachineState *machine); diff --git a/include/hw/qdev-core.h b/include/hw/qdev-core.h index de70b7a19a..aa123f88cb 100644 --- a/include/hw/qdev-core.h +++ b/include/hw/qdev-core.h @@ -280,6 +280,7 @@ void qdev_set_legacy_instance_id(DeviceState *dev, int alias_id, int required_for_version); HotplugHandler *qdev_get_bus_hotplug_handler(DeviceState *dev); HotplugHandler *qdev_get_machine_hotplug_handler(DeviceState *dev); +bool qdev_hotplug_allowed(DeviceState *dev, Error **errp); /** * qdev_get_hotplug_handler: Get handler responsible for device wiring * diff --git a/qdev-monitor.c b/qdev-monitor.c index 8fe5c2cad2..148df9cacf 100644 --- a/qdev-monitor.c +++ b/qdev-monitor.c @@ -615,6 +615,13 @@ DeviceState *qdev_device_add(QemuOpts *opts, Error **errp) /* create device */ dev = DEVICE(object_new(driver)); + /* Check whether the hotplug is allowed by the machine */ + if (qdev_hotplug && !qdev_hotplug_allowed(dev, &err)) { + /* Error must be set in the machine hook */ + assert(err); + goto err_del_dev; + } + if (bus) { qdev_set_parent_bus(dev, bus); } else if (qdev_hotplug && !qdev_get_machine_hotplug_handler(dev)) { -- MST
next prev parent reply other threads:[~2019-09-16 8:11 UTC|newest] Thread overview: 35+ messages / expand[flat|nested] mbox.gz Atom feed top 2019-09-16 8:07 [Qemu-devel] [PATCH v3 0/4] intel_iommu: Do sanity check of vfio-pci earlier Peter Xu 2019-09-16 8:07 ` [Qemu-devel] [PATCH v3 1/4] intel_iommu: Sanity check vfio-pci config on machine init done Peter Xu 2019-09-17 15:10 ` [Qemu-devel] [PULL 05/10] " Michael S. Tsirkin 2019-09-16 8:07 ` Peter Xu [this message] 2019-09-17 15:10 ` [Qemu-devel] [PULL 06/10] qdev/machine: Introduce hotplug_allowed hook Michael S. Tsirkin 2019-09-16 8:07 ` [Qemu-devel] [PATCH v3 3/4] pc/q35: Disallow vfio-pci hotplug without VT-d caching mode Peter Xu 2019-09-17 15:11 ` [Qemu-devel] [PULL 07/10] " Michael S. Tsirkin 2019-09-16 8:07 ` [Qemu-devel] [PATCH v3 4/4] intel_iommu: Remove the caching-mode check during flag change Peter Xu 2019-09-17 15:11 ` [Qemu-devel] [PULL 08/10] " Michael S. Tsirkin -- strict thread matches above, loose matches on Subject: below -- 2019-09-17 15:10 [Qemu-devel] [PULL 00/10] virtio, vhost, pc: features, fixes, cleanups Michael S. Tsirkin 2019-08-01 0:40 ` [Qemu-devel] [PATCH v2] docs/nvdimm: add example on persistent backend setup Wei Yang 2019-08-01 8:05 ` Stefan Hajnoczi 2019-09-11 8:51 ` Wei Yang 2019-09-12 12:16 ` Stefan Hajnoczi 2019-09-12 21:44 ` Wei Yang 2019-09-17 15:10 ` [Qemu-devel] [PULL 02/10] " Michael S. Tsirkin 2019-08-21 12:16 ` [Qemu-devel] [PATCH v3] virtio pmem: user document Pankaj Gupta 2019-08-26 12:46 ` Cornelia Huck 2019-09-16 6:30 ` Pankaj Gupta 2019-09-17 15:11 ` [Qemu-devel] [PULL 09/10] " Michael S. Tsirkin 2019-08-22 18:34 ` [Qemu-devel] [PATCH 1/2] vhost-user-blk: prevent using uninitialized vqs Raphael Norwitz 2019-08-22 18:34 ` [Qemu-devel] [PATCH 2/2] backends/vhost-user.c: " Raphael Norwitz 2019-08-28 8:29 ` Stefan Hajnoczi 2019-09-17 15:10 ` [Qemu-devel] [PULL 04/10] " Michael S. Tsirkin 2019-08-23 3:43 ` [Qemu-devel] [Qemu-block] [PATCH 1/2] vhost-user-blk: " yuchenlin via Qemu-devel 2019-08-28 8:28 ` [Qemu-devel] " Stefan Hajnoczi 2019-09-17 15:10 ` [Qemu-devel] [PULL 03/10] " Michael S. Tsirkin 2019-09-10 14:03 ` [Qemu-devel] [PATCH v2] MAINTAINERS: update virtio-rng and virtio-serial maintainer Laurent Vivier 2019-09-17 15:10 ` [Qemu-devel] [PULL 01/10] " Michael S. Tsirkin 2019-09-13 12:06 ` [Qemu-devel] [PATCH v3] virtio-mmio: implement modern (v2) personality (virtio-1) Sergio Lopez 2019-09-16 14:40 ` Cornelia Huck 2019-09-17 15:11 ` [Qemu-devel] [PULL 10/10] " Michael S. Tsirkin 2019-09-21 7:06 ` [Qemu-devel] [PATCH v3] virtio-mmio: implement modern (v2), " Vasyl Vavrychuk 2019-09-23 13:58 ` Sergio Lopez 2019-09-19 10:13 ` [Qemu-devel] [PULL 00/10] virtio, vhost, pc: features, fixes, cleanups Peter Maydell
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20190916080718.3299-3-peterx@redhat.com \ --to=peterx@redhat.com \ --cc=alex.williamson@redhat.com \ --cc=berrange@redhat.com \ --cc=bsd@redhat.com \ --cc=ehabkost@redhat.com \ --cc=eric.auger@redhat.com \ --cc=imammedo@redhat.com \ --cc=jasowang@redhat.com \ --cc=mst@redhat.com \ --cc=pbonzini@redhat.com \ --cc=qemu-devel@nongnu.org \ --cc=rth@twiddle.net \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).