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 <[email protected]>
Thanks,
Emilio