All of lore.kernel.org
 help / color / mirror / Atom feed
From: Andi Kleen <andi@firstfloor.org>
To: akpm@linux-foundation.org, npiggin@suse.de,
	linux-kernel@vger.kernel.org, linux-mm@kvack.org,
	fengguang.wu@intel.com
Subject: [PATCH] [15/16] HWPOISON: Add madvise() based injector for hardware poisoned pages v3
Date: Wed,  3 Jun 2009 20:46:50 +0200 (CEST)	[thread overview]
Message-ID: <20090603184650.CE7521D0290@basil.firstfloor.org> (raw)
In-Reply-To: <20090603846.816684333@firstfloor.org>


Impact: optional, useful for debugging

Add a new madvice sub command to inject poison for some
pages in a process' address space.  This is useful for
testing the poison page handling.

Open issues:

- This patch allows root to tie up arbitary amounts of memory.
Should this be disabled inside containers?
- There's a small race window between getting the page and injecting.
The patch drops the ref count because otherwise memory_failure
complains about dangling references. In theory with a multi threaded
injector one could inject poison for a process foreign page this way.
Not a serious issue right now.

v2: Use write flag for get_user_pages to make sure to always get
a fresh page
v3: Don't request write mapping (Fengguang Wu)

Signed-off-by: Andi Kleen <ak@linux.intel.com>

---
 include/asm-generic/mman-common.h |    1 +
 mm/madvise.c                      |   36 ++++++++++++++++++++++++++++++++++++
 2 files changed, 37 insertions(+)

Index: linux/mm/madvise.c
===================================================================
--- linux.orig/mm/madvise.c	2009-06-03 20:30:31.000000000 +0200
+++ linux/mm/madvise.c	2009-06-03 20:30:47.000000000 +0200
@@ -207,6 +207,38 @@
 	return error;
 }
 
+#ifdef CONFIG_MEMORY_FAILURE
+/*
+ * Error injection support for memory error handling.
+ */
+static int madvise_hwpoison(unsigned long start, unsigned long end)
+{
+	/*
+	 * RED-PEN
+	 * This allows to tie up arbitary amounts of memory.
+	 * Might be a good idea to disable it inside containers even for root.
+	 */
+	if (!capable(CAP_SYS_ADMIN))
+		return -EPERM;
+	for (; start < end; start += PAGE_SIZE) {
+		struct page *p;
+		int ret = get_user_pages(current, current->mm, start, 1,
+						0, 0, &p, NULL);
+		if (ret != 1)
+			return ret;
+		put_page(p);
+		/*
+		 * RED-PEN page can be reused in a short window, but otherwise
+		 * we'll have to fight with the reference count.
+		 */
+		printk(KERN_INFO "Injecting memory failure for page %lx at %lx\n",
+		       page_to_pfn(p), start);
+		memory_failure(page_to_pfn(p), 0);
+	}
+	return 0;
+}
+#endif
+
 static long
 madvise_vma(struct vm_area_struct *vma, struct vm_area_struct **prev,
 		unsigned long start, unsigned long end, int behavior)
@@ -307,6 +339,10 @@
 	int write;
 	size_t len;
 
+#ifdef CONFIG_MEMORY_FAILURE
+	if (behavior == MADV_HWPOISON)
+		return madvise_hwpoison(start, start+len_in);
+#endif
 	if (!madvise_behavior_valid(behavior))
 		return error;
 
Index: linux/include/asm-generic/mman-common.h
===================================================================
--- linux.orig/include/asm-generic/mman-common.h	2009-06-03 20:30:31.000000000 +0200
+++ linux/include/asm-generic/mman-common.h	2009-06-03 20:30:47.000000000 +0200
@@ -34,6 +34,7 @@
 #define MADV_REMOVE	9		/* remove these pages & resources */
 #define MADV_DONTFORK	10		/* don't inherit across fork */
 #define MADV_DOFORK	11		/* do inherit across fork */
+#define MADV_HWPOISON	12		/* poison a page for testing */
 
 /* compatibility flags */
 #define MAP_FILE	0

WARNING: multiple messages have this Message-ID (diff)
From: Andi Kleen <andi@firstfloor.org>
To: akpm@linux-foundation.org, npiggin@suse.de,
	linux-kernel@vger.kernel.org, linux-mm@kvack.org,
	fengguang.wu@intel.com
Subject: [PATCH] [15/16] HWPOISON: Add madvise() based injector for hardware poisoned pages v3
Date: Wed,  3 Jun 2009 20:46:50 +0200 (CEST)	[thread overview]
Message-ID: <20090603184650.CE7521D0290@basil.firstfloor.org> (raw)
In-Reply-To: <20090603846.816684333@firstfloor.org>


