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:
parent
2fc0452470
commit
94a59fb36e
2 changed files with 3 additions and 18 deletions
|
@ -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)
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in a new issue