HWPOISON: Use new shake_page in memory_failure

shake_page handles more types of page caches than
the much simpler lru_add_drain_all:

- slab (quite inefficiently for now)
- any other caches with a shrinker callback
- per cpu page allocator pages
- per CPU LRU

Use this call to try to turn pages into free or LRU pages.
Then handle the case of the page becoming free after drain everything.

Signed-off-by: Andi Kleen <ak@linux.intel.com>
This commit is contained in:
Andi Kleen 2009-12-16 12:20:00 +01:00 committed by Andi Kleen
parent fe194d3e10
commit 0474a60ec7

View File

@ -936,8 +936,15 @@ int __memory_failure(unsigned long pfn, int trapno, int flags)
* walked by the page reclaim code, however that's not a big loss. * walked by the page reclaim code, however that's not a big loss.
*/ */
if (!PageLRU(p)) if (!PageLRU(p))
lru_add_drain_all(); shake_page(p);
if (!PageLRU(p)) { if (!PageLRU(p)) {
/*
* shake_page could have turned it free.
*/
if (is_free_buddy_page(p)) {
action_result(pfn, "free buddy, 2nd try", DELAYED);
return 0;
}
action_result(pfn, "non LRU", IGNORED); action_result(pfn, "non LRU", IGNORED);
put_page(p); put_page(p);
return -EBUSY; return -EBUSY;