Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 177632
b: refs/heads/master
c: 4fd466e
h: refs/heads/master
v: v3
  • Loading branch information
Andi Kleen authored and Andi Kleen committed Dec 16, 2009
1 parent 76b1286 commit f0237ab
Show file tree
Hide file tree
Showing 5 changed files with 71 additions and 1 deletion.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: d324236b3333e87c8825b35f2104184734020d35
refs/heads/master: 4fd466eb46a6a917c317a87fb94bfc7252a0f7ed
16 changes: 16 additions & 0 deletions trunk/Documentation/vm/hwpoison.txt
Original file line number Diff line number Diff line change
Expand Up @@ -123,6 +123,22 @@ Only handle memory failures to pages associated with the file system defined
by block device major/minor. -1U is the wildcard value.
This should be only used for testing with artificial injection.

corrupt-filter-memcg

Limit injection to pages owned by memgroup. Specified by inode number
of the memcg.

Example:
mkdir /cgroup/hwpoison

usemem -m 100 -s 1000 &
echo `jobs -p` > /cgroup/hwpoison/tasks

memcg_ino=$(ls -id /cgroup/hwpoison | cut -f1 -d' ')
echo $memcg_ino > /debug/hwpoison/corrupt-filter-memcg

page-types -p `pidof init` --hwpoison # shall do nothing
page-types -p `pidof usemem` --hwpoison # poison its pages

corrupt-filter-flags-mask
corrupt-filter-flags-value
Expand Down
7 changes: 7 additions & 0 deletions trunk/mm/hwpoison-inject.c
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,13 @@ static int pfn_inject_init(void)
if (!dentry)
goto fail;

#ifdef CONFIG_CGROUP_MEM_RES_CTLR_SWAP
dentry = debugfs_create_u64("corrupt-filter-memcg", 0600,
hwpoison_dir, &hwpoison_filter_memcg);
if (!dentry)
goto fail;
#endif

return 0;
fail:
pfn_inject_exit();
Expand Down
1 change: 1 addition & 0 deletions trunk/mm/internal.h
Original file line number Diff line number Diff line change
Expand Up @@ -257,3 +257,4 @@ extern u32 hwpoison_filter_dev_major;
extern u32 hwpoison_filter_dev_minor;
extern u64 hwpoison_filter_flags_mask;
extern u64 hwpoison_filter_flags_value;
extern u64 hwpoison_filter_memcg;
46 changes: 46 additions & 0 deletions trunk/mm/memory-failure.c
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,49 @@ static int hwpoison_filter_flags(struct page *p)
return -EINVAL;
}

/*
* This allows stress tests to limit test scope to a collection of tasks
* by putting them under some memcg. This prevents killing unrelated/important
* processes such as /sbin/init. Note that the target task may share clean
* pages with init (eg. libc text), which is harmless. If the target task
* share _dirty_ pages with another task B, the test scheme must make sure B
* is also included in the memcg. At last, due to race conditions this filter
* can only guarantee that the page either belongs to the memcg tasks, or is
* a freed page.
*/
#ifdef CONFIG_CGROUP_MEM_RES_CTLR_SWAP
u64 hwpoison_filter_memcg;
EXPORT_SYMBOL_GPL(hwpoison_filter_memcg);
static int hwpoison_filter_task(struct page *p)
{
struct mem_cgroup *mem;
struct cgroup_subsys_state *css;
unsigned long ino;

if (!hwpoison_filter_memcg)
return 0;

mem = try_get_mem_cgroup_from_page(p);
if (!mem)
return -EINVAL;

css = mem_cgroup_css(mem);
/* root_mem_cgroup has NULL dentries */
if (!css->cgroup->dentry)
return -EINVAL;

ino = css->cgroup->dentry->d_inode->i_ino;
css_put(css);

if (ino != hwpoison_filter_memcg)
return -EINVAL;

return 0;
}
#else
static int hwpoison_filter_task(struct page *p) { return 0; }
#endif

int hwpoison_filter(struct page *p)
{
if (hwpoison_filter_dev(p))
Expand All @@ -108,6 +151,9 @@ int hwpoison_filter(struct page *p)
if (hwpoison_filter_flags(p))
return -EINVAL;

if (hwpoison_filter_task(p))
return -EINVAL;

return 0;
}
EXPORT_SYMBOL_GPL(hwpoison_filter);
Expand Down

0 comments on commit f0237ab

Please sign in to comment.