mirror of https://gitee.com/openkylin/linux.git
HWPOISON: Be more aggressive at freeing non LRU caches
shake_page handles more types of page caches than lru_drain_all() - per cpu page allocator pages - per CPU LRU Stops early when the page became free. Used in followon patches. Signed-off-by: Andi Kleen <ak@linux.intel.com>
This commit is contained in:
parent
7bc98b97ed
commit
588f9ce6ca
|
@ -1335,6 +1335,7 @@ extern void memory_failure(unsigned long pfn, int trapno);
|
|||
extern int __memory_failure(unsigned long pfn, int trapno, int ref);
|
||||
extern int sysctl_memory_failure_early_kill;
|
||||
extern int sysctl_memory_failure_recovery;
|
||||
extern void shake_page(struct page *p);
|
||||
extern atomic_long_t mce_bad_pages;
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
|
|
|
@ -82,6 +82,28 @@ static int kill_proc_ao(struct task_struct *t, unsigned long addr, int trapno,
|
|||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
* When a unknown page type is encountered drain as many buffers as possible
|
||||
* in the hope to turn the page into a LRU or free page, which we can handle.
|
||||
*/
|
||||
void shake_page(struct page *p)
|
||||
{
|
||||
if (!PageSlab(p)) {
|
||||
lru_add_drain_all();
|
||||
if (PageLRU(p))
|
||||
return;
|
||||
drain_all_pages();
|
||||
if (PageLRU(p) || is_free_buddy_page(p))
|
||||
return;
|
||||
}
|
||||
/*
|
||||
* Could call shrink_slab here (which would also
|
||||
* shrink other caches). Unfortunately that might
|
||||
* also access the corrupted page, which could be fatal.
|
||||
*/
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(shake_page);
|
||||
|
||||
/*
|
||||
* Kill all processes that have a poisoned page mapped and then isolate
|
||||
* the page.
|
||||
|
|
Loading…
Reference in New Issue