cgroup: remove bind() method from cgroup_subsys.
[firefly-linux-kernel-4.4.55.git] / kernel / cpuset.c
index 4f9dfe43ecbd777d7bf03bed72c5da566e952b62..866d78ee7930c7224fec46e5b21f2ce3ac5f0957 100644 (file)
@@ -264,17 +264,6 @@ static struct cpuset top_cpuset = {
 static DEFINE_MUTEX(cpuset_mutex);
 static DEFINE_MUTEX(callback_mutex);
 
-/*
- * cpuset_buffer_lock protects both the cpuset_name and cpuset_nodelist
- * buffers.  They are statically allocated to prevent using excess stack
- * when calling cpuset_print_task_mems_allowed().
- */
-#define CPUSET_NAME_LEN                (128)
-#define        CPUSET_NODELIST_LEN     (256)
-static char cpuset_name[CPUSET_NAME_LEN];
-static char cpuset_nodelist[CPUSET_NODELIST_LEN];
-static DEFINE_SPINLOCK(cpuset_buffer_lock);
-
 /*
  * CPU / memory hotplug is handled asynchronously.
  */
@@ -2005,50 +1994,6 @@ int __init cpuset_init(void)
        return 0;
 }
 
-/**
- * cpuset_do_move_task - move a given task to another cpuset
- * @tsk: pointer to task_struct the task to move
- * @scan: struct cgroup_scanner contained in its struct cpuset_hotplug_scanner
- *
- * Called by cgroup_scan_tasks() for each task in a cgroup.
- * Return nonzero to stop the walk through the tasks.
- */
-static void cpuset_do_move_task(struct task_struct *tsk,
-                               struct cgroup_scanner *scan)
-{
-       struct cgroup *new_cgroup = scan->data;
-
-       cgroup_lock();
-       cgroup_attach_task(new_cgroup, tsk);
-       cgroup_unlock();
-}
-
-/**
- * move_member_tasks_to_cpuset - move tasks from one cpuset to another
- * @from: cpuset in which the tasks currently reside
- * @to: cpuset to which the tasks will be moved
- *
- * Called with cpuset_mutex held
- * callback_mutex must not be held, as cpuset_attach() will take it.
- *
- * The cgroup_scan_tasks() function will scan all the tasks in a cgroup,
- * calling callback functions for each.
- */
-static void move_member_tasks_to_cpuset(struct cpuset *from, struct cpuset *to)
-{
-       struct cgroup_scanner scan;
-
-       scan.cg = from->css.cgroup;
-       scan.test_task = NULL; /* select all tasks in cgroup */
-       scan.process_task = cpuset_do_move_task;
-       scan.heap = NULL;
-       scan.data = to->css.cgroup;
-
-       if (cgroup_scan_tasks(&scan))
-               printk(KERN_ERR "move_member_tasks_to_cpuset: "
-                               "cgroup_scan_tasks failed\n");
-}
-
 /*
  * If CPU and/or memory hotplug handlers, below, unplug any CPUs
  * or memory nodes, we need to walk over the cpuset hierarchy,
@@ -2069,7 +2014,12 @@ static void remove_tasks_in_empty_cpuset(struct cpuset *cs)
                        nodes_empty(parent->mems_allowed))
                parent = parent_cs(parent);
 
-       move_member_tasks_to_cpuset(cs, parent);
+       if (cgroup_transfer_tasks(parent->css.cgroup, cs->css.cgroup)) {
+               rcu_read_lock();
+               printk(KERN_ERR "cpuset: failed to transfer tasks out of empty cpuset %s\n",
+                      cgroup_name(cs->css.cgroup));
+               rcu_read_unlock();
+       }
 }
 
 /**
@@ -2592,6 +2542,8 @@ int cpuset_mems_allowed_intersects(const struct task_struct *tsk1,
        return nodes_intersects(tsk1->mems_allowed, tsk2->mems_allowed);
 }
 
+#define CPUSET_NODELIST_LEN    (256)
+
 /**
  * cpuset_print_task_mems_allowed - prints task's cpuset and mems_allowed
  * @task: pointer to task_struct of some task.
@@ -2602,25 +2554,22 @@ int cpuset_mems_allowed_intersects(const struct task_struct *tsk1,
  */
 void cpuset_print_task_mems_allowed(struct task_struct *tsk)
 {
-       struct dentry *dentry;
+        /* Statically allocated to prevent using excess stack. */
+       static char cpuset_nodelist[CPUSET_NODELIST_LEN];
+       static DEFINE_SPINLOCK(cpuset_buffer_lock);
 
-       dentry = task_cs(tsk)->css.cgroup->dentry;
-       spin_lock(&cpuset_buffer_lock);
+       struct cgroup *cgrp = task_cs(tsk)->css.cgroup;
 
-       if (!dentry) {
-               strcpy(cpuset_name, "/");
-       } else {
-               spin_lock(&dentry->d_lock);
-               strlcpy(cpuset_name, (const char *)dentry->d_name.name,
-                       CPUSET_NAME_LEN);
-               spin_unlock(&dentry->d_lock);
-       }
+       rcu_read_lock();
+       spin_lock(&cpuset_buffer_lock);
 
        nodelist_scnprintf(cpuset_nodelist, CPUSET_NODELIST_LEN,
                           tsk->mems_allowed);
        printk(KERN_INFO "%s cpuset=%s mems_allowed=%s\n",
-              tsk->comm, cpuset_name, cpuset_nodelist);
+              tsk->comm, cgroup_name(cgrp), cpuset_nodelist);
+
        spin_unlock(&cpuset_buffer_lock);
+       rcu_read_unlock();
 }
 
 /*