There are several error paths where we should enable IRQs but we don't. Fixes: bb620c3d3925 ("sparc: Make sparc64 use scalable lib/iommu-common.c functions") Signed-off-by: Dan Carpenter <dan.carpenter@xxxxxxxxxx> --- Not tested. diff --git a/arch/sparc/kernel/pci_sun4v.c b/arch/sparc/kernel/pci_sun4v.c index 06981cc7..274df7a 100644 --- a/arch/sparc/kernel/pci_sun4v.c +++ b/arch/sparc/kernel/pci_sun4v.c @@ -230,12 +230,16 @@ static void *dma_4v_alloc_coherent(struct device *dev, size_t size, for (n = 0; n < npages; n++) { long err = iommu_batch_add(first_page + (n * PAGE_SIZE), mask); - if (unlikely(err < 0L)) + if (unlikely(err < 0L)) { + local_irq_restore(flags); goto iommu_map_fail; + } } - if (unlikely(iommu_batch_end(mask) < 0L)) + if (unlikely(iommu_batch_end(mask) < 0L)) { + local_irq_restore(flags); goto iommu_map_fail; + } local_irq_restore(flags); @@ -398,11 +402,15 @@ static dma_addr_t dma_4v_map_page(struct device *dev, struct page *page, for (i = 0; i < npages; i++, base_paddr += IO_PAGE_SIZE) { long err = iommu_batch_add(base_paddr, mask); - if (unlikely(err < 0L)) + if (unlikely(err < 0L)) { + local_irq_restore(flags); goto iommu_map_fail; + } } - if (unlikely(iommu_batch_end(mask) < 0L)) + if (unlikely(iommu_batch_end(mask) < 0L)) { + local_irq_restore(flags); goto iommu_map_fail; + } local_irq_restore(flags); -- To unsubscribe from this list: send the line "unsubscribe kernel-janitors" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html