|
|
|
|
|
|
|
|
|
|
xen-devel
Re: [Xen-devel] [PATCH] Avoid panic when adjusting sedf parameters
>>> 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)))
Same problem as with Keir's variant - you'd enter the loop body for
the first domain on the list regardless of its cpupool. But with a
first_domain_in_cpupool() counterpart this might be usable. Or, as
said in the other reply, putting a more complex construct in the
middle clause.
Jan
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|
|
|
|
|