Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=b450129554213a4d4c5932f8a293646c029e1b0a
Commit:     b450129554213a4d4c5932f8a293646c029e1b0a
Parent:     c8d9c90c7ece28259436476a016cdecd25dccf2c
Author:     Paul Jackson <[EMAIL PROTECTED]>
AuthorDate: Thu Feb 7 00:14:47 2008 -0800
Committer:  Linus Torvalds <[EMAIL PROTECTED]>
CommitDate: Thu Feb 7 08:42:22 2008 -0800

    hotplug cpu move tasks in empty cpusets - refinements
    
    - Narrow the scope of callback_mutex in scan_for_empty_cpusets().
    
    - Avoid rewriting the cpus, mems of cpusets except when it is likely that
      we'll be changing them.
    
    - Have remove_tasks_in_empty_cpuset() also check for empty mems.
    
    Signed-off-by: Paul Jackson <[EMAIL PROTECTED]>
    Acked-by: Cliff Wickman <[EMAIL PROTECTED]>
    Cc: David Rientjes <[EMAIL PROTECTED]>
    Cc: Paul Menage <[EMAIL PROTECTED]>
    Signed-off-by: Andrew Morton <[EMAIL PROTECTED]>
    Signed-off-by: Linus Torvalds <[EMAIL PROTECTED]>
---
 kernel/cpuset.c |   21 +++++++++++++--------
 1 files changed, 13 insertions(+), 8 deletions(-)

diff --git a/kernel/cpuset.c b/kernel/cpuset.c
index 6868c1e..67b2bfe 100644
--- a/kernel/cpuset.c
+++ b/kernel/cpuset.c
@@ -1709,7 +1709,8 @@ static void remove_tasks_in_empty_cpuset(struct cpuset 
*cs)
         * has online cpus, so can't be empty).
         */
        parent = cs->parent;
-       while (cpus_empty(parent->cpus_allowed))
+       while (cpus_empty(parent->cpus_allowed) ||
+                       nodes_empty(parent->mems_allowed))
                parent = parent->parent;
 
        move_member_tasks_to_cpuset(cs, parent);
@@ -1741,7 +1742,6 @@ static void scan_for_empty_cpusets(const struct cpuset 
*root)
 
        list_add_tail((struct list_head *)&root->stack_list, &queue);
 
-       mutex_lock(&callback_mutex);
        while (!list_empty(&queue)) {
                cp = container_of(queue.next, struct cpuset, stack_list);
                list_del(queue.next);
@@ -1750,19 +1750,24 @@ static void scan_for_empty_cpusets(const struct cpuset 
*root)
                        list_add_tail(&child->stack_list, &queue);
                }
                cont = cp->css.cgroup;
+
+               /* Continue past cpusets with all cpus, mems online */
+               if (cpus_subset(cp->cpus_allowed, cpu_online_map) &&
+                   nodes_subset(cp->mems_allowed, node_states[N_HIGH_MEMORY]))
+                       continue;
+
                /* Remove offline cpus and mems from this cpuset. */
+               mutex_lock(&callback_mutex);
                cpus_and(cp->cpus_allowed, cp->cpus_allowed, cpu_online_map);
                nodes_and(cp->mems_allowed, cp->mems_allowed,
                                                node_states[N_HIGH_MEMORY]);
+               mutex_unlock(&callback_mutex);
+
+               /* Move tasks from the empty cpuset to a parent */
                if (cpus_empty(cp->cpus_allowed) ||
-                    nodes_empty(cp->mems_allowed)) {
-                       /* Move tasks from the empty cpuset to a parent */
-                       mutex_unlock(&callback_mutex);
+                    nodes_empty(cp->mems_allowed))
                        remove_tasks_in_empty_cpuset(cp);
-                       mutex_lock(&callback_mutex);
-               }
        }
-       mutex_unlock(&callback_mutex);
 }
 
 /*
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to