diff -urN ref/arch/alpha/kernel/pci_iommu.c iommu/arch/alpha/kernel/pci_iommu.c --- ref/arch/alpha/kernel/pci_iommu.c Tue May 22 17:39:07 2001 +++ iommu/arch/alpha/kernel/pci_iommu.c Tue May 22 17:30:55 2001 @@ -238,7 +238,7 @@ { struct pci_controller *hose = pdev ? pdev->sysdata : pci_isa_hose; struct pci_iommu_arena *arena; - long dma_ofs, npages; + long dma_ofs, npages, flags; if (direction == PCI_DMA_NONE) BUG(); @@ -269,6 +269,8 @@ } npages = calc_npages((dma_addr & ~PAGE_MASK) + size); + + spin_lock_irqsave(&arena->lock, flags); iommu_arena_free(arena, dma_ofs, npages); @@ -279,6 +281,7 @@ */ if (dma_ofs >= arena->next_entry) alpha_mv.mv_pci_tbi(hose, dma_addr, dma_addr + size - 1); + spin_unlock_irqrestore(&arena->lock, flags); DBGA("pci_unmap_single: sg [%x,%lx] np %ld from %p\n", dma_addr, size, npages, __builtin_return_address(0)); @@ -566,6 +569,7 @@ struct scatterlist *end; dma_addr_t max_dma; dma_addr_t fbeg, fend; + long flags; if (direction == PCI_DMA_NONE) BUG(); @@ -580,6 +584,7 @@ arena = hose->sg_isa; fbeg = -1, fend = 0; + spin_lock_irqsave(&arena->lock, flags); for (end = sg + nents; sg < end; ++sg) { unsigned long addr, size; long npages, ofs; @@ -619,6 +624,7 @@ */ if ((fend - arena->dma_base) >> PAGE_SHIFT >= arena->next_entry) alpha_mv.mv_pci_tbi(hose, fbeg, fend); + spin_unlock_irqrestore(&arena->lock, flags); DBGA("pci_unmap_sg: %d entries\n", nents - (end - sg)); }