[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
RE: [RFC PATCH 0/5] hw/arm/virt: Add support for user-creatable nested S
From: |
Shameerali Kolothum Thodi |
Subject: |
RE: [RFC PATCH 0/5] hw/arm/virt: Add support for user-creatable nested SMMUv3 |
Date: |
Fri, 31 Jan 2025 09:33:16 +0000 |
> -----Original Message-----
> From: Shameerali Kolothum Thodi
> Sent: Thursday, January 30, 2025 6:09 PM
> To: 'Daniel P. Berrangé' <berrange@redhat.com>
> Cc: qemu-arm@nongnu.org; qemu-devel@nongnu.org;
> eric.auger@redhat.com; peter.maydell@linaro.org; jgg@nvidia.com;
> nicolinc@nvidia.com; ddutile@redhat.com; Linuxarm
> <linuxarm@huawei.com>; Wangzhou (B) <wangzhou1@hisilicon.com>;
> jiangkunkun <jiangkunkun@huawei.com>; Jonathan Cameron
> <jonathan.cameron@huawei.com>; zhangfei.gao@linaro.org
> Subject: RE: [RFC PATCH 0/5] hw/arm/virt: Add support for user-creatable
> nested SMMUv3
>
> Hi Daniel,
>
> > -----Original Message-----
> > From: Daniel P. Berrangé <berrange@redhat.com>
> > Sent: Thursday, January 30, 2025 4:00 PM
> > To: Shameerali Kolothum Thodi
> <shameerali.kolothum.thodi@huawei.com>
> > Cc: qemu-arm@nongnu.org; qemu-devel@nongnu.org;
> > eric.auger@redhat.com; peter.maydell@linaro.org; jgg@nvidia.com;
> > nicolinc@nvidia.com; ddutile@redhat.com; Linuxarm
> > <linuxarm@huawei.com>; Wangzhou (B) <wangzhou1@hisilicon.com>;
> > jiangkunkun <jiangkunkun@huawei.com>; Jonathan Cameron
> > <jonathan.cameron@huawei.com>; zhangfei.gao@linaro.org
> > Subject: Re: [RFC PATCH 0/5] hw/arm/virt: Add support for user-creatable
> > nested SMMUv3
> >
> > On Fri, Nov 08, 2024 at 12:52:37PM +0000, Shameer Kolothum via wrote:
> > > How to use it(Eg:):
> > >
> > > On a HiSilicon platform that has multiple physical SMMUv3s, the ACC
> ZIP
> > VF
> > > devices and HNS VF devices are behind different SMMUv3s. So for a
> > Guest,
> > > specify two smmuv3-nested devices each behind a pxb-pcie as below,
> > >
> > > ./qemu-system-aarch64 -machine virt,gic-version=3,default-bus-bypass-
> > iommu=on \
> > > -enable-kvm -cpu host -m 4G -smp cpus=8,maxcpus=8 \
> > > -object iommufd,id=iommufd0 \
> > > -bios QEMU_EFI.fd \
> > > -kernel Image \
> > > -device virtio-blk-device,drive=fs \
> > > -drive if=none,file=rootfs.qcow2,id=fs \
> > > -device pxb-pcie,id=pcie.1,bus_nr=8,bus=pcie.0 \
> > > -device pcie-root-port,id=pcie.port1,bus=pcie.1,chassis=1 \
> > > -device arm-smmuv3-nested,id=smmuv1,pci-bus=pcie.1 \
> > > -device vfio-pci,host=0000:7d:02.1,bus=pcie.port1,iommufd=iommufd0 \
> > > -device pxb-pcie,id=pcie.2,bus_nr=16,bus=pcie.0 \
> > > -device pcie-root-port,id=pcie.port2,bus=pcie.2,chassis=2 \
> > > -device arm-smmuv3-nested,id=smmuv2,pci-bus=pcie.2 \
> > > -device vfio-pci,host=0000:75:00.1,bus=pcie.port2,iommufd=iommufd0 \
> > > -append "rdinit=init console=ttyAMA0 root=/dev/vda2 rw
> > earlycon=pl011,0x9000000" \
> > > -device virtio-9p-pci,fsdev=p9fs2,mount_tag=p9,bus=pcie.0 \
> > > -fsdev local,id=p9fs2,path=p9root,security_model=mapped \
> > > -net none \
> > > -nographic
> >
> > Above you say the host has 2 SMMUv3 devices, and you've created 2
> > SMMUv3
> > guest devices to match.
> >
> > The various emails in this thread & libvirt thread, indicate that each
> > guest SMMUv3 is associated with a host SMMUv3, but I don't see any
> > property on the command line for 'arm-ssmv3-nested' that tells it which
> > host eSMMUv3 it is to be associated with.
> >
> > How does this association work ?
>
> You are right. The association is not very obvious in Qemu. The association
> and checking is done implicitly by kernel at the moment. I will try to
> explain
> it here.
>
> Each "arm-smmuv3-nested" instance, when the first device gets attached
> to it, will create a S2 HWPT and a corresponding SMMUv3 domain in kernel
> SMMUv3 driver. This domain will have a pointer representing the physical
> SMMUv3 that the device belongs. And any other device which belongs to
> the same physical SMMUv3 can share this S2 domain.
>
> If a device that belongs to a different physical SMMUv3 gets attached to
> the above domain, the HWPT attach will eventually fail as the physical
> smmuv3 in the domains will have a mismatch,
> https://elixir.bootlin.com/linux/v6.13/source/drivers/iommu/arm/arm-
> smmu-v3/arm-smmu-v3.c#L2860
>
> And as I mentioned in cover letter, Qemu will report,
>
> "
> Attempt to add the HNS VF to a different SMMUv3 will result in,
>
> -device vfio-pci,host=0000:7d:02.2,bus=pcie.port3,iommufd=iommufd0:
> Unable to attach viommu
> -device vfio-pci,host=0000:7d:02.2,bus=pcie.port3,iommufd=iommufd0: vfio
> 0000:7d:02.2:
> Failed to set iommu_device: [iommufd=29] error attach 0000:7d:02.2 (38)
> to id=11: Invalid argument
>
> At present Qemu is not doing any extra validation other than the above
> failure to make sure the user configuration is correct or not. The
> assumption is libvirt will take care of this.
> "
> So in summary, if the libvirt gets it wrong, Qemu will fail with error.
>
> If a more explicit association is required, some help from kernel is required
> to identify the physical SMMUv3 associated with the device.
Again thinking about this, to have an explicit association in the Qemu command
line between the vSMMUv3 and the phys smmuv3,
We can possibly add something like,
-device pxb-pcie,id=pcie.1,bus_nr=8,bus=pcie.0 \
-device pcie-root-port,id=pcie.port1,bus=pcie.1,chassis=1 \
-device arm-smmuv3-accel,bus=pcie.1,phys-smmuv3= smmu3.0x0000000100000000 \
-device vfio-pci,host=0000:7d:02.1,bus=pcie.port1,iommufd=iommufd0 \
-device pxb-pcie,id=pcie.2,bus_nr=16,bus=pcie.0 \
-device pcie-root-port,id=pcie.port2,bus=pcie.2,chassis=2 \
-device arm-smmuv3-nested,id=smmuv2,pci-bus=pcie.2, phys-smmuv3=
smmu3.0x0000000200000000 \
-device vfio-pci,host=0000:75:00.1,bus=pcie.port2,iommufd=iommufd0 \
etc.
And Qemu does some checking to make sure that the device is indeed associated
with the specified phys-smmuv3. This can be done going through the sysfs path
checking
which is what I guess libvirt is currently doing to populate the topology. So
basically
Qemu is just replicating that to validate again.
Or another option is extending the IOMMU_GET_HW_INFO IOCTL to return the phys
smmuv3 base address which can avoid going through the sysfs.
The only difference between the current approach(kernel failing the attach
implicitly)
and the above is, Qemu can provide a validation of inputs and may be report a
better
error message than just saying " Unable to attach viommu/: Invalid argument".
If the command line looks Ok, I will go with the sysfs path validation method
first in my
next respin.
Please let me know.
Thanks,
Shameer
- Re: [RFC PATCH 0/5] hw/arm/virt: Add support for user-creatable nested SMMUv3, (continued)
Re: [RFC PATCH 0/5] hw/arm/virt: Add support for user-creatable nested SMMUv3, Eric Auger, 2025/01/31
RE: [RFC PATCH 0/5] hw/arm/virt: Add support for user-creatable nested SMMUv3, Nathan Chen, 2025/01/24
Re: [RFC PATCH 0/5] hw/arm/virt: Add support for user-creatable nested SMMUv3, Daniel P . Berrangé, 2025/01/30
- RE: [RFC PATCH 0/5] hw/arm/virt: Add support for user-creatable nested SMMUv3, Shameerali Kolothum Thodi, 2025/01/30
- RE: [RFC PATCH 0/5] hw/arm/virt: Add support for user-creatable nested SMMUv3,
Shameerali Kolothum Thodi <=
- Re: [RFC PATCH 0/5] hw/arm/virt: Add support for user-creatable nested SMMUv3, Eric Auger, 2025/01/31
- Re: [RFC PATCH 0/5] hw/arm/virt: Add support for user-creatable nested SMMUv3, Jason Gunthorpe, 2025/01/31
- RE: [RFC PATCH 0/5] hw/arm/virt: Add support for user-creatable nested SMMUv3, Shameerali Kolothum Thodi, 2025/01/31
- Re: [RFC PATCH 0/5] hw/arm/virt: Add support for user-creatable nested SMMUv3, Jason Gunthorpe, 2025/01/31
- RE: [RFC PATCH 0/5] hw/arm/virt: Add support for user-creatable nested SMMUv3, Shameerali Kolothum Thodi, 2025/01/31
- Re: [RFC PATCH 0/5] hw/arm/virt: Add support for user-creatable nested SMMUv3, Eric Auger, 2025/01/31
Re: [RFC PATCH 0/5] hw/arm/virt: Add support for user-creatable nested SMMUv3, Daniel P . Berrangé, 2025/01/31
Re: [RFC PATCH 0/5] hw/arm/virt: Add support for user-creatable nested SMMUv3, Daniel P . Berrangé, 2025/01/30