From: Zoltan Menyhart <Zoltan.Menyhart@bull.net>
To: LKML <linux-kernel@vger.kernel.org>
Subject: Race condition around flush_cache_page() ?
Date: Thu, 26 Jul 2007 17:56:45 +0200 [thread overview]
Message-ID: <46A8C43D.8050302@bull.net> (raw)
In-Reply-To: <20070726171323.a9c17eda.kamezawa.hiroyu@jp.fujitsu.com>
Documentation/cachetlb.txt says:
"In general, when Linux is changing an existing virtual-->physical
mapping to a new value, the sequence will be ...:
flush_cache_page(vma, addr, pfn);
set_pte(pte_pointer, new_pte_val);
flush_tlb_page(vma, addr);
The cache level flush will always be first, because this allows
us to properly handle systems whose caches are strict and require
a virtual-->physical translation to exist for a virtual address
when that virtual address is flushed from the cache."
Let's assume we've got a multi threaded application, with 2 threads,
each of them bound to its own CPU.
Let's assume the CPU caches are tagged by virtual address and the
virtual-->physical translation must remain valid while we flush the
cache.
CPU #1 is in a loop that accesses the stuff on a given virtual page.
CPU #2 executes the sequence above, trying to tear down the mapping
of the same page. Once CPU#2 has completed flush_cache_page()
(that is not a NO-OP), there is no valid stuff of the page any more
in any of the the CPU caches. CPU #2 will continue somewhat later
to invalidate the PTE due to some HW delays.
In the mean time, CPU #1 detects a cache miss. It has the valid
translation in its TLB, it can re-fetch the cache line from the page.
Now CPU #2 can really invalidate the PTE and flush the TLB-s.
We can end up a cache line of the CPU #1 that has no more valid
virtual-->physical translation.
As far as I can understand, there is a contradiction:
- either we keep the valid translation while flushing, and
the other CPU can re-fetch the data
- or we nuke the PTE first, and the flush wont work
Can someone please explain me how it is assumed to work?
Thanks,
Zoltan Menyhart
prev parent reply other threads:[~2007-07-26 15:56 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-07-26 8:13 [PATCH] flush icache before set_pte on ia64 take3 KAMEZAWA Hiroyuki
2007-07-26 8:13 ` KAMEZAWA Hiroyuki
2007-07-26 8:27 ` KAMEZAWA Hiroyuki
2007-07-26 8:27 ` KAMEZAWA Hiroyuki
2007-07-26 15:13 ` Zoltan Menyhart
2007-07-26 15:13 ` Zoltan Menyhart
2007-07-26 16:08 ` KAMEZAWA Hiroyuki
2007-07-26 16:08 ` KAMEZAWA Hiroyuki
2007-07-26 16:25 ` Zoltan Menyhart
2007-07-26 16:25 ` Zoltan Menyhart
2007-07-26 15:56 ` Zoltan Menyhart [this message]
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=46A8C43D.8050302@bull.net \
--to=zoltan.menyhart@bull.net \
--cc=linux-kernel@vger.kernel.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.