summaryrefslogtreecommitdiff
path: root/arch/x86/include/asm/pci.h
diff options
context:
space:
mode:
authorRussell King <rmk+kernel@arm.linux.org.uk>2010-09-08 16:27:56 +0100
committerRussell King <rmk+kernel@arm.linux.org.uk>2010-09-08 16:27:56 +0100
commit2be23c475af8ae4e25f8bab08d815b17593bd547 (patch)
tree864cf9dca5faaa51c9346a8835c8f101bd5c8fa2 /arch/x86/include/asm/pci.h
parenta387f0f5409276c5cf75eecb61ef6e6896f851b4 (diff)
ARM: Ensure PTE modifications via dma_alloc_coherent are visible
Dave Hylands reports: | We've observed a problem with dma_alloc_writecombine when the system | is under heavy load (heavy bus traffic). We've managed to reduce the | problem to the following snippet, which is run from a kthread in a | continuous loop: | | void *virtAddr; | dma_addr_t physAddr; | unsigned int numBytes = 256; | | for (;;) { | virtAddr = dma_alloc_writecombine(NULL, | numBytes, &physAddr, GFP_KERNEL); | if (virtAddr == NULL) { | printk(KERN_ERR "Running out of memory\n"); | break; | } | | /* access DMA memory allocated */ | tmp = virtAddr; | *tmp = 0x77; | | /* free DMA memory */ | dma_free_writecombine(NULL, | numBytes, virtAddr, physAddr); | | ...sleep here... | } | | By itself, the code will run forever with no issues. However, as we | increase our bus traffic (typically using DMA) then the *tmp = 0x77 | line will eventually cause a page fault. If we add a small delay (a | few microseconds) before the *tmp = 0x77, then we don't see a page | fault, even under heavy load. A dsb() is required after modifying the PTE entries to ensure that they will always be visible. Add this dsb(). Reported-by: Dave Hylands <dhylands@gmail.com> Tested-by: Dave Hylands <dhylands@gmail.com> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Diffstat (limited to 'arch/x86/include/asm/pci.h')
0 files changed, 0 insertions, 0 deletions