On Mon, Jan 18, 2010 at 10:58:01AM +0200, Stephane Eranian wrote:
> +int hw_perf_group_sched_in(struct perf_event *leader,
> +            struct perf_cpu_context *cpuctx,
> +            struct perf_event_context *ctx, int cpu)
> +{
> +     struct cpu_hw_events *cpuc = &per_cpu(cpu_hw_events, cpu);
> +     struct perf_event *sub;
> +     int assign[X86_PMC_IDX_MAX];
> +     int n0, n1, ret;
> +
> +     /* n0 = total number of events */
> +     n0 = collect_events(cpuc, leader, true);
> +     if (n0 < 0)
> +             return n0;
> +
> +     ret = x86_schedule_events(cpuc, n0, assign);
> +     if (ret)
> +             return ret;
> +
> +     ret = x86_event_sched_in(leader, cpuctx, cpu);
> +     if (ret)
> +             return ret;
> +
> +     n1 = 1;
> +     list_for_each_entry(sub, &leader->sibling_list, group_entry) {
> +             if (sub->state != PERF_EVENT_STATE_OFF) {
> +                     ret = x86_event_sched_in(sub, cpuctx, cpu);
> +                     if (ret)
> +                             goto undo;
> +                     ++n1;
> +             }
> +     }
> +     /*
> +      * copy new assignment, now we know it is possible
> +      * will be used by hw_perf_enable()
> +      */
> +     memcpy(cpuc->assign, assign, n0*sizeof(int));
> +
> +     cpuc->n_events  = n0;
> +     cpuc->n_added   = n1;
> +     ctx->nr_active += n1;
> +
> +     /*
> +      * 1 means successful and events are active
> +      * This is not quite true because we defer
> +      * actual activation until hw_perf_enable() but
> +      * this way we* ensure caller won't try to enable
> +      * individual events
> +      */
> +     return 1;
> +undo:
> +     x86_event_sched_out(leader, cpuctx, cpu);
> +     n0  = 1;
> +     list_for_each_entry(sub, &leader->sibling_list, group_entry) {
> +             if (sub->state == PERF_EVENT_STATE_ACTIVE) {
> +                     x86_event_sched_out(sub, cpuctx, cpu);
> +                     if (++n0 == n1)
> +                             break;
> +             }
> +     }
> +     return ret;



Looking at all these numerous places where this whole constraint
and ad hoc scheduling machine tries to catch up with what the
core can already do (handle non-x86 events, revert in failure,
first handle leader, then handle the rest, etc...), I wonder
if this hw_group_sched_in() based design is a good idea.

Shouldn't we actually use the core based pmu->enable(),disable()
model called from kernel/perf_event.c:event_sched_in(),
like every other events, where we can fill up the queue of hardware
events to be scheduled, and then call a hw_check_constraints()
when we finish a group scheduling?

I guess this would simplify all this code, avoid it to run through
the list of events, handle software events, revert partial enabled
by itself etc...

Hm?


------------------------------------------------------------------------------
Throughout its 18-year history, RSA Conference consistently attracts the
world's best and brightest in the field, creating opportunities for Conference
attendees to learn about information security's most important issues through
interactions with peers, luminaries and emerging and established companies.
http://p.sf.net/sfu/rsaconf-dev2dev
_______________________________________________
perfmon2-devel mailing list
perfmon2-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/perfmon2-devel

Reply via email to