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 :|


Reply via email to