On 30.08.2017 13:18, Alexander Shishkin wrote: > Alexey Budankov <alexey.budan...@linux.intel.com> writes: > >>>> Iterating cpu specific subtree like this: >>>> >>>> #define for_each_group_event(event, group, cpu, pmu, field) \ >>>> for (event = rb_entry_safe(group_first(group, cpu, pmu), \ >>>> typeof(*event), field); \ >>>> event && event->cpu == cpu && event->pmu == pmu; \ >>>> event = rb_entry_safe(rb_next(&event->field), \ >>>> typeof(*event), field)) >>> >>> Afaict, this assumes that you are also ordering on event->pmu, which >>> should be reflected in your _less function. And also assuming that >>> group_first() is doing the right thing. Can we see the code? >> >> I didn't do ordering by PMU for this patch set. Yet more I implemented >> groups_first() like this: > > Your iterator (quoted above) begs to differ.
What do you specifically mean? I am doing iterations like this: /* * Iterate event groups thru the whole tree. */ #define perf_event_groups_for_each(event, groups, node) \ for (event = rb_entry_safe(rb_first(&((groups)->tree)), \ typeof(*event), node); event; \ event = rb_entry_safe(rb_next(&event->node), \ typeof(*event), node)) /* * Iterate event groups with cpu == cpu_id. */ #define perf_event_groups_for_each_cpu(event, key, groups, node) \ for (event = perf_event_groups_first(groups, key); \ event && event->cpu == key; \ event = rb_entry_safe(rb_next(&event->node), \ typeof(*event), node)) > > Regards, > -- > Alex > Thanks, Alexey