Skip to content

Commit

Permalink
vmscan, memcg: do softlimit reclaim also for targeted reclaim
Browse files Browse the repository at this point in the history
Soft reclaim has been done only for the global reclaim (both background
and direct).  Since "memcg: integrate soft reclaim tighter with zone
shrinking code" there is no reason for this limitation anymore as the soft
limit reclaim doesn't use any special code paths and it is a part of the
zone shrinking code which is used by both global and targeted reclaims.

From the semantic point of view it is natural to consider soft limit
before touching all groups in the hierarchy tree which is touching the
hard limit because soft limit tells us where to push back when there is a
memory pressure.  It is not important whether the pressure comes from the
limit or imbalanced zones.

This patch simply enables soft reclaim unconditionally in
mem_cgroup_should_soft_reclaim so it is enabled for both global and
targeted reclaim paths.  mem_cgroup_soft_reclaim_eligible needs to learn
about the root of the reclaim to know where to stop checking soft limit
state of parents up the hierarchy.  Say we have

A (over soft limit)
 \
  B (below s.l., hit the hard limit)
 / \
C   D (below s.l.)

B is the source of the outside memory pressure now for D but we shouldn't
soft reclaim it because it is behaving well under B subtree and we can
still reclaim from C (pressumably it is over the limit).
mem_cgroup_soft_reclaim_eligible should therefore stop climbing up the
hierarchy at B (root of the memory pressure).

Signed-off-by: Michal Hocko <[email protected]>
Reviewed-by: Glauber Costa <[email protected]>
Reviewed-by: Tejun Heo <[email protected]>
Cc: Balbir Singh <[email protected]>
Cc: Greg Thelen <[email protected]>
Cc: Hugh Dickins <[email protected]>
Cc: Johannes Weiner <[email protected]>
Cc: KAMEZAWA Hiroyuki <[email protected]>
Cc: KOSAKI Motohiro <[email protected]>
Cc: Michel Lespinasse <[email protected]>
Cc: Ying Han <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
  • Loading branch information
Michal Hocko authored and torvalds committed Sep 12, 2013
1 parent e883110 commit a5b7c87
Show file tree
Hide file tree
Showing 3 changed files with 15 additions and 9 deletions.
6 changes: 4 additions & 2 deletions include/linux/memcontrol.h
Original file line number Diff line number Diff line change
Expand Up @@ -180,7 +180,8 @@ static inline void mem_cgroup_dec_page_stat(struct page *page,
mem_cgroup_update_page_stat(page, idx, -1);
}

bool mem_cgroup_soft_reclaim_eligible(struct mem_cgroup *memcg);
bool mem_cgroup_soft_reclaim_eligible(struct mem_cgroup *memcg,
struct mem_cgroup *root);

void __mem_cgroup_count_vm_event(struct mm_struct *mm, enum vm_event_item idx);
static inline void mem_cgroup_count_vm_event(struct mm_struct *mm,
Expand Down Expand Up @@ -357,7 +358,8 @@ static inline void mem_cgroup_dec_page_stat(struct page *page,
}

static inline
bool mem_cgroup_soft_reclaim_eligible(struct mem_cgroup *memcg)
bool mem_cgroup_soft_reclaim_eligible(struct mem_cgroup *memcg,
struct mem_cgroup *root)
{
return false;
}
Expand Down
14 changes: 9 additions & 5 deletions mm/memcontrol.c
Original file line number Diff line number Diff line change
Expand Up @@ -1773,24 +1773,28 @@ int mem_cgroup_select_victim_node(struct mem_cgroup *memcg)
#endif

/*
* A group is eligible for the soft limit reclaim if it is
* a) is over its soft limit
* A group is eligible for the soft limit reclaim under the given root
* hierarchy if
* a) it is over its soft limit
* b) any parent up the hierarchy is over its soft limit
*/
bool mem_cgroup_soft_reclaim_eligible(struct mem_cgroup *memcg)
bool mem_cgroup_soft_reclaim_eligible(struct mem_cgroup *memcg,
struct mem_cgroup *root)
{
struct mem_cgroup *parent = memcg;

if (res_counter_soft_limit_excess(&memcg->res))
return true;

/*
* If any parent up the hierarchy is over its soft limit then we
* have to obey and reclaim from this group as well.
* If any parent up to the root in the hierarchy is over its soft limit
* then we have to obey and reclaim from this group as well.
*/
while((parent = parent_mem_cgroup(parent))) {
if (res_counter_soft_limit_excess(&parent->res))
return true;
if (parent == root)
break;
}

return false;
Expand Down
4 changes: 2 additions & 2 deletions mm/vmscan.c
Original file line number Diff line number Diff line change
Expand Up @@ -142,7 +142,7 @@ static bool global_reclaim(struct scan_control *sc)

static bool mem_cgroup_should_soft_reclaim(struct scan_control *sc)
{
return !mem_cgroup_disabled() && global_reclaim(sc);
return !mem_cgroup_disabled();
}
#else
static bool global_reclaim(struct scan_control *sc)
Expand Down Expand Up @@ -2161,7 +2161,7 @@ __shrink_zone(struct zone *zone, struct scan_control *sc, bool soft_reclaim)
struct lruvec *lruvec;

if (soft_reclaim &&
!mem_cgroup_soft_reclaim_eligible(memcg)) {
!mem_cgroup_soft_reclaim_eligible(memcg, root)) {
memcg = mem_cgroup_iter(root, memcg, &reclaim);
continue;
}
Expand Down

0 comments on commit a5b7c87

Please sign in to comment.