mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-10 21:07:02 +09:00
Revert "cgroup: Disable IRQs while holding css_set_lock"
This reverts commit a47d369caf.
This commit is contained in:
124
kernel/cgroup.c
124
kernel/cgroup.c
@@ -784,8 +784,6 @@ static void put_css_set_locked(struct css_set *cset)
|
||||
|
||||
static void put_css_set(struct css_set *cset)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
/*
|
||||
* Ensure that the refcount doesn't hit zero while any readers
|
||||
* can see it. Similar to atomic_dec_and_lock(), but for an
|
||||
@@ -794,9 +792,9 @@ static void put_css_set(struct css_set *cset)
|
||||
if (atomic_add_unless(&cset->refcount, -1, 1))
|
||||
return;
|
||||
|
||||
spin_lock_irqsave(&css_set_lock, flags);
|
||||
spin_lock_bh(&css_set_lock);
|
||||
put_css_set_locked(cset);
|
||||
spin_unlock_irqrestore(&css_set_lock, flags);
|
||||
spin_unlock_bh(&css_set_lock);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -1019,11 +1017,11 @@ static struct css_set *find_css_set(struct css_set *old_cset,
|
||||
|
||||
/* First see if we already have a cgroup group that matches
|
||||
* the desired set */
|
||||
spin_lock_irq(&css_set_lock);
|
||||
spin_lock_bh(&css_set_lock);
|
||||
cset = find_existing_css_set(old_cset, cgrp, template);
|
||||
if (cset)
|
||||
get_css_set(cset);
|
||||
spin_unlock_irq(&css_set_lock);
|
||||
spin_unlock_bh(&css_set_lock);
|
||||
|
||||
if (cset)
|
||||
return cset;
|
||||
@@ -1051,7 +1049,7 @@ static struct css_set *find_css_set(struct css_set *old_cset,
|
||||
* find_existing_css_set() */
|
||||
memcpy(cset->subsys, template, sizeof(cset->subsys));
|
||||
|
||||
spin_lock_irq(&css_set_lock);
|
||||
spin_lock_bh(&css_set_lock);
|
||||
/* Add reference counts and links from the new css_set. */
|
||||
list_for_each_entry(link, &old_cset->cgrp_links, cgrp_link) {
|
||||
struct cgroup *c = link->cgrp;
|
||||
@@ -1077,7 +1075,7 @@ static struct css_set *find_css_set(struct css_set *old_cset,
|
||||
css_get(css);
|
||||
}
|
||||
|
||||
spin_unlock_irq(&css_set_lock);
|
||||
spin_unlock_bh(&css_set_lock);
|
||||
|
||||
return cset;
|
||||
}
|
||||
@@ -1141,7 +1139,7 @@ static void cgroup_destroy_root(struct cgroup_root *root)
|
||||
* Release all the links from cset_links to this hierarchy's
|
||||
* root cgroup
|
||||
*/
|
||||
spin_lock_irq(&css_set_lock);
|
||||
spin_lock_bh(&css_set_lock);
|
||||
|
||||
list_for_each_entry_safe(link, tmp_link, &cgrp->cset_links, cset_link) {
|
||||
list_del(&link->cset_link);
|
||||
@@ -1149,7 +1147,7 @@ static void cgroup_destroy_root(struct cgroup_root *root)
|
||||
kfree(link);
|
||||
}
|
||||
|
||||
spin_unlock_irq(&css_set_lock);
|
||||
spin_unlock_bh(&css_set_lock);
|
||||
|
||||
if (!list_empty(&root->root_list)) {
|
||||
list_del(&root->root_list);
|
||||
@@ -1553,11 +1551,11 @@ static int rebind_subsystems(struct cgroup_root *dst_root,
|
||||
ss->root = dst_root;
|
||||
css->cgroup = dcgrp;
|
||||
|
||||
spin_lock_irq(&css_set_lock);
|
||||
spin_lock_bh(&css_set_lock);
|
||||
hash_for_each(css_set_table, i, cset, hlist)
|
||||
list_move_tail(&cset->e_cset_node[ss->id],
|
||||
&dcgrp->e_csets[ss->id]);
|
||||
spin_unlock_irq(&css_set_lock);
|
||||
spin_unlock_bh(&css_set_lock);
|
||||
|
||||
src_root->subsys_mask &= ~(1 << ssid);
|
||||
scgrp->subtree_control &= ~(1 << ssid);
|
||||
@@ -1834,7 +1832,7 @@ static void cgroup_enable_task_cg_lists(void)
|
||||
{
|
||||
struct task_struct *p, *g;
|
||||
|
||||
spin_lock_irq(&css_set_lock);
|
||||
spin_lock_bh(&css_set_lock);
|
||||
|
||||
if (use_task_css_set_links)
|
||||
goto out_unlock;
|
||||
@@ -1859,12 +1857,8 @@ static void cgroup_enable_task_cg_lists(void)
|
||||
* entry won't be deleted though the process has exited.
|
||||
* Do it while holding siglock so that we don't end up
|
||||
* racing against cgroup_exit().
|
||||
*
|
||||
* Interrupts were already disabled while acquiring
|
||||
* the css_set_lock, so we do not need to disable it
|
||||
* again when acquiring the sighand->siglock here.
|
||||
*/
|
||||
spin_lock(&p->sighand->siglock);
|
||||
spin_lock_irq(&p->sighand->siglock);
|
||||
if (!(p->flags & PF_EXITING)) {
|
||||
struct css_set *cset = task_css_set(p);
|
||||
|
||||
@@ -1873,11 +1867,11 @@ static void cgroup_enable_task_cg_lists(void)
|
||||
list_add_tail(&p->cg_list, &cset->tasks);
|
||||
get_css_set(cset);
|
||||
}
|
||||
spin_unlock(&p->sighand->siglock);
|
||||
spin_unlock_irq(&p->sighand->siglock);
|
||||
} while_each_thread(g, p);
|
||||
read_unlock(&tasklist_lock);
|
||||
out_unlock:
|
||||
spin_unlock_irq(&css_set_lock);
|
||||
spin_unlock_bh(&css_set_lock);
|
||||
}
|
||||
|
||||
static void init_cgroup_housekeeping(struct cgroup *cgrp)
|
||||
@@ -1982,13 +1976,13 @@ static int cgroup_setup_root(struct cgroup_root *root, unsigned long ss_mask)
|
||||
* Link the root cgroup in this hierarchy into all the css_set
|
||||
* objects.
|
||||
*/
|
||||
spin_lock_irq(&css_set_lock);
|
||||
spin_lock_bh(&css_set_lock);
|
||||
hash_for_each(css_set_table, i, cset, hlist) {
|
||||
link_css_set(&tmp_links, cset, root_cgrp);
|
||||
if (css_set_populated(cset))
|
||||
cgroup_update_populated(root_cgrp, true);
|
||||
}
|
||||
spin_unlock_irq(&css_set_lock);
|
||||
spin_unlock_bh(&css_set_lock);
|
||||
|
||||
BUG_ON(!list_empty(&root_cgrp->self.children));
|
||||
BUG_ON(atomic_read(&root->nr_cgrps) != 1);
|
||||
@@ -2221,7 +2215,7 @@ char *task_cgroup_path(struct task_struct *task, char *buf, size_t buflen)
|
||||
char *path = NULL;
|
||||
|
||||
mutex_lock(&cgroup_mutex);
|
||||
spin_lock_irq(&css_set_lock);
|
||||
spin_lock_bh(&css_set_lock);
|
||||
|
||||
root = idr_get_next(&cgroup_hierarchy_idr, &hierarchy_id);
|
||||
|
||||
@@ -2234,7 +2228,7 @@ char *task_cgroup_path(struct task_struct *task, char *buf, size_t buflen)
|
||||
path = buf;
|
||||
}
|
||||
|
||||
spin_unlock_irq(&css_set_lock);
|
||||
spin_unlock_bh(&css_set_lock);
|
||||
mutex_unlock(&cgroup_mutex);
|
||||
return path;
|
||||
}
|
||||
@@ -2409,7 +2403,7 @@ static int cgroup_taskset_migrate(struct cgroup_taskset *tset,
|
||||
* the new cgroup. There are no failure cases after here, so this
|
||||
* is the commit point.
|
||||
*/
|
||||
spin_lock_irq(&css_set_lock);
|
||||
spin_lock_bh(&css_set_lock);
|
||||
list_for_each_entry(cset, &tset->src_csets, mg_node) {
|
||||
list_for_each_entry_safe(task, tmp_task, &cset->mg_tasks, cg_list) {
|
||||
struct css_set *from_cset = task_css_set(task);
|
||||
@@ -2420,7 +2414,7 @@ static int cgroup_taskset_migrate(struct cgroup_taskset *tset,
|
||||
put_css_set_locked(from_cset);
|
||||
}
|
||||
}
|
||||
spin_unlock_irq(&css_set_lock);
|
||||
spin_unlock_bh(&css_set_lock);
|
||||
|
||||
/*
|
||||
* Migration is committed, all target tasks are now on dst_csets.
|
||||
@@ -2449,13 +2443,13 @@ out_cancel_attach:
|
||||
}
|
||||
}
|
||||
out_release_tset:
|
||||
spin_lock_irq(&css_set_lock);
|
||||
spin_lock_bh(&css_set_lock);
|
||||
list_splice_init(&tset->dst_csets, &tset->src_csets);
|
||||
list_for_each_entry_safe(cset, tmp_cset, &tset->src_csets, mg_node) {
|
||||
list_splice_tail_init(&cset->mg_tasks, &cset->tasks);
|
||||
list_del_init(&cset->mg_node);
|
||||
}
|
||||
spin_unlock_irq(&css_set_lock);
|
||||
spin_unlock_bh(&css_set_lock);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -2472,14 +2466,14 @@ static void cgroup_migrate_finish(struct list_head *preloaded_csets)
|
||||
|
||||
lockdep_assert_held(&cgroup_mutex);
|
||||
|
||||
spin_lock_irq(&css_set_lock);
|
||||
spin_lock_bh(&css_set_lock);
|
||||
list_for_each_entry_safe(cset, tmp_cset, preloaded_csets, mg_preload_node) {
|
||||
cset->mg_src_cgrp = NULL;
|
||||
cset->mg_dst_cset = NULL;
|
||||
list_del_init(&cset->mg_preload_node);
|
||||
put_css_set_locked(cset);
|
||||
}
|
||||
spin_unlock_irq(&css_set_lock);
|
||||
spin_unlock_bh(&css_set_lock);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -2629,7 +2623,7 @@ static int cgroup_migrate(struct task_struct *leader, bool threadgroup,
|
||||
* already PF_EXITING could be freed from underneath us unless we
|
||||
* take an rcu_read_lock.
|
||||
*/
|
||||
spin_lock_irq(&css_set_lock);
|
||||
spin_lock_bh(&css_set_lock);
|
||||
rcu_read_lock();
|
||||
task = leader;
|
||||
do {
|
||||
@@ -2638,7 +2632,7 @@ static int cgroup_migrate(struct task_struct *leader, bool threadgroup,
|
||||
break;
|
||||
} while_each_thread(leader, task);
|
||||
rcu_read_unlock();
|
||||
spin_unlock_irq(&css_set_lock);
|
||||
spin_unlock_bh(&css_set_lock);
|
||||
|
||||
return cgroup_taskset_migrate(&tset, cgrp);
|
||||
}
|
||||
@@ -2659,7 +2653,7 @@ static int cgroup_attach_task(struct cgroup *dst_cgrp,
|
||||
int ret;
|
||||
|
||||
/* look up all src csets */
|
||||
spin_lock_irq(&css_set_lock);
|
||||
spin_lock_bh(&css_set_lock);
|
||||
rcu_read_lock();
|
||||
task = leader;
|
||||
do {
|
||||
@@ -2669,7 +2663,7 @@ static int cgroup_attach_task(struct cgroup *dst_cgrp,
|
||||
break;
|
||||
} while_each_thread(leader, task);
|
||||
rcu_read_unlock();
|
||||
spin_unlock_irq(&css_set_lock);
|
||||
spin_unlock_bh(&css_set_lock);
|
||||
|
||||
/* prepare dst csets and commit */
|
||||
ret = cgroup_migrate_prepare_dst(dst_cgrp, &preloaded_csets);
|
||||
@@ -2703,9 +2697,9 @@ static int cgroup_procs_write_permission(struct task_struct *task,
|
||||
struct cgroup *cgrp;
|
||||
struct inode *inode;
|
||||
|
||||
spin_lock_irq(&css_set_lock);
|
||||
spin_lock_bh(&css_set_lock);
|
||||
cgrp = task_cgroup_from_root(task, &cgrp_dfl_root);
|
||||
spin_unlock_irq(&css_set_lock);
|
||||
spin_unlock_bh(&css_set_lock);
|
||||
|
||||
while (!cgroup_is_descendant(dst_cgrp, cgrp))
|
||||
cgrp = cgroup_parent(cgrp);
|
||||
@@ -2807,9 +2801,9 @@ int cgroup_attach_task_all(struct task_struct *from, struct task_struct *tsk)
|
||||
if (root == &cgrp_dfl_root)
|
||||
continue;
|
||||
|
||||
spin_lock_irq(&css_set_lock);
|
||||
spin_lock_bh(&css_set_lock);
|
||||
from_cgrp = task_cgroup_from_root(from, root);
|
||||
spin_unlock_irq(&css_set_lock);
|
||||
spin_unlock_bh(&css_set_lock);
|
||||
|
||||
retval = cgroup_attach_task(from_cgrp, tsk, false);
|
||||
if (retval)
|
||||
@@ -2934,7 +2928,7 @@ static int cgroup_update_dfl_csses(struct cgroup *cgrp)
|
||||
percpu_down_write(&cgroup_threadgroup_rwsem);
|
||||
|
||||
/* look up all csses currently attached to @cgrp's subtree */
|
||||
spin_lock_irq(&css_set_lock);
|
||||
spin_lock_bh(&css_set_lock);
|
||||
css_for_each_descendant_pre(css, cgroup_css(cgrp, NULL)) {
|
||||
struct cgrp_cset_link *link;
|
||||
|
||||
@@ -2946,14 +2940,14 @@ static int cgroup_update_dfl_csses(struct cgroup *cgrp)
|
||||
cgroup_migrate_add_src(link->cset, cgrp,
|
||||
&preloaded_csets);
|
||||
}
|
||||
spin_unlock_irq(&css_set_lock);
|
||||
spin_unlock_bh(&css_set_lock);
|
||||
|
||||
/* NULL dst indicates self on default hierarchy */
|
||||
ret = cgroup_migrate_prepare_dst(NULL, &preloaded_csets);
|
||||
if (ret)
|
||||
goto out_finish;
|
||||
|
||||
spin_lock_irq(&css_set_lock);
|
||||
spin_lock_bh(&css_set_lock);
|
||||
list_for_each_entry(src_cset, &preloaded_csets, mg_preload_node) {
|
||||
struct task_struct *task, *ntask;
|
||||
|
||||
@@ -2965,7 +2959,7 @@ static int cgroup_update_dfl_csses(struct cgroup *cgrp)
|
||||
list_for_each_entry_safe(task, ntask, &src_cset->tasks, cg_list)
|
||||
cgroup_taskset_add(task, &tset);
|
||||
}
|
||||
spin_unlock_irq(&css_set_lock);
|
||||
spin_unlock_bh(&css_set_lock);
|
||||
|
||||
ret = cgroup_taskset_migrate(&tset, cgrp);
|
||||
out_finish:
|
||||
@@ -3648,10 +3642,10 @@ static int cgroup_task_count(const struct cgroup *cgrp)
|
||||
int count = 0;
|
||||
struct cgrp_cset_link *link;
|
||||
|
||||
spin_lock_irq(&css_set_lock);
|
||||
spin_lock_bh(&css_set_lock);
|
||||
list_for_each_entry(link, &cgrp->cset_links, cset_link)
|
||||
count += atomic_read(&link->cset->refcount);
|
||||
spin_unlock_irq(&css_set_lock);
|
||||
spin_unlock_bh(&css_set_lock);
|
||||
return count;
|
||||
}
|
||||
|
||||
@@ -3989,7 +3983,7 @@ void css_task_iter_start(struct cgroup_subsys_state *css,
|
||||
|
||||
memset(it, 0, sizeof(*it));
|
||||
|
||||
spin_lock_irq(&css_set_lock);
|
||||
spin_lock_bh(&css_set_lock);
|
||||
|
||||
it->ss = css->ss;
|
||||
|
||||
@@ -4002,7 +3996,7 @@ void css_task_iter_start(struct cgroup_subsys_state *css,
|
||||
|
||||
css_task_iter_advance_css_set(it);
|
||||
|
||||
spin_unlock_irq(&css_set_lock);
|
||||
spin_unlock_bh(&css_set_lock);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -4020,7 +4014,7 @@ struct task_struct *css_task_iter_next(struct css_task_iter *it)
|
||||
it->cur_task = NULL;
|
||||
}
|
||||
|
||||
spin_lock_irq(&css_set_lock);
|
||||
spin_lock_bh(&css_set_lock);
|
||||
|
||||
if (it->task_pos) {
|
||||
it->cur_task = list_entry(it->task_pos, struct task_struct,
|
||||
@@ -4029,7 +4023,7 @@ struct task_struct *css_task_iter_next(struct css_task_iter *it)
|
||||
css_task_iter_advance(it);
|
||||
}
|
||||
|
||||
spin_unlock_irq(&css_set_lock);
|
||||
spin_unlock_bh(&css_set_lock);
|
||||
|
||||
return it->cur_task;
|
||||
}
|
||||
@@ -4043,10 +4037,10 @@ struct task_struct *css_task_iter_next(struct css_task_iter *it)
|
||||
void css_task_iter_end(struct css_task_iter *it)
|
||||
{
|
||||
if (it->cur_cset) {
|
||||
spin_lock_irq(&css_set_lock);
|
||||
spin_lock_bh(&css_set_lock);
|
||||
list_del(&it->iters_node);
|
||||
put_css_set_locked(it->cur_cset);
|
||||
spin_unlock_irq(&css_set_lock);
|
||||
spin_unlock_bh(&css_set_lock);
|
||||
}
|
||||
|
||||
if (it->cur_task)
|
||||
@@ -4075,10 +4069,10 @@ int cgroup_transfer_tasks(struct cgroup *to, struct cgroup *from)
|
||||
mutex_lock(&cgroup_mutex);
|
||||
|
||||
/* all tasks in @from are being moved, all csets are source */
|
||||
spin_lock_irq(&css_set_lock);
|
||||
spin_lock_bh(&css_set_lock);
|
||||
list_for_each_entry(link, &from->cset_links, cset_link)
|
||||
cgroup_migrate_add_src(link->cset, to, &preloaded_csets);
|
||||
spin_unlock_irq(&css_set_lock);
|
||||
spin_unlock_bh(&css_set_lock);
|
||||
|
||||
ret = cgroup_migrate_prepare_dst(to, &preloaded_csets);
|
||||
if (ret)
|
||||
@@ -5183,10 +5177,10 @@ static int cgroup_destroy_locked(struct cgroup *cgrp)
|
||||
*/
|
||||
cgrp->self.flags &= ~CSS_ONLINE;
|
||||
|
||||
spin_lock_irq(&css_set_lock);
|
||||
spin_lock_bh(&css_set_lock);
|
||||
list_for_each_entry(link, &cgrp->cset_links, cset_link)
|
||||
link->cset->dead = true;
|
||||
spin_unlock_irq(&css_set_lock);
|
||||
spin_unlock_bh(&css_set_lock);
|
||||
|
||||
/* initiate massacre of all css's */
|
||||
for_each_css(css, ssid, cgrp)
|
||||
@@ -5445,7 +5439,7 @@ int proc_cgroup_show(struct seq_file *m, struct pid_namespace *ns,
|
||||
goto out;
|
||||
|
||||
mutex_lock(&cgroup_mutex);
|
||||
spin_lock_irq(&css_set_lock);
|
||||
spin_lock_bh(&css_set_lock);
|
||||
|
||||
for_each_root(root) {
|
||||
struct cgroup_subsys *ss;
|
||||
@@ -5497,7 +5491,7 @@ int proc_cgroup_show(struct seq_file *m, struct pid_namespace *ns,
|
||||
|
||||
retval = 0;
|
||||
out_unlock:
|
||||
spin_unlock_irq(&css_set_lock);
|
||||
spin_unlock_bh(&css_set_lock);
|
||||
mutex_unlock(&cgroup_mutex);
|
||||
kfree(buf);
|
||||
out:
|
||||
@@ -5658,13 +5652,13 @@ void cgroup_post_fork(struct task_struct *child,
|
||||
if (use_task_css_set_links) {
|
||||
struct css_set *cset;
|
||||
|
||||
spin_lock_irq(&css_set_lock);
|
||||
spin_lock_bh(&css_set_lock);
|
||||
cset = task_css_set(current);
|
||||
if (list_empty(&child->cg_list)) {
|
||||
get_css_set(cset);
|
||||
css_set_move_task(child, NULL, cset, false);
|
||||
}
|
||||
spin_unlock_irq(&css_set_lock);
|
||||
spin_unlock_bh(&css_set_lock);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -5708,9 +5702,9 @@ void cgroup_exit(struct task_struct *tsk)
|
||||
cset = task_css_set(tsk);
|
||||
|
||||
if (!list_empty(&tsk->cg_list)) {
|
||||
spin_lock_irq(&css_set_lock);
|
||||
spin_lock_bh(&css_set_lock);
|
||||
css_set_move_task(tsk, cset, NULL, false);
|
||||
spin_unlock_irq(&css_set_lock);
|
||||
spin_unlock_bh(&css_set_lock);
|
||||
} else {
|
||||
get_css_set(cset);
|
||||
}
|
||||
@@ -5776,9 +5770,7 @@ static void cgroup_release_agent(struct work_struct *work)
|
||||
if (!pathbuf || !agentbuf)
|
||||
goto out;
|
||||
|
||||
spin_lock_irq(&css_set_lock);
|
||||
path = cgroup_path(cgrp, pathbuf, PATH_MAX);
|
||||
spin_unlock_irq(&css_set_lock);
|
||||
if (!path)
|
||||
goto out;
|
||||
|
||||
@@ -5925,7 +5917,7 @@ static int current_css_set_cg_links_read(struct seq_file *seq, void *v)
|
||||
if (!name_buf)
|
||||
return -ENOMEM;
|
||||
|
||||
spin_lock_irq(&css_set_lock);
|
||||
spin_lock_bh(&css_set_lock);
|
||||
rcu_read_lock();
|
||||
cset = rcu_dereference(current->cgroups);
|
||||
list_for_each_entry(link, &cset->cgrp_links, cgrp_link) {
|
||||
@@ -5936,7 +5928,7 @@ static int current_css_set_cg_links_read(struct seq_file *seq, void *v)
|
||||
c->root->hierarchy_id, name_buf);
|
||||
}
|
||||
rcu_read_unlock();
|
||||
spin_unlock_irq(&css_set_lock);
|
||||
spin_unlock_bh(&css_set_lock);
|
||||
kfree(name_buf);
|
||||
return 0;
|
||||
}
|
||||
@@ -5947,7 +5939,7 @@ static int cgroup_css_links_read(struct seq_file *seq, void *v)
|
||||
struct cgroup_subsys_state *css = seq_css(seq);
|
||||
struct cgrp_cset_link *link;
|
||||
|
||||
spin_lock_irq(&css_set_lock);
|
||||
spin_lock_bh(&css_set_lock);
|
||||
list_for_each_entry(link, &css->cgroup->cset_links, cset_link) {
|
||||
struct css_set *cset = link->cset;
|
||||
struct task_struct *task;
|
||||
@@ -5970,7 +5962,7 @@ static int cgroup_css_links_read(struct seq_file *seq, void *v)
|
||||
overflow:
|
||||
seq_puts(seq, " ...\n");
|
||||
}
|
||||
spin_unlock_irq(&css_set_lock);
|
||||
spin_unlock_bh(&css_set_lock);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user