On Wed 28-11-12 14:27:01, Tejun Heo wrote:
> cgroup already tracks the hierarchy.  Follow cgroup->parent to find
> the parent and drop cpuset->parent.
> 
> Signed-off-by: Tejun Heo <[email protected]>

Yes, makes total sense.
Reviewed-by: Michal Hocko <[email protected]>

> ---
>  kernel/cpuset.c | 28 +++++++++++++++++-----------
>  1 file changed, 17 insertions(+), 11 deletions(-)
> 
> diff --git a/kernel/cpuset.c b/kernel/cpuset.c
> index 3a01730..d804415 100644
> --- a/kernel/cpuset.c
> +++ b/kernel/cpuset.c
> @@ -87,8 +87,6 @@ struct cpuset {
>       cpumask_var_t cpus_allowed;     /* CPUs allowed to tasks in cpuset */
>       nodemask_t mems_allowed;        /* Memory Nodes allowed to tasks */
>  
> -     struct cpuset *parent;          /* my parent */
> -
>       struct fmeter fmeter;           /* memory_pressure filter */
>  
>       /*
> @@ -120,6 +118,15 @@ static inline struct cpuset *task_cs(struct task_struct 
> *task)
>                           struct cpuset, css);
>  }
>  
> +static inline struct cpuset *parent_cs(const struct cpuset *cs)
> +{
> +     struct cgroup *pcgrp = cs->css.cgroup->parent;
> +
> +     if (pcgrp)
> +             return cgroup_cs(pcgrp);
> +     return NULL;
> +}
> +
>  #ifdef CONFIG_NUMA
>  static inline bool task_has_mempolicy(struct task_struct *task)
>  {
> @@ -323,7 +330,7 @@ static void guarantee_online_cpus(const struct cpuset *cs,
>                                 struct cpumask *pmask)
>  {
>       while (cs && !cpumask_intersects(cs->cpus_allowed, cpu_online_mask))
> -             cs = cs->parent;
> +             cs = parent_cs(cs);
>       if (cs)
>               cpumask_and(pmask, cs->cpus_allowed, cpu_online_mask);
>       else
> @@ -348,7 +355,7 @@ static void guarantee_online_mems(const struct cpuset 
> *cs, nodemask_t *pmask)
>  {
>       while (cs && !nodes_intersects(cs->mems_allowed,
>                                       node_states[N_HIGH_MEMORY]))
> -             cs = cs->parent;
> +             cs = parent_cs(cs);
>       if (cs)
>               nodes_and(*pmask, cs->mems_allowed,
>                                       node_states[N_HIGH_MEMORY]);
> @@ -461,7 +468,7 @@ static int validate_change(const struct cpuset *cur, 
> const struct cpuset *trial)
>       if (cur == &top_cpuset)
>               goto out;
>  
> -     par = cur->parent;
> +     par = parent_cs(cur);
>  
>       /* We must be a subset of our parent cpuset */
>       ret = -EACCES;
> @@ -1860,7 +1867,6 @@ static struct cgroup_subsys_state 
> *cpuset_css_alloc(struct cgroup *cont)
>       fmeter_init(&cs->fmeter);
>       INIT_WORK(&cs->hotplug_work, cpuset_propagate_hotplug_workfn);
>       cs->relax_domain_level = -1;
> -     cs->parent = cgroup_cs(cont->parent);
>  
>       return &cs->css;
>  }
> @@ -1868,7 +1874,7 @@ static struct cgroup_subsys_state 
> *cpuset_css_alloc(struct cgroup *cont)
>  static int cpuset_css_online(struct cgroup *cgrp)
>  {
>       struct cpuset *cs = cgroup_cs(cgrp);
> -     struct cpuset *parent = cs->parent;
> +     struct cpuset *parent = parent_cs(cs);
>       struct cpuset *tmp_cs;
>       struct cgroup *pos_cg;
>  
> @@ -2049,10 +2055,10 @@ static void remove_tasks_in_empty_cpuset(struct 
> cpuset *cs)
>        * Find its next-highest non-empty parent, (top cpuset
>        * has online cpus, so can't be empty).
>        */
> -     parent = cs->parent;
> +     parent = parent_cs(cs);
>       while (cpumask_empty(parent->cpus_allowed) ||
>                       nodes_empty(parent->mems_allowed))
> -             parent = parent->parent;
> +             parent = parent_cs(parent);
>  
>       move_member_tasks_to_cpuset(cs, parent);
>  }
> @@ -2353,8 +2359,8 @@ int cpuset_nodemask_valid_mems_allowed(nodemask_t 
> *nodemask)
>   */
>  static const struct cpuset *nearest_hardwall_ancestor(const struct cpuset 
> *cs)
>  {
> -     while (!(is_mem_exclusive(cs) || is_mem_hardwall(cs)) && cs->parent)
> -             cs = cs->parent;
> +     while (!(is_mem_exclusive(cs) || is_mem_hardwall(cs)) && parent_cs(cs))
> +             cs = parent_cs(cs);
>       return cs;
>  }
>  
> -- 
> 1.7.11.7
> 
> --
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to [email protected]
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at  http://www.tux.org/lkml/

-- 
Michal Hocko
SUSE Labs
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to