From: Michal Hocko <mhocko@suse.com>
To: Tetsuo Handa <penguin-kernel@i-love.sakura.ne.jp>
Cc: Johannes Weiner <hannes@cmpxchg.org>,
Andrew Morton <akpm@linux-foundation.org>,
linux-mm <linux-mm@kvack.org>
Subject: Re: [PATCH] mm: memcontrol: fix potential oom_lock recursion deadlock
Date: Thu, 21 Jul 2022 10:01:36 +0200 [thread overview]
Message-ID: <YtkH4JhqTHrj0JEP@dhcp22.suse.cz> (raw)
In-Reply-To: <a154df77-10c0-fa44-7471-9e73b6b52a72@I-love.SAKURA.ne.jp>
On Thu 21-07-22 08:49:57, Tetsuo Handa wrote:
> syzbot is reporting fs_reclaim allocation with oom_lock held [1]. We
> must make sure that such allocation won't hit __alloc_pages_may_oom()
> path which will retry forever if oom_lock is already held.
>
> I choose GFP_ATOMIC than GFP_NOWAIT, for since global OOM situation will
> likely be avoided by killing some process in memcg, and memory will be
> released after printk(), trying a little hard will be acceptable.
Nope, this is not a proper fix. You are making memory.stat more likely
to fail.
An uncoditional GFP_KERNEL allocation is certainly not good but is there
any reason to not use GFP_NOIO instead?
Or even better. In an ideal world we won't allocate from here at
all. Can we pre-allocate that single page and re-use it for the oom
report?
---
diff --git a/mm/memcontrol.c b/mm/memcontrol.c
index abec50f31fe6..13483cb278bb 100644
--- a/mm/memcontrol.c
+++ b/mm/memcontrol.c
@@ -1460,14 +1460,12 @@ static inline unsigned long memcg_page_state_output(struct mem_cgroup *memcg,
return memcg_page_state(memcg, item) * memcg_page_state_unit(item);
}
-static char *memory_stat_format(struct mem_cgroup *memcg)
+void memory_stat_format(struct mem_cgroup *memcg, char *buf)
{
struct seq_buf s;
int i;
- seq_buf_init(&s, kmalloc(PAGE_SIZE, GFP_KERNEL), PAGE_SIZE);
- if (!s.buffer)
- return NULL;
+ seq_buf_init(&s, buf, PAGE_SIZE);
/*
* Provide statistics on the state of the memory subsystem as
@@ -1533,8 +1531,6 @@ static char *memory_stat_format(struct mem_cgroup *memcg)
/* The above should easily fit into one page */
WARN_ON_ONCE(seq_buf_has_overflowed(&s));
-
- return s.buffer;
}
#define K(x) ((x) << (PAGE_SHIFT-10))
@@ -1563,6 +1559,12 @@ void mem_cgroup_print_oom_context(struct mem_cgroup *memcg, struct task_struct *
rcu_read_unlock();
}
+/*
+ * preallocated buffer to collect memory stats for the oom situation.
+ * Usage protected by oom_lock
+ */
+char oombuf[PAGE_SIZE];
+
/**
* mem_cgroup_print_oom_meminfo: Print OOM memory information relevant to
* memory controller.
@@ -1570,7 +1572,7 @@ void mem_cgroup_print_oom_context(struct mem_cgroup *memcg, struct task_struct *
*/
void mem_cgroup_print_oom_meminfo(struct mem_cgroup *memcg)
{
- char *buf;
+ lockdep_assert_held(&oom_lock);
pr_info("memory: usage %llukB, limit %llukB, failcnt %lu\n",
K((u64)page_counter_read(&memcg->memory)),
@@ -1591,11 +1593,8 @@ void mem_cgroup_print_oom_meminfo(struct mem_cgroup *memcg)
pr_info("Memory cgroup stats for ");
pr_cont_cgroup_path(memcg->css.cgroup);
pr_cont(":");
- buf = memory_stat_format(memcg);
- if (!buf)
- return;
- pr_info("%s", buf);
- kfree(buf);
+ memory_stat_format(memcg, oombuf);
+ pr_info("%s", oombuf);
}
/*
@@ -6335,11 +6334,11 @@ static int memory_events_local_show(struct seq_file *m, void *v)
static int memory_stat_show(struct seq_file *m, void *v)
{
struct mem_cgroup *memcg = mem_cgroup_from_seq(m);
- char *buf;
+ char *buf = kmalloc(PAGE_SIZE, GFP_KERNEL);
- buf = memory_stat_format(memcg);
if (!buf)
return -ENOMEM;
+ memory_stat_format(memcg, buf);
seq_puts(m, buf);
kfree(buf);
return 0;
--
Michal Hocko
SUSE Labs
next prev parent reply other threads:[~2022-07-21 11:37 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-07-14 12:08 [syzbot] possible deadlock in start_this_handle (3) syzbot
2022-07-14 14:18 ` Jan Kara
2022-07-14 22:24 ` Tetsuo Handa
2022-07-15 1:39 ` Shakeel Butt
2022-07-15 1:53 ` Tetsuo Handa
2022-07-20 23:49 ` [PATCH] mm: memcontrol: fix potential oom_lock recursion deadlock Tetsuo Handa
2022-07-21 8:01 ` Michal Hocko [this message]
2022-07-22 0:46 ` [PATCH v2] " Tetsuo Handa
2022-07-22 7:19 ` Michal Hocko
2022-07-22 10:45 ` [PATCH v3] " Tetsuo Handa
2022-07-22 11:04 ` Michal Hocko
2022-07-22 11:12 ` Tetsuo Handa
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=YtkH4JhqTHrj0JEP@dhcp22.suse.cz \
--to=mhocko@suse.com \
--cc=akpm@linux-foundation.org \
--cc=hannes@cmpxchg.org \
--cc=linux-mm@kvack.org \
--cc=penguin-kernel@i-love.sakura.ne.jp \
/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.