Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756064AbYJEXSt (ORCPT ); Sun, 5 Oct 2008 19:18:49 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1755558AbYJEXSi (ORCPT ); Sun, 5 Oct 2008 19:18:38 -0400 Received: from mx1.redhat.com ([66.187.233.31]:55494 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755552AbYJEXSh (ORCPT ); Sun, 5 Oct 2008 19:18:37 -0400 Date: Sun, 5 Oct 2008 19:18:22 -0400 (EDT) From: Mikulas Patocka X-X-Sender: mpatocka@hs20-bc2-1.build.redhat.com To: Arjan van de Ven cc: Andrew Morton , linux-kernel@vger.kernel.org, agk@redhat.com, mbroz@redhat.com, chris@arachsys.com Subject: Re: [PATCH 2/3] Fix fsync livelock In-Reply-To: <20081005160724.54dd1a27@infradead.org> Message-ID: References: <20080911101616.GA24064@agk.fab.redhat.com> <20080923154905.50d4b0fa.akpm@linux-foundation.org> <20080923164623.ce82c1c2.akpm@linux-foundation.org> <20081001225404.4e973465.akpm@linux-foundation.org> <20081005153306.7e644c9f@infradead.org> <20081005160724.54dd1a27@infradead.org> MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2115 Lines: 49 On Sun, 5 Oct 2008, Arjan van de Ven wrote: > On Sun, 5 Oct 2008 19:02:57 -0400 (EDT) > Mikulas Patocka wrote: > > > > are you sure? > > > isn't the right fix to just walk the file pages only once? > > > > It walks the pages only once --- and waits on each on them. But > > because new pages are contantly appearing under it, that "walk only > > once" becomes infinite loop (well, finite, until the whole disk is > > written). > > well. fsync() promises that everything that's dirty at the time of the > call will hit the disk. That is not something you can compromise. > The only way out would be is to not allow new dirty during an fsync()... > which is imo even worse. > > Submit them all in one go, then wait, should not be TOO bad. Unless a > lot was dirty already, but then you go back to "but it has to go to > disk". 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 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/