Message ID | d50e3bb513845d1f7816b94733576ce6f798682a.1612902157.git.tim.c.chen@linux.intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Soft limit memory management bug fixes | expand |
On Tue 09-02-21 12:29:45, Tim Chen wrote: > During soft limit memory reclaim, we will temporarily remove the target > mem cgroup from the cgroup soft limit tree. We then perform memory > reclaim, update the memory usage excess count and re-insert the mem > cgroup back into the mem cgroup soft limit tree according to the new > memory usage excess count. > > However, when memory reclaim failed for a maximum number of attempts > and we bail out of the reclaim loop, we forgot to put the target mem > cgroup chosen for next reclaim back to the soft limit tree. This prevented > pages in the mem cgroup from being reclaimed in the future even though > the mem cgroup exceeded its soft limit. Fix the logic and put the mem > cgroup back on the tree when page reclaim failed for the mem cgroup. > > Reviewed-by: Ying Huang <ying.huang@intel.com> > Signed-off-by: Tim Chen <tim.c.chen@linux.intel.com> It seems this goes all the way to when it has been introduced by 4e41695356fb ("memory controller: soft limit reclaim on contention"). Please add a Fixes tag pointing to the above one. While this looks like a rare event to happen because there should be some reclaimable memory usually. Acked-by: Michal Hocko <mhocko@suse.com> Thanks! > --- > mm/memcontrol.c | 6 +++++- > 1 file changed, 5 insertions(+), 1 deletion(-) > > diff --git a/mm/memcontrol.c b/mm/memcontrol.c > index ed5cc78a8dbf..a51bf90732cb 100644 > --- a/mm/memcontrol.c > +++ b/mm/memcontrol.c > @@ -3505,8 +3505,12 @@ unsigned long mem_cgroup_soft_limit_reclaim(pg_data_t *pgdat, int order, > loop > MEM_CGROUP_MAX_SOFT_LIMIT_RECLAIM_LOOPS)) > break; > } while (!nr_reclaimed); > - if (next_mz) > + if (next_mz) { > + spin_lock_irq(&mctz->lock); > + __mem_cgroup_insert_exceeded(next_mz, mctz, excess); > + spin_unlock_irq(&mctz->lock); > css_put(&next_mz->memcg->css); > + } > return nr_reclaimed; > } > > -- > 2.20.1
diff --git a/mm/memcontrol.c b/mm/memcontrol.c index ed5cc78a8dbf..a51bf90732cb 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c @@ -3505,8 +3505,12 @@ unsigned long mem_cgroup_soft_limit_reclaim(pg_data_t *pgdat, int order, loop > MEM_CGROUP_MAX_SOFT_LIMIT_RECLAIM_LOOPS)) break; } while (!nr_reclaimed); - if (next_mz) + if (next_mz) { + spin_lock_irq(&mctz->lock); + __mem_cgroup_insert_exceeded(next_mz, mctz, excess); + spin_unlock_irq(&mctz->lock); css_put(&next_mz->memcg->css); + } return nr_reclaimed; }