On Tue, 28 Aug 2007 18:04:28 -0700, David Daney <email@example.com> 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