aboutsummaryrefslogtreecommitdiffstats
path: root/mm/memcontrol.c
diff options
context:
space:
mode:
authorKOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>2009-01-07 21:08:23 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2009-01-08 11:31:08 -0500
commit2733c06ac864ed40b9dfbbd5270f3f16949bd4a1 (patch)
tree4847ad04739d6a25dede0e0329295c15cbb79dda /mm/memcontrol.c
parente72e2bd6747c7a5c432197b6614cf3a387e61a0e (diff)
memcg: protect prev_priority
Currently, mem_cgroup doesn't have own lock and almost its member doesn't need. (e.g. mem_cgroup->info is protected by zone lock, mem_cgroup->stat is per cpu variable) However, there is one explict exception. mem_cgroup->prev_priorit need lock, but doesn't protect. Luckly, this is NOT bug because prev_priority isn't used for current reclaim code. However, we plan to use prev_priority future again. Therefore, fixing is better. In addition, we plan to reuse this lock for another member. Then "reclaim_param_lock" name is better than "prev_priority_lock". Acked-by: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> Signed-off-by: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com> Cc: Balbir Singh <balbir@in.ibm.com> Cc: Daisuke Nishimura <nishimura@mxp.nes.nec.co.jp> Cc: Hugh Dickins <hugh@veritas.com> Cc: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'mm/memcontrol.c')
-rw-r--r--mm/memcontrol.c18
1 files changed, 17 insertions, 1 deletions
diff --git a/mm/memcontrol.c b/mm/memcontrol.c
index af28e128b74..027c0dd7a83 100644
--- a/mm/memcontrol.c
+++ b/mm/memcontrol.c
@@ -144,6 +144,11 @@ struct mem_cgroup {
144 */ 144 */
145 struct mem_cgroup_lru_info info; 145 struct mem_cgroup_lru_info info;
146 146
147 /*
148 protect against reclaim related member.
149 */
150 spinlock_t reclaim_param_lock;
151
147 int prev_priority; /* for recording reclaim priority */ 152 int prev_priority; /* for recording reclaim priority */
148 153
149 /* 154 /*
@@ -400,18 +405,28 @@ int mem_cgroup_calc_mapped_ratio(struct mem_cgroup *mem)
400 */ 405 */
401int mem_cgroup_get_reclaim_priority(struct mem_cgroup *mem) 406int mem_cgroup_get_reclaim_priority(struct mem_cgroup *mem)
402{ 407{
403 return mem->prev_priority; 408 int prev_priority;
409
410 spin_lock(&mem->reclaim_param_lock);
411 prev_priority = mem->prev_priority;
412 spin_unlock(&mem->reclaim_param_lock);
413
414 return prev_priority;
404} 415}
405 416
406void mem_cgroup_note_reclaim_priority(struct mem_cgroup *mem, int priority) 417void mem_cgroup_note_reclaim_priority(struct mem_cgroup *mem, int priority)
407{ 418{
419 spin_lock(&mem->reclaim_param_lock);
408 if (priority < mem->prev_priority) 420 if (priority < mem->prev_priority)
409 mem->prev_priority = priority; 421 mem->prev_priority = priority;
422 spin_unlock(&mem->reclaim_param_lock);
410} 423}
411 424
412void mem_cgroup_record_reclaim_priority(struct mem_cgroup *mem, int priority) 425void mem_cgroup_record_reclaim_priority(struct mem_cgroup *mem, int priority)
413{ 426{
427 spin_lock(&mem->reclaim_param_lock);
414 mem->prev_priority = priority; 428 mem->prev_priority = priority;
429 spin_unlock(&mem->reclaim_param_lock);
415} 430}
416 431
417int mem_cgroup_inactive_anon_is_low(struct mem_cgroup *memcg, struct zone *zone) 432int mem_cgroup_inactive_anon_is_low(struct mem_cgroup *memcg, struct zone *zone)
@@ -2076,6 +2091,7 @@ mem_cgroup_create(struct cgroup_subsys *ss, struct cgroup *cont)
2076 } 2091 }
2077 mem_cgroup_set_inactive_ratio(mem); 2092 mem_cgroup_set_inactive_ratio(mem);
2078 mem->last_scanned_child = NULL; 2093 mem->last_scanned_child = NULL;
2094 spin_lock_init(&mem->reclaim_param_lock);
2079 2095
2080 return &mem->css; 2096 return &mem->css;
2081free_out: 2097free_out: