List,
I am running 2.6.18 (highmem) kernel in RM9000 based SOC with 2 Gig RAM.
I have observed file corruption and system hangs (Easily reproducible on
remounting file system) when doing file copy to SATA disk / USB disk (
SATA/ USB controller over PCI) . How ever when I limit memory with
option mem=512M from command line everything seems to be working fine.
Issue is reproducible with 2.6.18-stable lmo git sources .
I have modified dma-noncoherent.c as follows and I am no more
experiencing system hang. But file's are getting corrupted (observed bus
error / segmentation fault / illegal instruction error few times)
occasionally. One more observation I have made is file corruption is
more if I use root file system from onboard USB flash, than running a
NFS root mount.
--- arch/mips/mm/dma-noncoherent.c.orig 2010-08-02 23:53:17.000000000
+0530
+++ arch/mips/mm/dma-noncoherent.c 2010-08-02 23:56:19.000000000
+0530
@@ -132,12 +132,13 @@
for (i = 0; i < nents; i++, sg++) {
unsigned long addr;
- addr = (unsigned long) page_address(sg->page);
- if (addr) {
- __dma_sync(addr + sg->offset, sg->length,
direction);
- sg->dma_address =
(dma_addr_t)page_to_phys(sg->page)
- + sg->offset;
- }
+ addr = (unsigned long) page_address(sg->page) +
sg->offset;
+ if (addr)
+ __dma_sync(addr, sg->length, direction);
+
+ sg->dma_address = (dma_addr_t)page_to_phys(sg->page)
+ + sg->offset;
+
}
return nents;
@@ -187,9 +188,9 @@
return;
for (i = 0; i < nhwentries; i++, sg++) {
- addr = (unsigned long) page_address(sg->page);
+ addr = (unsigned long) page_address(sg->page) +
sg->offset;
if (addr)
- __dma_sync(addr + sg->offset, sg->length,
direction);
+ __dma_sync(addr , sg->length, direction);
}
}
It will be great if any body can give me some pointers / help to fix the
issue.
Thanks
Anoop
|