From: Peter Zijlstra <a.p.zijlstra@chello.nl> To: Hugh Dickins <hugh@veritas.com> Cc: Arjan van de Ven <arjan@infradead.org>, Linus Torvalds <torvalds@osdl.org>, Andrei Popa <andrei.popa@i-neo.ro>, Andrew Morton <akpm@osdl.org>, Linux Kernel Mailing List <linux-kernel@vger.kernel.org>, Florian Weimer <fw@deneb.enyo.de>, Marc Haber <mh+linux-kernel@zugschlus.de>, Martin Michlmayr <tbm@cyrius.com>, Martin Schwidefsky <schwidefsky@de.ibm.com>, Heiko Carstens <heiko.carstens@de.ibm.com>, Arnd Bergmann <arnd.bergmann@de.ibm.com> Subject: Re: [PATCH] mm: fix page_mkclean_one (was: 2.6.19 file content corruption on ext3) Date: Wed, 20 Dec 2006 14:56:18 +0100 [thread overview] Message-ID: <1166622979.10372.224.camel@twins> (raw) In-Reply-To: <Pine.LNX.4.64.0612201237280.28787@blonde.wat.veritas.com> On Wed, 2006-12-20 at 13:00 +0000, Hugh Dickins wrote: > On Wed, 20 Dec 2006, Peter Zijlstra wrote: > > > > fix page_mkclean_one() > > Congratulations on getting to the bottom of it, Peter (if you have: > I haven't digested enough of the thread to tell). Well, I thought I understood, you just shattered that. > I'm mostly offline at > present, no time for dialogue, I'll throw out a few remarks and run... I wondered where you were ;-) Enjoy your time away from the computer. > > > > it had several issues: > > - it failed to flush the cache > > It's unclear to me why it should need to flush the cache, but I don't > know much about that, and mprotect does flush the cache in advance - > I think others will tell you that if it does need to be flushed, I was still thinking about why exactly, but indeed since mprotect does I thought it prudent to also do it. > it must > be flushed while there's still a valid pte (on some arches at least). Ah, good point, makes sense I guess. > > - it failed to flush the tlb > > Eh? It flushed the TLB inside ptep_establish, didn't it? > I guess you mean you've found a race before it flushed the TLB. Hmm, quite right indeed. I missed that. So moving the flush inside the pte cleared section closed a race. It seems I must have a long hard look at these architecture manuals... > > - it failed to do s390 (s390 guys, please verify this is now correct) > > Hmm, I thought we cleared it with them back at the time. /me queries mail folder... can't seem to find it. > > > > Also, clear in a loop to ensure SMP safeness as suggested by Arjan. > > Yikes. Well, please compare with mprotect's change_pte_range. I think > I took that as the relevant standard when checking your implementation, > and back then satisfied myself that what you were doing was equivalent. > If page_mkclean_one is now agreed to be significantly defective, then > I suspect change_pte_range is also; perhaps others too. Arjan argued that mprotect and msync would mostly race with themselves in userspace. > (But I haven't found time to do more than skim through the thread, > I've not thought through the issues at all: I am surprised that it's > now found defective, we looked at it long and hard back then.) --- page_mkclean_one() fix it had several issues: - it failed to flush the cache - a race wrt tlb flushing - it failed to do s390 (s390 guys, please verify this is now correct) Also, clear in a loop to ensure SMP safeness as suggested by Arjan. Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl> --- mm/rmap.c | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) Index: linux-2.6/mm/rmap.c =================================================================== --- linux-2.6.orig/mm/rmap.c +++ linux-2.6/mm/rmap.c @@ -432,7 +432,7 @@ static int page_mkclean_one(struct page { struct mm_struct *mm = vma->vm_mm; unsigned long address; - pte_t *pte, entry; + pte_t *pte; spinlock_t *ptl; int ret = 0; @@ -444,17 +444,20 @@ static int page_mkclean_one(struct page if (!pte) goto out; - if (!pte_dirty(*pte) && !pte_write(*pte)) - goto unlock; + while (pte_dirty(*pte) || pte_write(*pte)) { + pte_t entry; - entry = ptep_get_and_clear(mm, address, pte); - entry = pte_mkclean(entry); - entry = pte_wrprotect(entry); - ptep_establish(vma, address, pte, entry); - lazy_mmu_prot_update(entry); - ret = 1; + flush_cache_page(vma, address, pte_pfn(*pte)); + entry = ptep_get_and_clear(mm, address, pte); + flush_tlb_page(vma, address); + (void)page_test_and_clear_dirty(page); /* do the s390 thing */ + entry = pte_wrprotect(entry); + entry = pte_mkclean(entry); + set_pte_at(vma, address, pte, entry); + lazy_mmu_prot_update(entry); + ret = 1; + } -unlock: pte_unmap_unlock(pte, ptl); out: return ret;
next prev parent reply other threads:[~2006-12-20 13:57 UTC|newest]
Thread overview: 311+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-12-17 0:13 2.6.19 file content corruption on ext3 Andrei Popa
2006-12-17 12:06 ` Andrew Morton
2006-12-17 12:19 ` Marc Haber
2006-12-17 12:32 ` Andrei Popa
2006-12-17 13:39 ` Andrei Popa
2006-12-17 23:40 ` Andrew Morton
2006-12-18 1:02 ` Linus Torvalds
2006-12-18 1:22 ` Linus Torvalds
2006-12-18 1:29 ` Linus Torvalds
2006-12-18 1:57 ` Linus Torvalds
2006-12-18 4:51 ` Nick Piggin
2006-12-18 5:43 ` Andrew Morton
2006-12-18 7:22 ` Nick Piggin
2006-12-18 9:18 ` Andrew Morton
2006-12-18 9:26 ` Andrei Popa
2006-12-18 9:42 ` Nick Piggin
2006-12-19 8:51 ` Marc Haber
2006-12-19 9:28 ` Martin Michlmayr
2006-12-28 18:05 ` Marc Haber
2006-12-28 19:00 ` Linus Torvalds
2006-12-28 19:05 ` Petri Kaukasoina
2006-12-28 19:21 ` Linus Torvalds
2006-12-28 19:39 ` Dave Jones
2006-12-28 20:10 ` Arjan van de Ven
2006-12-29 9:23 ` maximilian attems
2006-12-29 15:02 ` Dave Jones
2006-12-29 18:52 ` maximilian attems
2006-12-29 19:14 ` Dave Jones
2006-12-28 21:24 ` Linus Torvalds
2006-12-28 21:36 ` Russell King
2006-12-28 22:37 ` Linus Torvalds
2006-12-28 22:50 ` David Miller
2006-12-28 23:01 ` Linus Torvalds
2006-12-29 1:38 ` Linus Torvalds
2006-12-29 1:59 ` Andrew Morton
2006-12-28 23:36 ` Anton Altaparmakov
2006-12-28 23:54 ` Linus Torvalds
2006-12-29 17:49 ` Guillaume Chazarain
2006-12-18 5:50 ` Linus Torvalds
2006-12-18 7:16 ` Andrew Morton
2006-12-18 7:17 ` Andrew Morton
2006-12-18 9:30 ` Nick Piggin
2006-12-18 7:30 ` Nick Piggin
2006-12-18 9:19 ` Andrei Popa
2006-12-18 9:38 ` Andrew Morton
2006-12-18 10:00 ` Andrei Popa
2006-12-18 10:11 ` Peter Zijlstra
2006-12-18 10:49 ` Andrei Popa
2006-12-18 15:24 ` Gene Heskett
2006-12-18 15:32 ` Peter Zijlstra
2006-12-18 15:47 ` Gene Heskett
2006-12-18 16:55 ` Peter Zijlstra
2006-12-18 18:03 ` Linus Torvalds
2006-12-18 18:24 ` Peter Zijlstra
2006-12-18 18:35 ` Linus Torvalds
2006-12-18 19:04 ` Andrei Popa
2006-12-18 19:10 ` Peter Zijlstra
2006-12-18 19:18 ` Linus Torvalds
2006-12-18 19:44 ` Andrei Popa
2006-12-18 20:14 ` Linus Torvalds
2006-12-18 20:41 ` Linus Torvalds
2006-12-18 21:11 ` Andrei Popa
2006-12-18 22:00 ` Alessandro Suardi
2006-12-18 22:45 ` Linus Torvalds
2006-12-19 0:13 ` Andrei Popa
2006-12-19 0:29 ` Linus Torvalds
2006-12-18 22:32 ` Linus Torvalds
2006-12-18 23:48 ` Andrei Popa
2006-12-19 0:04 ` Linus Torvalds
2006-12-19 0:29 ` Andrei Popa
2006-12-19 0:57 ` Linus Torvalds
2006-12-19 1:21 ` Andrew Morton
2006-12-19 1:44 ` Andrei Popa
2006-12-19 1:54 ` Andrew Morton
2006-12-19 2:04 ` Andrei Popa
2006-12-19 8:05 ` Andrei Popa
2006-12-19 8:24 ` Andrew Morton
2006-12-19 8:34 ` Pekka Enberg
2006-12-19 9:13 ` Marc Haber
2006-12-19 1:50 ` Andrei Popa
2006-12-19 1:03 ` Gene Heskett
2006-12-18 22:34 ` Gene Heskett
2006-12-22 17:27 ` Linus Torvalds
2006-12-18 21:43 ` Andrew Morton
2006-12-18 21:49 ` Peter Zijlstra
2006-12-19 23:42 ` Peter Zijlstra
2006-12-20 0:23 ` Linus Torvalds
2006-12-20 9:01 ` Peter Zijlstra
2006-12-20 9:12 ` Peter Zijlstra
2006-12-20 9:39 ` Arjan van de Ven
2006-12-20 11:26 ` [PATCH] mm: fix page_mkclean_one (was: 2.6.19 file content corruption on ext3) Peter Zijlstra
2006-12-20 11:39 ` Jesper Juhl
2006-12-20 11:42 ` Peter Zijlstra
2006-12-20 12:12 ` Jesper Juhl
2006-12-20 13:00 ` Hugh Dickins
2006-12-20 13:56 ` Peter Zijlstra [this message]
2006-12-20 17:03 ` Martin Michlmayr
2006-12-20 17:35 ` Linus Torvalds
2006-12-20 17:53 ` Martin Michlmayr
2006-12-20 19:01 ` Linus Torvalds
2006-12-20 19:50 ` Linus Torvalds
2006-12-20 20:22 ` Peter Zijlstra
2006-12-20 21:55 ` Dave Kleikamp
2006-12-20 22:25 ` Linus Torvalds
2006-12-20 22:59 ` Dave Kleikamp
2006-12-20 22:15 ` Peter Zijlstra
2006-12-20 22:20 ` Peter Zijlstra
2006-12-20 22:49 ` Linus Torvalds
2006-12-20 23:03 ` Peter Zijlstra
2006-12-21 9:16 ` Martin Schwidefsky
2006-12-21 9:20 ` Peter Zijlstra
2006-12-21 9:26 ` Martin Schwidefsky
2006-12-21 20:01 ` Linus Torvalds
2006-12-28 0:00 ` Martin Schwidefsky
2006-12-28 0:42 ` Linus Torvalds
2006-12-28 0:52 ` [PATCH] mm: fix page_mkclean_one David Miller
2006-12-21 2:36 ` [PATCH] mm: fix page_mkclean_one (was: 2.6.19 file content corruption on ext3) Trond Myklebust
2006-12-21 8:10 ` Peter Zijlstra
2006-12-20 23:24 ` David Chinner
2006-12-20 23:55 ` Linus Torvalds
2006-12-21 1:20 ` David Chinner
2006-12-20 23:32 ` Andrew Morton
2006-12-20 23:55 ` Linus Torvalds
2006-12-21 0:11 ` Andrew Morton
2006-12-21 0:22 ` Linus Torvalds
2006-12-21 0:24 ` Linus Torvalds
2006-12-21 15:48 ` Andrei Popa
2006-12-21 16:58 ` Linus Torvalds
2006-12-21 0:43 ` Linus Torvalds
2006-12-21 1:20 ` Andrew Morton
2006-12-21 2:54 ` Trond Myklebust
2006-12-21 17:19 ` Linus Torvalds
2006-12-21 7:32 ` Gordon Farquharson
2006-12-21 7:53 ` Linus Torvalds
2006-12-21 8:38 ` Martin Michlmayr
2006-12-21 8:59 ` Linus Torvalds
2006-12-21 9:17 ` Gordon Farquharson
2006-12-21 9:27 ` Andrew Morton
2006-12-22 4:20 ` Gordon Farquharson
2006-12-22 4:54 ` Linus Torvalds
2006-12-22 10:00 ` Martin Michlmayr
2006-12-22 10:06 ` Martin Michlmayr
2006-12-22 10:10 ` Martin Michlmayr
2006-12-22 11:07 ` Martin Michlmayr
2006-12-22 15:30 ` Gordon Farquharson
2006-12-22 17:11 ` Martin Michlmayr
2006-12-22 10:17 ` Andrew Morton
2006-12-22 11:12 ` Martin Michlmayr
2006-12-22 12:24 ` Andrei Popa
2006-12-22 12:32 ` Martin Michlmayr
2006-12-22 12:59 ` Martin Michlmayr
2006-12-22 13:25 ` Peter Zijlstra
2006-12-22 13:29 ` Peter Zijlstra
2006-12-22 17:56 ` Linus Torvalds
2006-12-22 19:20 ` Martin Michlmayr
2006-12-24 8:10 ` Gordon Farquharson
2006-12-24 8:43 ` Linus Torvalds
2006-12-24 8:57 ` Andrew Morton
2006-12-24 9:26 ` Linus Torvalds
2006-12-24 12:14 ` Andrei Popa
2006-12-24 12:26 ` Andrei Popa
2006-12-24 12:30 ` Andrew Morton
2006-12-24 12:31 ` Andrew Morton
2006-12-24 16:45 ` Andrei Popa
2006-12-24 17:16 ` Linus Torvalds
2006-12-24 18:07 ` Andrew Morton
2006-12-24 18:37 ` Linus Torvalds
2006-12-24 19:18 ` Linus Torvalds
2006-12-24 20:55 ` Gordon Farquharson
2006-12-26 10:31 ` Nick Piggin
2006-12-26 19:26 ` Linus Torvalds
2006-12-27 12:32 ` Jari Sundell
2006-12-27 12:44 ` valdyn
2006-12-27 13:33 ` Jari Sundell
2007-01-07 2:06 ` Tom Lanyon
2007-01-07 5:58 ` Tom Lanyon
2007-01-07 6:05 ` Andrew Morton
2006-12-24 21:21 ` Michael S. Tsirkin
2006-12-24 19:27 ` Gordon Farquharson
2006-12-24 19:35 ` Linus Torvalds
2006-12-24 20:10 ` Andrei Popa
2006-12-24 20:24 ` Linus Torvalds
2006-12-24 20:30 ` Andrei Popa
2006-12-26 17:51 ` Al Viro
2006-12-26 17:58 ` Al Viro
2006-12-24 22:01 ` Martin Michlmayr
2006-12-24 14:05 ` Martin Michlmayr
2006-12-26 16:17 ` Tobias Diedrich
2006-12-27 4:55 ` [PATCH] mm: fix page_mkclean_one David Miller
2006-12-27 7:00 ` Linus Torvalds
2006-12-27 8:39 ` Andrei Popa
2006-12-28 0:16 ` Linus Torvalds
2006-12-28 0:39 ` Linus Torvalds
2006-12-28 0:52 ` David Miller
2006-12-28 3:04 ` Linus Torvalds
2006-12-28 4:32 ` Gordon Farquharson
2006-12-28 4:53 ` Linus Torvalds
2006-12-28 5:20 ` Gordon Farquharson
2006-12-28 5:41 ` David Miller
2006-12-28 5:47 ` Gordon Farquharson
2006-12-28 10:13 ` Russell King
2006-12-28 14:15 ` Gordon Farquharson
2006-12-28 15:53 ` Martin Michlmayr
2006-12-28 17:27 ` Linus Torvalds
2006-12-28 18:44 ` Russell King
2006-12-28 19:01 ` Linus Torvalds
[not found] ` <97a0a9ac0612272115g4cce1f08n3c3c8498a6076bd5@mail.gmail.com>
[not found] ` <Pine.LNX.4.64.0612272120180.4473@woody.osdl.org>
2006-12-28 5:38 ` Gordon Farquharson
2006-12-28 9:30 ` Martin Michlmayr
2006-12-28 10:16 ` Martin Michlmayr
2006-12-28 10:49 ` Russell King
2006-12-28 14:56 ` Martin Michlmayr
2006-12-28 5:58 ` Gordon Farquharson
2006-12-28 17:08 ` Linus Torvalds
2006-12-28 5:55 ` Chen, Kenneth W
2006-12-28 6:10 ` Chen, Kenneth W
2006-12-28 6:27 ` David Miller
2006-12-28 17:10 ` Linus Torvalds
2006-12-28 9:15 ` Zhang, Yanmin
2006-12-28 17:15 ` Linus Torvalds
2006-12-28 11:50 ` Petri Kaukasoina
2006-12-28 15:09 ` Guillaume Chazarain
2006-12-28 19:19 ` Guillaume Chazarain
2006-12-28 19:28 ` Linus Torvalds
2006-12-28 19:45 ` Andrew Morton
2006-12-28 20:14 ` Linus Torvalds
2006-12-28 22:38 ` David Miller
2006-12-29 2:50 ` Segher Boessenkool
2006-12-29 6:48 ` Linus Torvalds
2006-12-29 8:58 ` Ok, explained.. (was Re: [PATCH] mm: fix page_mkclean_one) Linus Torvalds
2006-12-29 10:48 ` Linus Torvalds
2006-12-29 11:16 ` Andrei Popa
2006-12-29 12:09 ` Nick Piggin
2006-12-29 17:25 ` Linus Torvalds
2006-12-29 12:31 ` Ingo Molnar
2006-12-29 13:08 ` Martin Johansson
2006-12-29 14:08 ` Martin Michlmayr
2006-12-29 15:17 ` Stephen Clark
2006-12-29 15:54 ` Martin Michlmayr
2006-12-29 22:16 ` Andrew Morton
2006-12-29 22:24 ` Andrew Morton
2006-12-29 22:42 ` Linus Torvalds
2006-12-29 23:32 ` Theodore Tso
2006-12-29 23:59 ` Linus Torvalds
2006-12-30 0:05 ` Andrew Morton
2006-12-30 0:50 ` Linus Torvalds
2006-12-29 23:51 ` Andrew Morton
2006-12-30 0:11 ` Linus Torvalds
2006-12-30 0:33 ` Andrew Morton
2006-12-30 0:58 ` Linus Torvalds
2006-12-30 1:16 ` Andrew Morton
2006-12-29 15:27 ` Theodore Tso
2006-12-29 17:51 ` Linus Torvalds
2006-12-29 12:19 ` [patch] fix data corruption bug in __block_write_full_page() Ingo Molnar
2007-01-02 11:20 ` Christoph Hellwig
2007-01-02 12:06 ` Ingo Molnar
2007-01-02 12:16 ` Christoph Hellwig
2006-12-28 22:35 ` [PATCH] mm: fix page_mkclean_one Mike Galbraith
2006-12-22 15:01 ` [PATCH] mm: fix page_mkclean_one (was: 2.6.19 file content corruption on ext3) Patrick Mau
2006-12-23 8:15 ` Andrei Popa
2006-12-22 15:08 ` Gordon Farquharson
2006-12-22 10:01 ` Martin Michlmayr
2006-12-22 15:16 ` Gordon Farquharson
2006-12-21 12:30 ` Russell King
2006-12-21 12:36 ` Russell King
2006-12-21 11:21 ` Martin Michlmayr
2006-12-20 22:11 ` Russell King
2006-12-21 8:18 ` Martin Michlmayr
2006-12-21 9:54 ` Russell King
2006-12-20 14:55 ` Martin Schwidefsky
2006-12-20 14:27 ` 2.6.19 file content corruption on ext3 Martin Schwidefsky
2006-12-20 9:32 ` Peter Zijlstra
2006-12-20 14:15 ` Andrei Popa
2006-12-20 14:23 ` Peter Zijlstra
2006-12-20 16:30 ` Andrei Popa
2006-12-20 16:36 ` Peter Zijlstra
2006-12-19 7:38 ` Peter Zijlstra
2006-12-19 4:36 ` Nick Piggin
2006-12-19 6:34 ` Linus Torvalds
2006-12-19 6:51 ` Nick Piggin
2006-12-19 7:26 ` Linus Torvalds
2006-12-19 8:04 ` Linus Torvalds
2006-12-19 9:00 ` Peter Zijlstra
2006-12-19 9:05 ` Peter Zijlstra
[not found] ` <4587B762.2030603@yahoo.com.au>
2006-12-19 10:32 ` Andrew Morton
2006-12-19 10:42 ` Nick Piggin
2006-12-19 10:47 ` Andrew Morton
2006-12-19 10:52 ` Peter Zijlstra
2006-12-19 10:58 ` Nick Piggin
2006-12-19 11:51 ` Peter Zijlstra
2006-12-19 10:55 ` Nick Piggin
2006-12-19 16:51 ` Linus Torvalds
2006-12-19 17:43 ` Linus Torvalds
2006-12-19 18:59 ` Linus Torvalds
2006-12-19 21:30 ` Peter Zijlstra
2006-12-19 22:51 ` Linus Torvalds
2006-12-19 22:58 ` Andrew Morton
2006-12-19 23:06 ` Peter Zijlstra
2006-12-19 23:07 ` Peter Zijlstra
2006-12-20 0:03 ` Linus Torvalds
2006-12-20 0:18 ` Andrew Morton
2006-12-20 18:02 ` Stephen Clark
2006-12-20 5:56 ` Jari Sundell
2006-12-19 21:56 ` Florian Weimer
2006-12-21 13:03 ` Peter Zijlstra
2006-12-21 20:40 ` Andrew Morton
2006-12-19 20:03 ` dean gaudet
2006-12-19 7:22 ` Peter Zijlstra
2006-12-19 7:59 ` Nick Piggin
2006-12-19 8:14 ` Linus Torvalds
2006-12-19 9:40 ` Nick Piggin
2006-12-19 16:46 ` Linus Torvalds
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1166622979.10372.224.camel@twins \
--to=a.p.zijlstra@chello.nl \
--cc=akpm@osdl.org \
--cc=andrei.popa@i-neo.ro \
--cc=arjan@infradead.org \
--cc=arnd.bergmann@de.ibm.com \
--cc=fw@deneb.enyo.de \
--cc=heiko.carstens@de.ibm.com \
--cc=hugh@veritas.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mh+linux-kernel@zugschlus.de \
--cc=schwidefsky@de.ibm.com \
--cc=tbm@cyrius.com \
--cc=torvalds@osdl.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).