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
95 95
96 if (!pte_none(*pte))96 if (!pte_none(*pte))
97 printk(KERN_ERR "map_pte_uncached: page already exists\n");97 printk(KERN_ERR "map_pte_uncached: page already exists\n");
98 set_pte(pte, __mk_pte(*paddr_ptr, PAGE_KERNEL_UNC));
99 purge_tlb_start(flags);98 purge_tlb_start(flags);
99 set_pte(pte, __mk_pte(*paddr_ptr, PAGE_KERNEL_UNC));
100 pdtlb_kernel(orig_vaddr);100 pdtlb_kernel(orig_vaddr);
101 purge_tlb_end(flags);101 purge_tlb_end(flags);
102 vaddr += PAGE_SIZE;102 vaddr += PAGE_SIZE;