On Thu, May 7, 2020 at 9:47 AM Michal Hocko <mhocko@xxxxxxxxxx> wrote: > > On Thu 07-05-20 09:33:01, Shakeel Butt wrote: > [...] > > @@ -2600,8 +2596,23 @@ static int try_charge(struct mem_cgroup *memcg, gfp_t gfp_mask, > > schedule_work(&memcg->high_work); > > break; > > } > > - current->memcg_nr_pages_over_high += batch; > > - set_notify_resume(current); > > + > > + if (gfpflags_allow_blocking(gfp_mask)) > > + reclaim_over_high(memcg, gfp_mask, batch); > > + > > + if (page_counter_read(&memcg->memory) <= > > + READ_ONCE(memcg->high)) > > + break; > > I am half way to a long weekend so bear with me. Shouldn't this be continue? The > parent memcg might be still in excess even the child got reclaimed, > right? > The reclaim_high() actually already does this walk up to the root and reclaim from ones who are still over their high limit. Though having 'continue' here is correct too. > > + /* > > + * The above reclaim might not be able to do much. Punt > > + * the high reclaim to return to userland if the current > > + * task shares the hierarchy. > > + */ > > + if (current->mm && mm_match_cgroup(current->mm, memcg)) { > > + current->memcg_nr_pages_over_high += batch; > > + set_notify_resume(current); > > + } else > > + schedule_work(&memcg->high_work); > > break; > > } > > } while ((memcg = parent_mem_cgroup(memcg))); > > -- > > 2.26.2.526.g744177e7f7-goog > > > > -- > Michal Hocko > SUSE Labs