On Thu, Oct 24, 2024 at 12:56:25PM -0400, Peter Xu wrote: > X86 IOMMUs cannot be created more than one on a system yet. Make it a > singleton so it guards the system from accidentally create yet another > IOMMU object when one already presents. > > Now if someone tries to create more than one, e.g., via: > > ./qemu -M q35 -device intel-iommu -device intel-iommu > > The error will change from: > > qemu-system-x86_64: -device intel-iommu: QEMU does not support multiple > vIOMMUs for x86 yet. > > To: > > qemu-system-x86_64: -device intel-iommu: Class 'intel-iommu' only supports > one instance > > Unfortunately, yet we can't remove the singleton check in the machine > hook (pc_machine_device_pre_plug_cb), because there can also be > virtio-iommu involved, which doesn't share a common parent class yet.
Presumably the 'class' reported is the one that the user requested, but this would imply if we were to do qemu-system-x86_64 -device intel-iommu -device virtio-iommu Then QEMU would report "Class 'virtio-iommu' only supports one instance" at which point the user is wondering, huh, I only requested one virtio-iommu instance ? IOW, the current error message would be better as it is not referring to a specific subclass, but rather to the more general fact that only a single IOMMU is permitted, no matter what it's impl is. > > But with this, it should be closer to reach that goal to check singleton by > QOM one day. > > Signed-off-by: Peter Xu <pet...@redhat.com> > --- > hw/i386/x86-iommu.c | 14 ++++++++++++++ > 1 file changed, 14 insertions(+) > > diff --git a/hw/i386/x86-iommu.c b/hw/i386/x86-iommu.c > index 60af896225..4bfeb08705 100644 > --- a/hw/i386/x86-iommu.c > +++ b/hw/i386/x86-iommu.c > @@ -26,6 +26,7 @@ > #include "qemu/error-report.h" > #include "trace.h" > #include "sysemu/kvm.h" > +#include "qom/object_interfaces.h" > > void x86_iommu_iec_register_notifier(X86IOMMUState *iommu, > iec_notify_fn fn, void *data) > @@ -133,10 +134,19 @@ static Property x86_iommu_properties[] = { > DEFINE_PROP_END_OF_LIST(), > }; > > +static Object *x86_iommu_get_instance(Error **errp) > +{ > + return OBJECT(x86_iommu_get_default()); > +} > + > static void x86_iommu_class_init(ObjectClass *klass, void *data) > { > DeviceClass *dc = DEVICE_CLASS(klass); > + SingletonClass *singleton = SINGLETON_CLASS(klass); > + > dc->realize = x86_iommu_realize; > + singleton->get_instance = x86_iommu_get_instance; > + > device_class_set_props(dc, x86_iommu_properties); > } > > @@ -152,6 +162,10 @@ static const TypeInfo x86_iommu_info = { > .class_init = x86_iommu_class_init, > .class_size = sizeof(X86IOMMUClass), > .abstract = true, > + .interfaces = (InterfaceInfo[]) { > + { TYPE_SINGLETON }, > + { } > + } > }; > > static void x86_iommu_register_types(void) > -- > 2.45.0 > With regards, Daniel -- |: https://berrange.com -o- https://www.flickr.com/photos/dberrange :| |: https://libvirt.org -o- https://fstop138.berrange.com :| |: https://entangle-photo.org -o- https://www.instagram.com/dberrange :|