[POWERPC] Fix G5 DART (IOMMU) race causing occasional data corruption
It seems that the occasional data corruption observed with the tg3 driver wasn't due to missing barriers after all, but rather seems to be due to the DART (= IOMMU) in the U4 northbridge reading stale IOMMU table entries from memory due to a race. This fixes it by making the CPU read the entry back from memory before using it. Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org> Signed-off-by: Paul Mackerras <paulus@samba.org>
This commit is contained in:
parent
f007cacffc
commit
eeac5c142b
1 changed files with 6 additions and 1 deletions
|
@ -139,6 +139,7 @@ static inline void dart_tlb_invalidate_one(unsigned long bus_rpn)
|
||||||
|
|
||||||
static void dart_flush(struct iommu_table *tbl)
|
static void dart_flush(struct iommu_table *tbl)
|
||||||
{
|
{
|
||||||
|
mb();
|
||||||
if (dart_dirty) {
|
if (dart_dirty) {
|
||||||
dart_tlb_invalidate_all();
|
dart_tlb_invalidate_all();
|
||||||
dart_dirty = 0;
|
dart_dirty = 0;
|
||||||
|
@ -172,9 +173,13 @@ static void dart_build(struct iommu_table *tbl, long index,
|
||||||
uaddr += DART_PAGE_SIZE;
|
uaddr += DART_PAGE_SIZE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* make sure all updates have reached memory */
|
||||||
|
mb();
|
||||||
|
in_be32((unsigned __iomem *)dp);
|
||||||
|
mb();
|
||||||
|
|
||||||
if (dart_is_u4) {
|
if (dart_is_u4) {
|
||||||
rpn = index;
|
rpn = index;
|
||||||
mb(); /* make sure all updates have reached memory */
|
|
||||||
while (npages--)
|
while (npages--)
|
||||||
dart_tlb_invalidate_one(rpn++);
|
dart_tlb_invalidate_one(rpn++);
|
||||||
} else {
|
} else {
|
||||||
|
|
Loading…
Reference in a new issue