On Tue, 28 Aug 2007 18:04:28 -0700, David Daney <ddaney@xxxxxxxxxx> wrote: > When we write files that were opened with O_DIRECT set, we observe that > there are many 16 byte chunks of data in the files that contain all > zeros instead of the correct data. > > My understanding is that the cache is virtually indexed. So I think > what is happening is that when data is written to memory by a user > application that does an O_DIRECT write, the IDE driver is given a list > of pages to transfer to the disk. The driver then does a > dma_cache_wback() on the KSEG0 address of the pages before initiating > the DMA operation. Since the KSEG0 address and the USEG address of the > physical memory are different, the data is never flushed to memory > resulting in incorrect data being written to disk. I think get_user_pages() should flush user data for O_DIRECT. The get_user_pages() uses flush_anon_page() to do it, and MIPS flush_anon_page() was added on Mar 2007. Does your kernel have this fix? --- Atsushi Nemoto