aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/cgroup.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2012-03-22 12:04:48 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2012-03-22 12:04:48 -0400
commit95211279c5ad00a317c98221d7e4365e02f20836 (patch)
tree2ddc8625378d2915b8c96392f3cf6663b705ed55 /kernel/cgroup.c
parent5375871d432ae9fc581014ac117b96aaee3cd0c7 (diff)
parent12724850e8064f64b6223d26d78c0597c742c65a (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.c19
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}
4889EXPORT_SYMBOL_GPL(free_css_id); 4889EXPORT_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;
4928remove_idr: 4928remove_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);
4933err_out: 4933err_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) {