On Wed, Feb 28, 2018 at 13:40:15 -0800, Richard Henderson wrote: > On 02/26/2018 09:39 PM, Emilio G. Cota wrote: > > +/* list iterators for lists of tagged pointers in TranslationBlock */ > > +#define TB_FOR_EACH_TAGGED(head, tb, n, field) \ > > + for (n = (head) & 1, \ > > + tb = (TranslationBlock *)((head) & ~1); \ > > + tb; \ > > + tb = (TranslationBlock *)tb->field[n], \ > > + n = (uintptr_t)tb & 1, \ > > + tb = (TranslationBlock *)((uintptr_t)tb & ~1)) > > + > > +#define PAGE_FOR_EACH_TB(pagedesc, tb, n) \ > > + TB_FOR_EACH_TAGGED((pagedesc)->first_tb, tb, n, page_next) > > + > > I'm not sure I like the generalization of TB_FOR_EACH_TAGGED. Do you use it > for anything besides PAGE_FOR_EACH_TB?
Yes, see patch 13. I've added the following comment to the commit log: - Introduce the TB_FOR_EACH_TAGGED macro, and use it to define PAGE_FOR_EACH_TB, which improves readability. Note that TB_FOR_EACH_TAGGED will gain another user in a subsequent patch. > Weird indentation in the clauses. Is this any better? #define TB_FOR_EACH_TAGGED(head, tb, n, field) \ for (n = (head) & 1, tb = (TranslationBlock *)((head) & ~1); \ tb; tb = (TranslationBlock *)tb->field[n], n = (uintptr_t)tb & 1, \ tb = (TranslationBlock *)((uintptr_t)tb & ~1)) > Otherwise, > Reviewed-by: Richard Henderson <richard.hender...@linaro.org> Thanks, Emilio