diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2012-03-22 12:04:48 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2012-03-22 12:04:48 -0400 |
commit | 95211279c5ad00a317c98221d7e4365e02f20836 (patch) | |
tree | 2ddc8625378d2915b8c96392f3cf6663b705ed55 /kernel/cgroup.c | |
parent | 5375871d432ae9fc581014ac117b96aaee3cd0c7 (diff) | |
parent | 12724850e8064f64b6223d26d78c0597c742c65a (diff) |
Merge branch 'akpm' (Andrew's patch-bomb)
Merge first batch of patches from Andrew Morton:
"A few misc things and all the MM queue"
* emailed from Andrew Morton <akpm@linux-foundation.org>: (92 commits)
memcg: avoid THP split in task migration
thp: add HPAGE_PMD_* definitions for !CONFIG_TRANSPARENT_HUGEPAGE
memcg: clean up existing move charge code
mm/memcontrol.c: remove unnecessary 'break' in mem_cgroup_read()
mm/memcontrol.c: remove redundant BUG_ON() in mem_cgroup_usage_unregister_event()
mm/memcontrol.c: s/stealed/stolen/
memcg: fix performance of mem_cgroup_begin_update_page_stat()
memcg: remove PCG_FILE_MAPPED
memcg: use new logic for page stat accounting
memcg: remove PCG_MOVE_LOCK flag from page_cgroup
memcg: simplify move_account() check
memcg: remove EXPORT_SYMBOL(mem_cgroup_update_page_stat)
memcg: kill dead prev_priority stubs
memcg: remove PCG_CACHE page_cgroup flag
memcg: let css_get_next() rely upon rcu_read_lock()
cgroup: revert ss_id_lock to spinlock
idr: make idr_get_next() good for rcu_read_lock()
memcg: remove unnecessary thp check in page stat accounting
memcg: remove redundant returns
memcg: enum lru_list lru
...
Diffstat (limited to 'kernel/cgroup.c')
-rw-r--r-- | kernel/cgroup.c | 19 |
1 files changed, 9 insertions, 10 deletions
diff --git a/kernel/cgroup.c b/kernel/cgroup.c index 1ece8e20fdb5..f4ea4b6f3cf1 100644 --- a/kernel/cgroup.c +++ b/kernel/cgroup.c | |||
@@ -4881,9 +4881,9 @@ void free_css_id(struct cgroup_subsys *ss, struct cgroup_subsys_state *css) | |||
4881 | 4881 | ||
4882 | rcu_assign_pointer(id->css, NULL); | 4882 | rcu_assign_pointer(id->css, NULL); |
4883 | rcu_assign_pointer(css->id, NULL); | 4883 | rcu_assign_pointer(css->id, NULL); |
4884 | write_lock(&ss->id_lock); | 4884 | spin_lock(&ss->id_lock); |
4885 | idr_remove(&ss->idr, id->id); | 4885 | idr_remove(&ss->idr, id->id); |
4886 | write_unlock(&ss->id_lock); | 4886 | spin_unlock(&ss->id_lock); |
4887 | kfree_rcu(id, rcu_head); | 4887 | kfree_rcu(id, rcu_head); |
4888 | } | 4888 | } |
4889 | EXPORT_SYMBOL_GPL(free_css_id); | 4889 | EXPORT_SYMBOL_GPL(free_css_id); |
@@ -4909,10 +4909,10 @@ static struct css_id *get_new_cssid(struct cgroup_subsys *ss, int depth) | |||
4909 | error = -ENOMEM; | 4909 | error = -ENOMEM; |
4910 | goto err_out; | 4910 | goto err_out; |
4911 | } | 4911 | } |
4912 | write_lock(&ss->id_lock); | 4912 | spin_lock(&ss->id_lock); |
4913 | /* Don't use 0. allocates an ID of 1-65535 */ | 4913 | /* Don't use 0. allocates an ID of 1-65535 */ |
4914 | error = idr_get_new_above(&ss->idr, newid, 1, &myid); | 4914 | error = idr_get_new_above(&ss->idr, newid, 1, &myid); |
4915 | write_unlock(&ss->id_lock); | 4915 | spin_unlock(&ss->id_lock); |
4916 | 4916 | ||
4917 | /* Returns error when there are no free spaces for new ID.*/ | 4917 | /* Returns error when there are no free spaces for new ID.*/ |
4918 | if (error) { | 4918 | if (error) { |
@@ -4927,9 +4927,9 @@ static struct css_id *get_new_cssid(struct cgroup_subsys *ss, int depth) | |||
4927 | return newid; | 4927 | return newid; |
4928 | remove_idr: | 4928 | remove_idr: |
4929 | error = -ENOSPC; | 4929 | error = -ENOSPC; |
4930 | write_lock(&ss->id_lock); | 4930 | spin_lock(&ss->id_lock); |
4931 | idr_remove(&ss->idr, myid); | 4931 | idr_remove(&ss->idr, myid); |
4932 | write_unlock(&ss->id_lock); | 4932 | spin_unlock(&ss->id_lock); |
4933 | err_out: | 4933 | err_out: |
4934 | kfree(newid); | 4934 | kfree(newid); |
4935 | return ERR_PTR(error); | 4935 | return ERR_PTR(error); |
@@ -4941,7 +4941,7 @@ static int __init_or_module cgroup_init_idr(struct cgroup_subsys *ss, | |||
4941 | { | 4941 | { |
4942 | struct css_id *newid; | 4942 | struct css_id *newid; |
4943 | 4943 | ||
4944 | rwlock_init(&ss->id_lock); | 4944 | spin_lock_init(&ss->id_lock); |
4945 | idr_init(&ss->idr); | 4945 | idr_init(&ss->idr); |
4946 | 4946 | ||
4947 | newid = get_new_cssid(ss, 0); | 4947 | newid = get_new_cssid(ss, 0); |
@@ -5029,6 +5029,8 @@ css_get_next(struct cgroup_subsys *ss, int id, | |||
5029 | return NULL; | 5029 | return NULL; |
5030 | 5030 | ||
5031 | BUG_ON(!ss->use_id); | 5031 | BUG_ON(!ss->use_id); |
5032 | WARN_ON_ONCE(!rcu_read_lock_held()); | ||
5033 | |||
5032 | /* fill start point for scan */ | 5034 | /* fill start point for scan */ |
5033 | tmpid = id; | 5035 | tmpid = id; |
5034 | while (1) { | 5036 | while (1) { |
@@ -5036,10 +5038,7 @@ css_get_next(struct cgroup_subsys *ss, int id, | |||
5036 | * scan next entry from bitmap(tree), tmpid is updated after | 5038 | * scan next entry from bitmap(tree), tmpid is updated after |
5037 | * idr_get_next(). | 5039 | * idr_get_next(). |
5038 | */ | 5040 | */ |
5039 | read_lock(&ss->id_lock); | ||
5040 | tmp = idr_get_next(&ss->idr, &tmpid); | 5041 | tmp = idr_get_next(&ss->idr, &tmpid); |
5041 | read_unlock(&ss->id_lock); | ||
5042 | |||
5043 | if (!tmp) | 5042 | if (!tmp) |
5044 | break; | 5043 | break; |
5045 | if (tmp->depth >= depth && tmp->stack[depth] == rootid) { | 5044 | if (tmp->depth >= depth && tmp->stack[depth] == rootid) { |