Impact: optional, useful for debugging

Add a new madvice sub command to inject poison for some
pages in a process' address space.  This is useful for
testing the poison page handling.

Open issues:

- This patch allows root to tie up arbitary amounts of memory.
Should this be disabled inside containers?
- There's a small race window between getting the page and injecting.
The patch drops the ref count because otherwise memory_failure
complains about dangling references. In theory with a multi threaded
injector one could inject poison for a process foreign page this way.
Not a serious issue right now.

v2: Use write flag for get_user_pages to make sure to always get
a fresh page
v3: Don't request write mapping (Fengguang Wu)

Signed-off-by: Andi Kleen <ak@linux.intel.com>

---
 include/asm-generic/mman-common.h |    1 +
 mm/madvise.c                      |   36 ++++++++++++++++++++++++++++++++++++
 2 files changed, 37 insertions(+)

Index: linux/mm/madvise.c
===================================================================
--- linux.orig/mm/madvise.c	2009-06-03 20:30:31.000000000 +0200
+++ linux/mm/madvise.c	2009-06-03 20:30:47.000000000 +0200
@@ -207,6 +207,38 @@
 	return error;
 }
 
+#ifdef CONFIG_MEMORY_FAILURE
+/*
+ * Error injection support for memory error handling.
+ */
+static int madvise_hwpoison(unsigned long start, unsigned long end)
+{
+	/*
+	 * RED-PEN
+	 * This allows to tie up arbitary amounts of memory.
+	 * Might be a good idea to disable it inside containers even for root.
+	 */
+	if (!capable(CAP_SYS_ADMIN))
+		return -EPERM;
+	for (; start < end; start += PAGE_SIZE) {
+		struct page *p;
+		int ret = get_user_pages(current, current->mm, start, 1,
+						0, 0, &p, NULL);
+		if (ret != 1)
+			return ret;
+		put_page(p);
+		/*
+		 * RED-PEN page can be reused in a short window, but otherwise
+		 * we'll have to fight with the reference count.
+		 */
+		printk(KERN_INFO "Injecting memory failure for page %lx at %lx\n",
+		       page_to_pfn(p), start);
+		memory_failure(page_to_pfn(p), 0);
+	}
+	return 0;
+}
+#endif
+
 static long
 madvise_vma(struct vm_area_struct *vma, struct vm_area_struct **prev,
 		unsigned long start, unsigned long end, int behavior)
@@ -307,6 +339,10 @@
 	int write;
 	size_t len;
 
+#ifdef CONFIG_MEMORY_FAILURE
+	if (behavior == MADV_HWPOISON)
+		return madvise_hwpoison(start, start+len_in);
+#endif
 	if (!madvise_behavior_valid(behavior))
 		return error;
 
Index: linux/include/asm-generic/mman-common.h
===================================================================
--- linux.orig/include/asm-generic/mman-common.h	2009-06-03 20:30:31.000000000 +0200
+++ linux/include/asm-generic/mman-common.h	2009-06-03 20:30:47.000000000 +0200
@@ -34,6 +34,7 @@
 #define MADV_REMOVE	9		/* remove these pages & resources */
 #define MADV_DONTFORK	10		/* don't inherit across fork */
 #define MADV_DOFORK	11		/* do inherit across fork */
+#define MADV_HWPOISON	12		/* poison a page for testing */
 
 /* compatibility flags */
 #define MAP_FILE	0

--
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>

  parent reply	other threads:[~2009-06-03 18:49 UTC|newest]

