On Thu, 11 Jun 2020 at 15:25, Michal Hocko mhocko@kernel.org wrote:
On Fri 29-05-20 11:49:20, Michal Hocko wrote:
On Fri 29-05-20 02:56:44, Chris Down wrote:
Yafang Shao writes:
Agreed. Even if e{low,min} might still have some rough edges I am completely puzzled how we could end up oom if none of the protection path triggers which the additional debugging should confirm. Maybe my debugging patch is incomplete or used incorrectly (maybe it would be esier to use printk rather than trace_printk?).
It would be really great if we could move forward. While the fix (which has been dropped from mmotm) is not super urgent I would really like to understand how it could hit the observed behavior. Can we double check that the debugging patch really doesn't trigger (e.g. s@trace_printk@printk in the first step)?
Please suggest to me the way to get more debug information by providing kernel debug patches and extra kernel configs.
I have applied your debug patch and tested on top on linux next 20200612 but did not find any printk output while running mkfs -t ext4 /drive test case.
I have checked it again but do not see any potential code path which would be affected by the patch yet not trigger any output. But another pair of eyes would be really great.
--- diff --git a/mm/vmscan.c b/mm/vmscan.c index b6d84326bdf2..d13ce7b02de4 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c @@ -2375,6 +2375,8 @@ static void get_scan_count(struct lruvec *lruvec, struct scan_control *sc, * sc->priority further than desirable. */ scan = max(scan, SWAP_CLUSTER_MAX); + + trace_printk("scan:%lu protection:%lu\n", scan, protection); } else { scan = lruvec_size; } @@ -2618,6 +2620,7 @@ static void shrink_node_memcgs(pg_data_t *pgdat, struct scan_control *sc)
switch (mem_cgroup_protected(target_memcg, memcg)) { case MEMCG_PROT_MIN: + trace_printk("under min:%lu emin:%lu\n", memcg->memory.min, memcg->memory.emin); /* * Hard protection. * If there is no reclaimable memory, OOM. @@ -2630,6 +2633,7 @@ static void shrink_node_memcgs(pg_data_t *pgdat, struct scan_control *sc) * there is an unprotected supply * of reclaimable memory from other cgroups. */ + trace_printk("under low:%lu elow:%lu\n", memcg->memory.low, memcg->memory.elow); if (!sc->memcg_low_reclaim) { sc->memcg_low_skipped = 1; continue;