History

parisc: Fix race in pci-dma.c

We are still troubled by occasional random segmentation faults and memory memory corruption on SMP machines. The causes quite a few package builds to fail on the Debian buildd machines for parisc. When gcc-6 failed to build three times in a row, I looked again at the TLB related code. I found a couple of issues. This is the first. In general, we need to ensure page table updates and corresponding TLB purges are atomic. The attached patch fixes an instance in pci-dma.c where the page table update was not guarded by the TLB lock. Tested on rp3440 and c8000. So far, no further random segmentation faults have been observed.

John David Anglin committed 9 years ago

Commit c0452fb1 parent 43b1f6a1 file · +1 −1Browse files

Unified · Split

arch/parisc/kernel/pci-dma.c+1−1
@@ -95,8 +95,8 @@ static inline int map_pte_uncached(pte_t * pte, · 94 unmodified lines
9595
9696 if (!pte_none(*pte))
9797 printk(KERN_ERR "map_pte_uncached: page already exists\n");
98− set_pte(pte, __mk_pte(*paddr_ptr, PAGE_KERNEL_UNC));
9998 purge_tlb_start(flags);
99+ set_pte(pte, __mk_pte(*paddr_ptr, PAGE_KERNEL_UNC));
100100 pdtlb_kernel(orig_vaddr);
101101 purge_tlb_end(flags);
102102 vaddr += PAGE_SIZE;