Thread overview: 146+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-06-03 18:46 [PATCH] [0/16] HWPOISON: Intro Andi Kleen
2009-06-03 18:46 ` Andi Kleen
2009-06-03 18:46 ` [PATCH] [1/16] HWPOISON: Add page flag for poisoned pages Andi Kleen
2009-06-03 18:46   ` Andi Kleen
2009-06-03 18:46 ` [PATCH] [2/16] HWPOISON: Export some rmap vma locking to outside world Andi Kleen
2009-06-03 18:46   ` Andi Kleen
2009-06-03 18:46 ` [PATCH] [3/16] HWPOISON: Add support for poison swap entries v2 Andi Kleen
2009-06-03 18:46   ` Andi Kleen
2009-06-03 18:46 ` [PATCH] [4/16] HWPOISON: Add new SIGBUS error codes for hardware poison signals Andi Kleen
2009-06-03 18:46   ` Andi Kleen
2009-06-03 18:46 ` [PATCH] [5/16] HWPOISON: Add basic support for poisoned pages in fault handler v3 Andi Kleen
2009-06-03 18:46   ` Andi Kleen
2009-06-03 18:46 ` [PATCH] [6/16] HWPOISON: Add various poison checks in mm/memory.c Andi Kleen
2009-06-03 18:46   ` Andi Kleen
2009-06-04  4:26   ` Wu Fengguang
2009-06-04  4:26     ` Wu Fengguang
2009-06-04  5:19     ` Andi Kleen
2009-06-04  5:19       ` Andi Kleen
2009-06-04 11:55       ` Wu Fengguang
2009-06-04 11:55         ` Wu Fengguang
2009-06-04 12:52         ` Andi Kleen
2009-06-04 12:52           ` Andi Kleen
2009-06-04 12:50           ` Wu Fengguang
2009-06-04 12:50             ` Wu Fengguang
2009-06-04 13:02             ` Andi Kleen
2009-06-04 13:02               ` Andi Kleen
2009-06-04 13:16               ` Wu Fengguang
2009-06-04 13:16                 ` Wu Fengguang
2009-06-09 10:25   ` Nick Piggin
2009-06-09 10:25     ` Nick Piggin
2009-06-09 12:21     ` Wu Fengguang
2009-06-09 12:21       ` Wu Fengguang
2009-06-09 12:35       ` Nick Piggin
2009-06-09 12:35         ` Nick Piggin
2009-06-03 18:46 ` [PATCH] [7/16] HWPOISON: x86: Add VM_FAULT_HWPOISON handling to x86 page fault handler v2 Andi Kleen
2009-06-03 18:46   ` Andi Kleen
2009-06-09  9:54   ` Nick Piggin
2009-06-09  9:54     ` Nick Piggin
2009-06-09 12:34     ` [PATCH] HWPOISON: define VM_FAULT_HWPOISON to 0 when feature is disabled Wu Fengguang
2009-06-09 12:34       ` Wu Fengguang
2009-06-03 18:46 ` [PATCH] [8/16] HWPOISON: Use bitmask/action code for try_to_unmap behaviour Andi Kleen
2009-06-03 18:46   ` Andi Kleen
2009-06-09  9:57   ` Nick Piggin
2009-06-09  9:57     ` Nick Piggin
2009-06-10  2:27     ` Wu Fengguang
2009-06-10  2:27       ` Wu Fengguang
2009-06-10  6:07       ` Nick Piggin
2009-06-10  6:07         ` Nick Piggin
2009-06-03 18:46 ` [PATCH] [9/16] HWPOISON: Handle hardware poisoned pages in try_to_unmap Andi Kleen
2009-06-03 18:46   ` Andi Kleen
2009-06-04  4:35   ` Wu Fengguang
2009-06-04  4:35     ` Wu Fengguang
2009-06-04  5:21     ` Andi Kleen
2009-06-04  5:21       ` Andi Kleen
2009-06-03 18:46 ` [PATCH] [10/16] HWPOISON: Handle poisoned pages in set_page_dirty() Andi Kleen
2009-06-03 18:46   ` Andi Kleen
2009-06-04  0:36   ` Wu Fengguang
2009-06-04  0:36     ` Wu Fengguang
2009-06-04  5:27     ` Andi Kleen
2009-06-04  5:27       ` Andi Kleen
2009-06-09  9:59   ` Nick Piggin
2009-06-09  9:59     ` Nick Piggin
2009-06-09 12:51     ` Wu Fengguang
2009-06-09 12:51       ` Wu Fengguang
2009-06-03 18:46 ` [PATCH] [11/16] HWPOISON: check and isolate corrupted free pages v2 Andi Kleen
2009-06-03 18:46   ` Andi Kleen
2009-06-09 10:02   ` Nick Piggin
2009-06-09 10:02     ` Nick Piggin
2009-06-09 13:03     ` Wu Fengguang
2009-06-09 13:03       ` Wu Fengguang
2009-06-09 13:28       ` Nick Piggin
2009-06-09 13:28         ` Nick Piggin
2009-06-09 13:49         ` Wu Fengguang
2009-06-09 13:49           ` Wu Fengguang
2009-06-09 13:55           ` Nick Piggin
2009-06-09 13:55             ` Nick Piggin
2009-06-09 14:56             ` Wu Fengguang
2009-06-09 14:56               ` Wu Fengguang
2009-06-09 15:31               ` Nick Piggin
2009-06-09 15:31                 ` Nick Piggin
2009-06-03 18:46 ` [PATCH] [12/16] Refactor truncate to allow direct truncating of page Andi Kleen
2009-06-03 18:46   ` Andi Kleen
2009-06-04  4:32   ` Wu Fengguang
2009-06-04  4:32     ` Wu Fengguang
2009-06-04  5:20     ` Andi Kleen
2009-06-04  5:20       ` Andi Kleen
2009-06-03 18:46 ` [PATCH] [13/16] HWPOISON: The high level memory error handler in the VM v5 Andi Kleen
2009-06-03 18:46   ` Andi Kleen
2009-06-04  3:24   ` Wu Fengguang
2009-06-04  3:24     ` Wu Fengguang
2009-06-04  5:13     ` Andi Kleen
2009-06-04  5:13       ` Andi Kleen
2009-06-04  9:07       ` Wu Fengguang
2009-06-04  9:07         ` Wu Fengguang
2009-06-04  9:26         ` Andi Kleen
2009-06-04  9:26           ` Andi Kleen
2009-06-09  9:51   ` Nick Piggin
2009-06-09  9:51     ` Nick Piggin
2009-06-09 11:14     ` Nick Piggin
2009-06-09 11:14       ` Nick Piggin
2009-06-09 10:09   ` Nick Piggin
2009-06-09 10:09     ` Nick Piggin
2009-06-09 16:05     ` Hugh Dickins
2009-06-09 16:05       ` Hugh Dickins
2009-06-09 16:35       ` Nick Piggin
2009-06-09 16:35         ` Nick Piggin
2009-06-10  8:38       ` Wu Fengguang
2009-06-10  8:38         ` Wu Fengguang
2009-06-10  8:59         ` Nick Piggin
2009-06-10  8:59           ` Nick Piggin
2009-06-10  9:20           ` Wu Fengguang
2009-06-10  9:20             ` Wu Fengguang
2009-06-10 11:03             ` Nick Piggin
2009-06-10 11:03               ` Nick Piggin
2009-06-10 12:16               ` Wu Fengguang
2009-06-10 12:16                 ` Wu Fengguang
2009-06-10 12:36                 ` Nick Piggin
2009-06-10 12:36                   ` Nick Piggin
2009-06-12  9:58       ` Andi Kleen
2009-06-12  9:58         ` Andi Kleen
2009-06-10  3:10     ` [PATCH] HWPOISON: fix tasklist_lock/anon_vma locking order Wu Fengguang
2009-06-10  3:10       ` Wu Fengguang
2009-06-03 18:46 ` [PATCH] [14/16] HWPOISON: FOR TESTING: Enable memory failure code unconditionally Andi Kleen
2009-06-03 18:46   ` Andi Kleen
2009-06-03 18:46 ` Andi Kleen [this message]
2009-06-03 18:46   ` [PATCH] [15/16] HWPOISON: Add madvise() based injector for hardware poisoned pages v3 Andi Kleen
2009-06-03 18:46 ` [PATCH] [16/16] HWPOISON: Add simple debugfs interface to inject hwpoison on arbitary PFNs Andi Kleen
2009-06-03 18:46   ` Andi Kleen
2009-06-09 10:20 ` [PATCH] [0/16] HWPOISON: Intro Nick Piggin
2009-06-09 10:20   ` Nick Piggin
2009-06-10  9:07   ` Wu Fengguang
2009-06-10  9:07     ` Wu Fengguang
2009-06-10  9:18     ` Nick Piggin
2009-06-10  9:18       ` Nick Piggin
2009-06-10  9:45       ` Wu Fengguang
2009-06-10  9:45         ` Wu Fengguang
2009-06-10 11:15         ` Nick Piggin
2009-06-10 11:15           ` Nick Piggin
2009-06-10 12:36           ` Wu Fengguang
2009-06-10 12:36             ` Wu Fengguang
2009-06-10 12:47             ` Nick Piggin
2009-06-10 12:47               ` Nick Piggin
  -- strict thread matches above, loose matches on Subject: below --
2009-05-29 21:35 Andi Kleen
2009-05-29 21:35 ` [PATCH] [15/16] HWPOISON: Add madvise() based injector for hardware poisoned pages v3 Andi Kleen
2009-05-29 21:35   ` Andi Kleen
2009-05-27 20:12 [PATCH] [0/16] HWPOISON: Intro Andi Kleen
2009-05-27 20:12 ` [PATCH] [15/16] HWPOISON: Add madvise() based injector for hardware poisoned pages v3 Andi Kleen
2009-05-27 20:12   ` Andi Kleen

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=20090603184650.CE7521D0290@basil.firstfloor.org \
    --to=andi@firstfloor.org \
    --cc=akpm@linux-foundation.org \
    --cc=fengguang.wu@intel.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=npiggin@suse.de \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.