On 17.11.11 at 15:04, Juergen Gross<juergen.gross@xxxxxxxxxxxxxx> wrote:
On 11/17/2011 02:52 PM, Keir Fraser wrote:
On 17/11/2011 13:30, "Jan Beulich"<JBeulich@xxxxxxxx> wrote:
which would now associate the else with the wrong (inner) if. One
possible solution that comes to mind would be
#define for_each_domain_in_cpupool(_d,_c) \
for_each_domain_in_cpupool (_d) \
if ((_d)->cpupool != (_c)) \
continue; \
else
but I think I had seen a more clever solution to this problem, but cannot
remember/locate it right now.
Given the gcc ({}) construction, you could do a double-loop:
for ( (_d) = rcu_dereference(domain_list); \
(_d) != NULL; \
({ while ((_d) = rcu_dereference((_d)->next_in_list != NULL)
if ((_d)->cpupool == (_c)) break;
(_d); }) )
A bit ugly. ;-) And I still worry about cpupool locking...
What about:
static inline struct domain *next_domain_in_cpupool(
struct domain *d, struct cpupool *c)
{
for (d = rcu_dereference(d->next_in_list); d&& d->cpupool != c;
d = rcu_dereference(d->next_in_list));
return d;
}
#define for_each_domain_in_cpupool(_d,_c) \
for ( (_d) = rcu_dereference(domain_list); \
(_d) != NULL; \
(_d) = next_domain_in_cpupool((_d), (_c)))