Message ID | 83672ee76f6405c82845a55c148fa836f56fbbc1.1629465282.git.robin.murphy@arm.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | iommu/io-pgtable: Abstract iommu_iotlb_gather access | expand |
On Fri, Aug 20, 2021 at 02:14:42PM +0100, Robin Murphy wrote: > drivers/iommu/io-pgtable-arm-v7s.c | 2 +- > drivers/iommu/io-pgtable-arm.c | 2 +- > include/linux/iommu.h | 10 ++++++++++ > 3 files changed, 12 insertions(+), 2 deletions(-) Applied, thanks Robin.
Hi Robin, On Fri, Aug 20, 2021 at 3:22 PM Robin Murphy <robin.murphy@arm.com> wrote: > Previously io-pgtable merely passed the iommu_iotlb_gather pointer > through to helpers, but now it has grown its own direct dereference. > This turns out to break the build for !IOMMU_API configs where the > structure only has a dummy definition. It will probably also crash > drivers who don't use the gather mechanism and simply pass in NULL. > > Wrap this dereference in a suitable helper which can both be stubbed > out for !IOMMU_API and encapsulate a NULL check otherwise. > > Fixes: 7a7c5badf858 ("iommu: Indicate queued flushes via gather data") Is this the right Fixes tag? The build issue was introduced by: Fixes: a8e5f04458c4e496 ("iommu/io-pgtable: Remove non-strict quirk") > Reported-by: kernel test robot <lkp@intel.com> > Signed-off-by: Robin Murphy <robin.murphy@arm.com> Thanks, this fixes the build issues I was seeing. Tested-by: Geert Uytterhoeven <geert+renesas@glider.be> Gr{oetje,eeting}s, Geert
On 2021-08-24 14:55, Geert Uytterhoeven wrote: > Hi Robin, > > On Fri, Aug 20, 2021 at 3:22 PM Robin Murphy <robin.murphy@arm.com> wrote: >> Previously io-pgtable merely passed the iommu_iotlb_gather pointer >> through to helpers, but now it has grown its own direct dereference. >> This turns out to break the build for !IOMMU_API configs where the >> structure only has a dummy definition. It will probably also crash >> drivers who don't use the gather mechanism and simply pass in NULL. >> >> Wrap this dereference in a suitable helper which can both be stubbed >> out for !IOMMU_API and encapsulate a NULL check otherwise. >> >> Fixes: 7a7c5badf858 ("iommu: Indicate queued flushes via gather data") > > Is this the right Fixes tag? Conceptually, yes - that's where the new member was introduced, so that's where its accessor should have been introduced as well, had I not managed to overlook the structure being conditionally defined and assume it didn't need anything special doing. Of course it's not going to make much difference in practice since they are immediately adjacent commits anyway, but it felt right to point at where I made the fundamental mistake rather than where the symptom appeared :) > The build issue was introduced by: > Fixes: a8e5f04458c4e496 ("iommu/io-pgtable: Remove non-strict quirk") > >> Reported-by: kernel test robot <lkp@intel.com> >> Signed-off-by: Robin Murphy <robin.murphy@arm.com> > > Thanks, this fixes the build issues I was seeing. > > Tested-by: Geert Uytterhoeven <geert+renesas@glider.be> Thanks for confirming! Robin. > > Gr{oetje,eeting}s, > > Geert >
On Tue, Aug 24, 2021 at 04:33:16PM +0100, Robin Murphy wrote: > > Tested-by: Geert Uytterhoeven <geert+renesas@glider.be> > > Thanks for confirming! Sorry for the delay, the new tree containing this fix has been pushed out now.
diff --git a/drivers/iommu/io-pgtable-arm-v7s.c b/drivers/iommu/io-pgtable-arm-v7s.c index e84478d39705..bfb6acb651e5 100644 --- a/drivers/iommu/io-pgtable-arm-v7s.c +++ b/drivers/iommu/io-pgtable-arm-v7s.c @@ -700,7 +700,7 @@ static size_t __arm_v7s_unmap(struct arm_v7s_io_pgtable *data, ARM_V7S_BLOCK_SIZE(lvl + 1)); ptep = iopte_deref(pte[i], lvl, data); __arm_v7s_free_table(ptep, lvl + 1, data); - } else if (!gather->queued) { + } else if (!iommu_iotlb_gather_queued(gather)) { io_pgtable_tlb_add_page(iop, gather, iova, blk_size); } iova += blk_size; diff --git a/drivers/iommu/io-pgtable-arm.c b/drivers/iommu/io-pgtable-arm.c index 9e3beace0470..dd9e47189d0d 100644 --- a/drivers/iommu/io-pgtable-arm.c +++ b/drivers/iommu/io-pgtable-arm.c @@ -650,7 +650,7 @@ static size_t __arm_lpae_unmap(struct arm_lpae_io_pgtable *data, io_pgtable_tlb_flush_walk(iop, iova + i * size, size, ARM_LPAE_GRANULE(data)); __arm_lpae_free_pgtable(data, lvl + 1, iopte_deref(pte, data)); - } else if (!gather->queued) { + } else if (!iommu_iotlb_gather_queued(gather)) { io_pgtable_tlb_add_page(iop, gather, iova + i * size, size); } diff --git a/include/linux/iommu.h b/include/linux/iommu.h index e7581c39f2df..6633040a13f9 100644 --- a/include/linux/iommu.h +++ b/include/linux/iommu.h @@ -594,6 +594,11 @@ static inline void iommu_iotlb_gather_add_page(struct iommu_domain *domain, iommu_iotlb_gather_add_range(gather, iova, size); } +static inline bool iommu_iotlb_gather_queued(struct iommu_iotlb_gather *gather) +{ + return gather && gather->queued; +} + /* PCI device grouping function */ extern struct iommu_group *pci_device_group(struct device *dev); /* Generic device grouping function */ @@ -942,6 +947,11 @@ static inline void iommu_iotlb_gather_add_page(struct iommu_domain *domain, { } +static inline bool iommu_iotlb_gather_queued(struct iommu_iotlb_gather *gather) +{ + return false; +} + static inline void iommu_device_unregister(struct iommu_device *iommu) { }
Previously io-pgtable merely passed the iommu_iotlb_gather pointer through to helpers, but now it has grown its own direct dereference. This turns out to break the build for !IOMMU_API configs where the structure only has a dummy definition. It will probably also crash drivers who don't use the gather mechanism and simply pass in NULL. Wrap this dereference in a suitable helper which can both be stubbed out for !IOMMU_API and encapsulate a NULL check otherwise. Fixes: 7a7c5badf858 ("iommu: Indicate queued flushes via gather data") Reported-by: kernel test robot <lkp@intel.com> Signed-off-by: Robin Murphy <robin.murphy@arm.com> --- drivers/iommu/io-pgtable-arm-v7s.c | 2 +- drivers/iommu/io-pgtable-arm.c | 2 +- include/linux/iommu.h | 10 ++++++++++ 3 files changed, 12 insertions(+), 2 deletions(-)