Commit 588f9ce6ca61ecb4663ee6ef2f75d2d96c73151e

Authored by Andi Kleen
Committed by Andi Kleen
1 parent 7bc98b97ed

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>

Showing 2 changed files with 23 additions and 0 deletions Side-by-side Diff

... ... @@ -1335,6 +1335,7 @@
1335 1335 extern int __memory_failure(unsigned long pfn, int trapno, int ref);
1336 1336 extern int sysctl_memory_failure_early_kill;
1337 1337 extern int sysctl_memory_failure_recovery;
  1338 +extern void shake_page(struct page *p);
1338 1339 extern atomic_long_t mce_bad_pages;
1339 1340  
1340 1341 #endif /* __KERNEL__ */
... ... @@ -83,6 +83,28 @@
83 83 }
84 84  
85 85 /*
  86 + * When a unknown page type is encountered drain as many buffers as possible
  87 + * in the hope to turn the page into a LRU or free page, which we can handle.
  88 + */
  89 +void shake_page(struct page *p)
  90 +{
  91 + if (!PageSlab(p)) {
  92 + lru_add_drain_all();
  93 + if (PageLRU(p))
  94 + return;
  95 + drain_all_pages();
  96 + if (PageLRU(p) || is_free_buddy_page(p))
  97 + return;
  98 + }
  99 + /*
  100 + * Could call shrink_slab here (which would also
  101 + * shrink other caches). Unfortunately that might
  102 + * also access the corrupted page, which could be fatal.
  103 + */
  104 +}
  105 +EXPORT_SYMBOL_GPL(shake_page);
  106 +
  107 +/*
86 108 * Kill all processes that have a poisoned page mapped and then isolate
87 109 * the page.
88 110 *