[PATCH] parisc: Fix race in pci-dma.c

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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 again.  I found a
couple of issues.  This is the first.

In general, we need to ensure page table updates and corresponding TBL 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.

Signed-off-by: John David Anglin  <dave.anglin@xxxxxxxx>

diff --git a/arch/parisc/kernel/pci-dma.c b/arch/parisc/kernel/pci-dma.c
index 02d9ed0..494ff6e 100644
--- a/arch/parisc/kernel/pci-dma.c
+++ b/arch/parisc/kernel/pci-dma.c
@@ -95,8 +95,8 @@ static inline int map_pte_uncached(pte_t * pte,
 
 		if (!pte_none(*pte))
 			printk(KERN_ERR "map_pte_uncached: page already exists\n");
-		set_pte(pte, __mk_pte(*paddr_ptr, PAGE_KERNEL_UNC));
 		purge_tlb_start(flags);
+		set_pte(pte, __mk_pte(*paddr_ptr, PAGE_KERNEL_UNC));
 		pdtlb_kernel(orig_vaddr);
 		purge_tlb_end(flags);
 		vaddr += PAGE_SIZE;

--
John David Anglin	dave.anglin@xxxxxxxx

[Index of Archives]     [Linux SoC]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux