Re: Linux 2.6.29

Jeff Garzik
2009-04-03T23:30:13Z

Janne Grunau wrote:
> On Fri, Apr 03, 2009 at 05:57:05PM -0400, Jeff Garzik wrote:
>> Janne Grunau wrote:
>>> On Fri, Apr 03, 2009 at 03:57:52PM -0400, Jeff Garzik wrote:
>>>> mythtv/libs/libmythtv/ThreadedFileWriter.cpp is a good place to start
>>>> (Sync method... uses fdatasync if available, fsync if not).
>>>>
>>>> mythtv is definitely a candidate for sync_file_range() style output, IMO.
>>> yeah, I'm on it.
>> Just curious, does MythTV need fsync(), or merely to tell the kernel to
>> begin asynchronously writing data to storage?
>
> quoting the TheadedFileWriter comments
>
> /*
> * NOTE: This doesn't even try flush our queue of data.
> * This only ensures that data which has already been sent
> * to the kernel for this file is written to disk. This
> * means that if this backend is writing the data over a
> * network filesystem like NFS, then the data will be visible
> * to the NFS server after this is called. It is also useful
> * in preventing the kernel from buffering up so many writes
> * that they steal the CPU for a long time when the write
> * to disk actually occurs.
> */
>
>> sync_file_range(..., SYNC_FILE_RANGE_WRITE) might be enough, if you do
>> not need to actually wait for completion.
>>
>> This may be the case, if the idea behind MythTV's fsync(2) is simply to
>> prevent the kernel from building up a huge amount of dirty pages in the
>> pagecache [which, in turn, produces bursty write-out behavior].
>
> see above, we care only about the write-out. The f{data}*sync calls are
> already in a seperate thread doing nothing else.

If all you want to do is _start_ the write-out from kernel to disk, and
let the kernel handle it asynchronously, SYNC_FILE_RANGE_WRITE will do
that for you, eliminating the need for a separate thread.

If you need to wait for the data to hit disk, you will need the other
SYNC_FILE_RANGE_xxx bits.

On a related subject, reads: consider
posix_fadvise(POSIX_FADV_SEQUENTIAL) and/or readahead(2) for optimizing
the reading side of things.

Jeff

Jeff