Messages in this thread Patch in this message | | | From | KOSAKI Motohiro <> | Subject | [PATCH 1/2] memcg: mem_cgroup->prev_priority protected by lock. | Date | Tue, 2 Dec 2008 16:11:07 +0900 (JST) |
| |
Currently, mem_cgroup doesn't have own lock and almost its member doesn't need. (e.g. info is protected by zone lock, 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 addision, we plan to reuse this lock for another member. Then "misc_lock" name is better than "prev_priority_lock".
Signed-off-by: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com> --- mm/memcontrol.c | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-)
Index: b/mm/memcontrol.c =================================================================== --- a/mm/memcontrol.c +++ b/mm/memcontrol.c @@ -142,6 +142,13 @@ struct mem_cgroup { */ struct mem_cgroup_lru_info info; + /* + Almost mem_cgroup member doesn't need lock. + (e.g. info is protected by zone lock, stat is per cpu variable) + However, rest few member need explict lock. + */ + spinlock_t misc_lock; + int prev_priority; /* for recording reclaim priority */ /* @@ -393,18 +400,28 @@ int mem_cgroup_calc_mapped_ratio(struct */ int mem_cgroup_get_reclaim_priority(struct mem_cgroup *mem) { - return mem->prev_priority; + int prev_priority; + + spin_lock(&mem->misc_lock); + prev_priority = mem->prev_priority; + spin_unlock(&mem->misc_lock); + + return prev_priority; } void mem_cgroup_note_reclaim_priority(struct mem_cgroup *mem, int priority) { + spin_lock(&mem->misc_lock); if (priority < mem->prev_priority) mem->prev_priority = priority; + spin_unlock(&mem->misc_lock); } void mem_cgroup_record_reclaim_priority(struct mem_cgroup *mem, int priority) { + spin_lock(&mem->misc_lock); mem->prev_priority = priority; + spin_unlock(&mem->misc_lock); } /* @@ -1967,6 +1984,7 @@ mem_cgroup_create(struct cgroup_subsys * } mem->last_scanned_child = NULL; + spin_lock_init(&mem->misc_lock); return &mem->css; free_out:
| |