The problem here is that you have two processes --- one is writing, the
other is simultaneously syncing. The syncing process can't distinguish the
pages that were created before fsync() was invoked (it has to wait on
them) and the pages that were created while fsync() was running (it
doesn't have to wait on them) --- so it waits on them all. The result is
livelock, it waits indefinitely, because more and more pages are being
created.
The patch changes it so that if it waits long enough, it stops the other
writers creating dirty pages.
Or, how otherwise would you implement "Submit them all in one go, then
wait"? The current code is:
you grab page 0, see it is under writeback, wait on it
you grab page 1, see it is under writeback, wait on it
you grab page 2, see it is under writeback, wait on it
you grab page 3, see it is under writeback, wait on it
...
--- and the other process is just making more and more writeback pages
while your waiting routine run. So the waiting is indefinite.
Mikulas
--