From: Andi Kleen <andi@firstfloor.org>
To: fengguang.wu@intel.com,
haicheng.li@intel.comfengguang.wu@intel.com,
linux-kernel@vger.kernel.org, linux-mm@kvack.org
Subject: [PATCH] [18/31] HWPOISON: limit hwpoison injector to known page types
Date: Tue, 8 Dec 2009 22:16:34 +0100 (CET) [thread overview]
Message-ID: <20091208211634.76A09B151F@basil.firstfloor.org> (raw)
In-Reply-To: <200912081016.198135742@firstfloor.org>
From: Wu Fengguang <fengguang.wu@intel.com>
__memory_failure()'s workflow is
set PG_hwpoison
//...
unset PG_hwpoison if didn't pass hwpoison filter
That could kill unrelated process if it happens to page fault on the
page with the (temporary) PG_hwpoison. The race should be big enough to
appear in stress tests.
Fix it by grabbing the page and checking filter at inject time. This
also avoids the very noisy "Injecting memory failure..." messages.
- we don't touch madvise() based injection, because the filters are
generally not necessary for it.
- if we want to apply the filters to h/w aided injection, we'd better to
rearrange the logic in __memory_failure() instead of this patch.
AK: fix documentation, use drain all, cleanups
CC: Haicheng Li <haicheng.li@intel.com>
Signed-off-by: Wu Fengguang <fengguang.wu@intel.com>
Signed-off-by: Andi Kleen <ak@linux.intel.com>
---
Documentation/vm/hwpoison.txt | 3 ++-
mm/hwpoison-inject.c | 41 +++++++++++++++++++++++++++++++++++++++--
mm/internal.h | 2 ++
3 files changed, 43 insertions(+), 3 deletions(-)
Index: linux/mm/hwpoison-inject.c
===================================================================
--- linux.orig/mm/hwpoison-inject.c
+++ linux/mm/hwpoison-inject.c
@@ -3,16 +3,53 @@
#include <linux/debugfs.h>
#include <linux/kernel.h>
#include <linux/mm.h>
+#include <linux/swap.h>
+#include <linux/pagemap.h>
#include "internal.h"
static struct dentry *hwpoison_dir;
static int hwpoison_inject(void *data, u64 val)
{
+ unsigned long pfn = val;
+ struct page *p;
+ int err;
+
if (!capable(CAP_SYS_ADMIN))
return -EPERM;
- printk(KERN_INFO "Injecting memory failure at pfn %Lx\n", val);
- return __memory_failure(val, 18, 0);
+
+ if (!pfn_valid(pfn))
+ return -ENXIO;
+
+ p = pfn_to_page(pfn);
+ /*
+ * This implies unable to support free buddy pages.
+ */
+ if (!get_page_unless_zero(p))
+ return 0;
+
+ if (!PageLRU(p))
+ shake_page(p);
+ /*
+ * This implies unable to support non-LRU pages.
+ */
+ if (!PageLRU(p))
+ return 0;
+
+ /*
+ * do a racy check with elevated page count, to make sure PG_hwpoison
+ * will only be set for the targeted owner (or on a free page).
+ * We temporarily take page lock for try_get_mem_cgroup_from_page().
+ * __memory_failure() will redo the check reliably inside page lock.
+ */
+ lock_page(p);
+ err = hwpoison_filter(p);
+ unlock_page(p);
+ if (err)
+ return 0;
+
+ printk(KERN_INFO "Injecting memory failure at pfn %lx\n", pfn);
+ return __memory_failure(pfn, 18, MF_COUNT_INCREASED);
}
static int hwpoison_unpoison(void *data, u64 val)
Index: linux/mm/internal.h
===================================================================
--- linux.orig/mm/internal.h
+++ linux/mm/internal.h
@@ -264,5 +264,7 @@ int __get_user_pages(struct task_struct
#define ZONE_RECLAIM_SUCCESS 1
#endif
+extern int hwpoison_filter(struct page *p);
+
extern u32 hwpoison_filter_dev_major;
extern u32 hwpoison_filter_dev_minor;
Index: linux/Documentation/vm/hwpoison.txt
===================================================================
--- linux.orig/Documentation/vm/hwpoison.txt
+++ linux/Documentation/vm/hwpoison.txt
@@ -103,7 +103,8 @@ hwpoison-inject module through debugfs
corrupt-pfn
-Inject hwpoison fault at PFN echoed into this file.
+Inject hwpoison fault at PFN echoed into this file. This does
+some early filtering to avoid corrupted unintended pages in test suites.
unpoison-pfn
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
next prev parent reply other threads:[~2009-12-08 21:16 UTC|newest]
Thread overview: 61+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-12-08 21:16 [PATCH] [0/31] HWPOISON 2.6.33 pre-merge posting Andi Kleen
2009-12-08 21:16 ` [PATCH] [1/31] HWPOISON: Add Andi Kleen as hwpoison maintainer to MAINTAINERS Andi Kleen
2009-12-08 21:16 ` [PATCH] [2/31] HWPOISON: Be more aggressive at freeing non LRU caches Andi Kleen
2009-12-08 21:16 ` [PATCH] [3/31] page-types: add standard GPL license header Andi Kleen
2009-12-08 21:16 ` [PATCH] [4/31] HWPOISON: remove the anonymous entry Andi Kleen
2009-12-08 21:16 ` [PATCH] [5/31] HWPOISON: return ENXIO on invalid page number Andi Kleen
2009-12-08 21:16 ` [PATCH] [6/31] HWPOISON: avoid grabbing the page count multiple times during madvise injection Andi Kleen
2009-12-08 21:16 ` [PATCH] [7/31] HWPOISON: Turn ref argument into flags argument Andi Kleen
2009-12-08 21:16 ` [PATCH] [8/31] HWPOISON: abort on failed unmap Andi Kleen
2009-12-08 21:16 ` [PATCH] [9/31] HWPOISON: comment the possible set_page_dirty() race Andi Kleen
2009-12-08 21:16 ` [PATCH] [10/31] HWPOISON: comment dirty swapcache pages Andi Kleen
2009-12-08 21:16 ` [PATCH] [11/31] HWPOISON: introduce delete_from_lru_cache() Andi Kleen
2009-12-08 21:16 ` [PATCH] [12/31] HWPOISON: remove the free buddy page handler Andi Kleen
2009-12-08 21:16 ` [PATCH] [13/31] HWPOISON: detect free buddy pages explicitly Andi Kleen
2009-12-08 21:16 ` [PATCH] [14/31] HWPOISON: Add unpoisoning support Andi Kleen
2009-12-08 21:16 ` [PATCH] [15/31] HWPOISON: make semantics of IGNORED/DELAYED clear Andi Kleen
2009-12-08 21:16 ` [PATCH] [16/31] HWPOISON: return 0 to indicate success reliably Andi Kleen
2009-12-08 21:16 ` [PATCH] [17/31] HWPOISON: add fs/device filters Andi Kleen
2009-12-08 21:16 ` Andi Kleen [this message]
2009-12-08 21:16 ` [PATCH] [19/31] mm: export stable page flags Andi Kleen
2009-12-08 22:27 ` Matt Mackall
2009-12-09 2:00 ` Wu Fengguang
2009-12-09 21:38 ` Matt Mackall
2009-12-10 1:50 ` Andi Kleen
2009-12-10 2:09 ` Wu Fengguang
2009-12-10 13:42 ` Andi Kleen
2009-12-08 21:16 ` [PATCH] [20/31] HWPOISON: add page flags filter Andi Kleen
2009-12-08 21:16 ` [PATCH] [21/31] memcg: rename and export try_get_mem_cgroup_from_page() Andi Kleen
2009-12-08 21:16 ` [PATCH] [22/31] memcg: add accessor to mem_cgroup.css Andi Kleen
2009-12-08 21:16 ` [PATCH] [23/31] HWPOISON: add memory cgroup filter Andi Kleen
2009-12-09 5:04 ` Li Zefan
2009-12-09 5:06 ` KAMEZAWA Hiroyuki
2009-12-09 5:33 ` Balbir Singh
2009-12-09 9:15 ` Andi Kleen
2009-12-09 20:47 ` Paul Menage
2009-12-09 23:56 ` KAMEZAWA Hiroyuki
2009-12-10 1:42 ` Andi Kleen
2009-12-10 2:21 ` Balbir Singh
2009-12-11 2:14 ` Wu Fengguang
2009-12-14 12:53 ` Andi Kleen
2009-12-08 21:16 ` [PATCH] [24/31] HWPOISON: add an interface to switch off/on all the page filters Andi Kleen
2009-12-08 21:16 ` [PATCH] [25/31] HWPOISON: Don't do early filtering if filter is disabled Andi Kleen
2009-12-08 21:16 ` [PATCH] [26/31] HWPOISON: mention HWPoison in Kconfig entry Andi Kleen
2009-12-08 21:16 ` [PATCH] [27/31] HWPOISON: Use correct name for MADV_HWPOISON in documentation Andi Kleen
2009-12-08 21:16 ` [PATCH] [28/31] HWPOISON: Use new shake_page in memory_failure Andi Kleen
2009-12-08 21:16 ` [PATCH] [29/31] HWPOISON: Undefine short-hand macros after use to avoid namespace conflict Andi Kleen
2009-12-08 21:16 ` [PATCH] [30/31] HWPOISON: Add soft page offline support Andi Kleen
2009-12-08 21:16 ` [PATCH] [31/31] HWPOISON: Add a madvise() injector for soft page offlining Andi Kleen
2010-06-19 12:36 ` Michael Kerrisk
2010-06-19 13:20 ` Andi Kleen
2010-06-19 13:25 ` Michael Kerrisk
2010-06-19 13:30 ` Andi Kleen
2010-06-19 13:43 ` Michael Kerrisk
2010-06-19 14:09 ` Andi Kleen
2010-06-19 14:17 ` Michael Kerrisk
2010-06-19 19:52 ` Andi Kleen
2010-06-20 6:19 ` Michael Kerrisk
2010-06-20 7:14 ` Wu Fengguang
2010-06-26 13:18 ` Michael Kerrisk
2010-06-26 23:30 ` Wu Fengguang
2010-06-27 4:38 ` Michael Kerrisk
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=20091208211634.76A09B151F@basil.firstfloor.org \
--to=andi@firstfloor.org \
--cc=fengguang.wu@intel.com \
--cc=haicheng.li@intel.comfengguang.wu \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).