mirror of
https://github.com/followmsi/android_kernel_google_msm.git
synced 2024-11-06 23:17:41 +00:00
[PATCH] sync_page() smp_mb() comment
The smp_mb() is becaus sync_page() doesn't have PG_locked while it accesses page_mapping(page). The comments in the patch (the entire patch is the addition of this comment) try to explain further how and why smp_mb() is used. Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
parent
93ea1d0a12
commit
dd1d5afca8
1 changed files with 19 additions and 1 deletions
20
mm/filemap.c
20
mm/filemap.c
|
@ -139,7 +139,25 @@ static int sync_page(void *word)
|
||||||
page = container_of((page_flags_t *)word, struct page, flags);
|
page = container_of((page_flags_t *)word, struct page, flags);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* FIXME, fercrissake. What is this barrier here for?
|
* page_mapping() is being called without PG_locked held.
|
||||||
|
* Some knowledge of the state and use of the page is used to
|
||||||
|
* reduce the requirements down to a memory barrier.
|
||||||
|
* The danger here is of a stale page_mapping() return value
|
||||||
|
* indicating a struct address_space different from the one it's
|
||||||
|
* associated with when it is associated with one.
|
||||||
|
* After smp_mb(), it's either the correct page_mapping() for
|
||||||
|
* the page, or an old page_mapping() and the page's own
|
||||||
|
* page_mapping() has gone NULL.
|
||||||
|
* The ->sync_page() address_space operation must tolerate
|
||||||
|
* page_mapping() going NULL. By an amazing coincidence,
|
||||||
|
* this comes about because none of the users of the page
|
||||||
|
* in the ->sync_page() methods make essential use of the
|
||||||
|
* page_mapping(), merely passing the page down to the backing
|
||||||
|
* device's unplug functions when it's non-NULL, which in turn
|
||||||
|
* ignore it for all cases but swap, where only page->private is
|
||||||
|
* of interest. When page_mapping() does go NULL, the entire
|
||||||
|
* call stack gracefully ignores the page and returns.
|
||||||
|
* -- wli
|
||||||
*/
|
*/
|
||||||
smp_mb();
|
smp_mb();
|
||||||
mapping = page_mapping(page);
|
mapping = page_mapping(page);
|
||||||
|
|
Loading…
Reference in a new issue