[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] 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
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |