Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S966005Ab2EOSFA (ORCPT ); Tue, 15 May 2012 14:05:00 -0400 Received: from mail-pb0-f46.google.com ([209.85.160.46]:46591 "EHLO mail-pb0-f46.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932519Ab2EOSE5 (ORCPT ); Tue, 15 May 2012 14:04:57 -0400 Date: Tue, 15 May 2012 11:04:54 -0700 (PDT) From: David Rientjes X-X-Sender: rientjes@chino.kir.corp.google.com To: "Srivatsa S. Bhat" cc: a.p.zijlstra@chello.nl, mingo@kernel.org, pjt@google.com, paul@paulmenage.org, akpm@linux-foundation.org, rjw@sisk.pl, nacc@us.ibm.com, paulmck@linux.vnet.ibm.com, tglx@linutronix.de, seto.hidetoshi@jp.fujitsu.com, tj@kernel.org, mschmidt@redhat.com, berrange@redhat.com, nikunj@linux.vnet.ibm.com, vatsa@linux.vnet.ibm.com, liuj97@gmail.com, linux-kernel@vger.kernel.org, linux-pm@vger.kernel.org Subject: Re: [PATCH v3 1/5] cpusets, hotplug: Implement cpuset tree traversal in a helper function In-Reply-To: <4FB248DB.90000@linux.vnet.ibm.com> Message-ID: References: <20120513231325.3566.37740.stgit@srivatsabhat> <20120513231449.3566.70799.stgit@srivatsabhat> <4FB248DB.90000@linux.vnet.ibm.com> User-Agent: Alpine 2.00 (DEB 1167 2008-08-23) MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 1965 Lines: 59 On Tue, 15 May 2012, Srivatsa S. Bhat wrote: > >> diff --git a/kernel/cpuset.c b/kernel/cpuset.c > >> index 14f7070..23e5da6 100644 > >> --- a/kernel/cpuset.c > >> +++ b/kernel/cpuset.c > >> @@ -2000,6 +2000,23 @@ static void remove_tasks_in_empty_cpuset(struct cpuset *cs) > >> move_member_tasks_to_cpuset(cs, parent); > >> } > >> > >> +static struct cpuset *traverse_cpusets(struct list_head *queue) > > > > I suggest a different name for this, traverse_cpusets() doesn't imply that > > it will be returning struct cpuset *. > > > OK, I guess something like cpuset_next() or next_cpuset() should be fine? > The generic cgroup code seems to prefer cgroup_iter_next(), so cpuset_next() sounds appropriate. > >> +{ > >> + struct cpuset *cp; > >> + struct cpuset *child; /* scans child cpusets of cp */ > >> + struct cgroup *cont; > >> + > >> + cp = list_first_entry(queue, struct cpuset, stack_list); > >> + list_del(queue->next); > >> + list_for_each_entry(cont, &cp->css.cgroup->children, sibling) { > >> + child = cgroup_cs(cont); > >> + list_add_tail(&child->stack_list, queue); > >> + } > >> + > >> + return cp; > > > > Eek, what happens if queue is empty? It can't happen with only this > > patch applied, but since you're doing this to be used in other places then > > you'd need to check for list_empty(). > > > > > Actually, I didn't intend this to be used in other places because their > traversals are a little bit different anyway.. But yes, having a check for > list_empty() would be good. I'll add it and change the loop to something like: > > while (cpuset_next(&queue) { > ... > } > > Thanks for pointing this out! > Sounds good if cpuset_next() returns NULL for list_empty(). -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/