Hi Jean-Philippe,

On Fri, Mar 06, 2020 at 11:09:55AM +0100, Jean-Philippe Brucker wrote:
> I think that's because patch 01/14 move the fwspec access too early. In 
> 
>                 err = pci_for_each_dma_alias(to_pci_dev(dev),
>                                              iort_pci_iommu_init, &info);
> 
>                 if (!err && iort_pci_rc_supports_ats(node))
>                         dev->iommu_fwspec->flags |= IOMMU_FWSPEC_PCI_RC_ATS;
> 
> the iommu_fwspec is only valid if iort_pci_iommu_init() initialized it
> successfully, if err == 0. The following might fix it:
> 
> diff --git a/drivers/acpi/arm64/iort.c b/drivers/acpi/arm64/iort.c
> index 0e981d7f3c7d..7d04424189df 100644
> --- a/drivers/acpi/arm64/iort.c
> +++ b/drivers/acpi/arm64/iort.c
> @@ -1015,7 +1015,7 @@ const struct iommu_ops *iort_iommu_configure(struct 
> device *dev)
>               return ops;
> 
>       if (dev_is_pci(dev)) {
> -             struct iommu_fwspec *fwspec = dev_iommu_fwspec_get(dev);
> +             struct iommu_fwspec *fwspec;
>               struct pci_bus *bus = to_pci_dev(dev)->bus;
>               struct iort_pci_alias_info info = { .dev = dev };
> 
> @@ -1028,7 +1028,8 @@ const struct iommu_ops *iort_iommu_configure(struct 
> device *dev)
>               err = pci_for_each_dma_alias(to_pci_dev(dev),
>                                            iort_pci_iommu_init, &info);
> 
> -             if (!err && iort_pci_rc_supports_ats(node))
> +             fwspec = dev_iommu_fwspec_get(dev);
> +             if (fwspec && iort_pci_rc_supports_ats(node))
>                       fwspec->flags |= IOMMU_FWSPEC_PCI_RC_ATS;
>       } else {
>               int i = 0;

Thanks a lot for the fix! I added it to patch 1/14.

Regards,

        Joerg
_______________________________________________
Virtualization mailing list
[email protected]
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

Reply via email to