hwpoison: use page_cgroup_ino for filtering by memcg

Hwpoison allows to filter pages by memory cgroup ino.  Currently, it
calls try_get_mem_cgroup_from_page to obtain the cgroup from a page and
then its ino using cgroup_ino, but now we have a helper method for
that, page_cgroup_ino, so use it instead.

This patch also loosens the hwpoison memcg filter dependency rules - it
makes it depend on CONFIG_MEMCG instead of CONFIG_MEMCG_SWAP, because
hwpoison memcg filter does not require anything (nor it used to) from
CONFIG_MEMCG_SWAP side.

Signed-off-by: Vladimir Davydov <vdavydov@parallels.com>
Reviewed-by: Andres Lagar-Cavilla <andreslc@google.com>
Cc: Minchan Kim <minchan@kernel.org>
Cc: Raghavendra K T <raghavendra.kt@linux.vnet.ibm.com>
Cc: Johannes Weiner <hannes@cmpxchg.org>
Cc: Michal Hocko <mhocko@suse.cz>
Cc: Greg Thelen <gthelen@google.com>
Cc: Michel Lespinasse <walken@google.com>
Cc: David Rientjes <rientjes@google.com>
Cc: Pavel Emelyanov <xemul@parallels.com>
Cc: Cyrill Gorcunov <gorcunov@openvz.org>
Cc: Jonathan Corbet <corbet@lwn.net>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
Vladimir Davydov 2015-09-09 15:35:31 -07:00 committed by Linus Torvalds
parent 2fc0452470
commit 94a59fb36e
2 changed files with 3 additions and 18 deletions

View file

@ -45,12 +45,9 @@ static int hwpoison_inject(void *data, u64 val)
/* /*
* do a racy check with elevated page count, to make sure PG_hwpoison * 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). * 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. * memory_failure() will redo the check reliably inside page lock.
*/ */
lock_page(hpage);
err = hwpoison_filter(hpage); err = hwpoison_filter(hpage);
unlock_page(hpage);
if (err) if (err)
goto put_out; goto put_out;
@ -126,7 +123,7 @@ static int pfn_inject_init(void)
if (!dentry) if (!dentry)
goto fail; goto fail;
#ifdef CONFIG_MEMCG_SWAP #ifdef CONFIG_MEMCG
dentry = debugfs_create_u64("corrupt-filter-memcg", 0600, dentry = debugfs_create_u64("corrupt-filter-memcg", 0600,
hwpoison_dir, &hwpoison_filter_memcg); hwpoison_dir, &hwpoison_filter_memcg);
if (!dentry) if (!dentry)

View file

@ -130,27 +130,15 @@ static int hwpoison_filter_flags(struct page *p)
* can only guarantee that the page either belongs to the memcg tasks, or is * can only guarantee that the page either belongs to the memcg tasks, or is
* a freed page. * a freed page.
*/ */
#ifdef CONFIG_MEMCG_SWAP #ifdef CONFIG_MEMCG
u64 hwpoison_filter_memcg; u64 hwpoison_filter_memcg;
EXPORT_SYMBOL_GPL(hwpoison_filter_memcg); EXPORT_SYMBOL_GPL(hwpoison_filter_memcg);
static int hwpoison_filter_task(struct page *p) static int hwpoison_filter_task(struct page *p)
{ {
struct mem_cgroup *mem;
struct cgroup_subsys_state *css;
unsigned long ino;
if (!hwpoison_filter_memcg) if (!hwpoison_filter_memcg)
return 0; return 0;
mem = try_get_mem_cgroup_from_page(p); if (page_cgroup_ino(p) != hwpoison_filter_memcg)
if (!mem)
return -EINVAL;
css = &mem->css;
ino = cgroup_ino(css->cgroup);
css_put(css);
if (ino != hwpoison_filter_memcg)
return -EINVAL; return -EINVAL;
return 0; return 0;