|
@@ -103,7 +103,7 @@ void __weak hw_perf_event_setup_offline(int cpu) { barrier(); }
|
|
|
int __weak
|
|
|
hw_perf_group_sched_in(struct perf_event *group_leader,
|
|
|
struct perf_cpu_context *cpuctx,
|
|
|
- struct perf_event_context *ctx, int cpu)
|
|
|
+ struct perf_event_context *ctx)
|
|
|
{
|
|
|
return 0;
|
|
|
}
|
|
@@ -633,14 +633,13 @@ void perf_event_disable(struct perf_event *event)
|
|
|
static int
|
|
|
event_sched_in(struct perf_event *event,
|
|
|
struct perf_cpu_context *cpuctx,
|
|
|
- struct perf_event_context *ctx,
|
|
|
- int cpu)
|
|
|
+ struct perf_event_context *ctx)
|
|
|
{
|
|
|
if (event->state <= PERF_EVENT_STATE_OFF)
|
|
|
return 0;
|
|
|
|
|
|
event->state = PERF_EVENT_STATE_ACTIVE;
|
|
|
- event->oncpu = cpu; /* TODO: put 'cpu' into cpuctx->cpu */
|
|
|
+ event->oncpu = smp_processor_id();
|
|
|
/*
|
|
|
* The new state must be visible before we turn it on in the hardware:
|
|
|
*/
|
|
@@ -667,8 +666,7 @@ event_sched_in(struct perf_event *event,
|
|
|
static int
|
|
|
group_sched_in(struct perf_event *group_event,
|
|
|
struct perf_cpu_context *cpuctx,
|
|
|
- struct perf_event_context *ctx,
|
|
|
- int cpu)
|
|
|
+ struct perf_event_context *ctx)
|
|
|
{
|
|
|
struct perf_event *event, *partial_group;
|
|
|
int ret;
|
|
@@ -676,18 +674,18 @@ group_sched_in(struct perf_event *group_event,
|
|
|
if (group_event->state == PERF_EVENT_STATE_OFF)
|
|
|
return 0;
|
|
|
|
|
|
- ret = hw_perf_group_sched_in(group_event, cpuctx, ctx, cpu);
|
|
|
+ ret = hw_perf_group_sched_in(group_event, cpuctx, ctx);
|
|
|
if (ret)
|
|
|
return ret < 0 ? ret : 0;
|
|
|
|
|
|
- if (event_sched_in(group_event, cpuctx, ctx, cpu))
|
|
|
+ if (event_sched_in(group_event, cpuctx, ctx))
|
|
|
return -EAGAIN;
|
|
|
|
|
|
/*
|
|
|
* Schedule in siblings as one group (if any):
|
|
|
*/
|
|
|
list_for_each_entry(event, &group_event->sibling_list, group_entry) {
|
|
|
- if (event_sched_in(event, cpuctx, ctx, cpu)) {
|
|
|
+ if (event_sched_in(event, cpuctx, ctx)) {
|
|
|
partial_group = event;
|
|
|
goto group_error;
|
|
|
}
|
|
@@ -761,7 +759,6 @@ static void __perf_install_in_context(void *info)
|
|
|
struct perf_event *event = info;
|
|
|
struct perf_event_context *ctx = event->ctx;
|
|
|
struct perf_event *leader = event->group_leader;
|
|
|
- int cpu = smp_processor_id();
|
|
|
int err;
|
|
|
|
|
|
/*
|
|
@@ -808,7 +805,7 @@ static void __perf_install_in_context(void *info)
|
|
|
if (!group_can_go_on(event, cpuctx, 1))
|
|
|
err = -EEXIST;
|
|
|
else
|
|
|
- err = event_sched_in(event, cpuctx, ctx, cpu);
|
|
|
+ err = event_sched_in(event, cpuctx, ctx);
|
|
|
|
|
|
if (err) {
|
|
|
/*
|
|
@@ -950,11 +947,9 @@ static void __perf_event_enable(void *info)
|
|
|
} else {
|
|
|
perf_disable();
|
|
|
if (event == leader)
|
|
|
- err = group_sched_in(event, cpuctx, ctx,
|
|
|
- smp_processor_id());
|
|
|
+ err = group_sched_in(event, cpuctx, ctx);
|
|
|
else
|
|
|
- err = event_sched_in(event, cpuctx, ctx,
|
|
|
- smp_processor_id());
|
|
|
+ err = event_sched_in(event, cpuctx, ctx);
|
|
|
perf_enable();
|
|
|
}
|
|
|
|
|
@@ -1281,19 +1276,18 @@ static void cpu_ctx_sched_out(struct perf_cpu_context *cpuctx,
|
|
|
|
|
|
static void
|
|
|
ctx_pinned_sched_in(struct perf_event_context *ctx,
|
|
|
- struct perf_cpu_context *cpuctx,
|
|
|
- int cpu)
|
|
|
+ struct perf_cpu_context *cpuctx)
|
|
|
{
|
|
|
struct perf_event *event;
|
|
|
|
|
|
list_for_each_entry(event, &ctx->pinned_groups, group_entry) {
|
|
|
if (event->state <= PERF_EVENT_STATE_OFF)
|
|
|
continue;
|
|
|
- if (event->cpu != -1 && event->cpu != cpu)
|
|
|
+ if (event->cpu != -1 && event->cpu != smp_processor_id())
|
|
|
continue;
|
|
|
|
|
|
if (group_can_go_on(event, cpuctx, 1))
|
|
|
- group_sched_in(event, cpuctx, ctx, cpu);
|
|
|
+ group_sched_in(event, cpuctx, ctx);
|
|
|
|
|
|
/*
|
|
|
* If this pinned group hasn't been scheduled,
|
|
@@ -1308,8 +1302,7 @@ ctx_pinned_sched_in(struct perf_event_context *ctx,
|
|
|
|
|
|
static void
|
|
|
ctx_flexible_sched_in(struct perf_event_context *ctx,
|
|
|
- struct perf_cpu_context *cpuctx,
|
|
|
- int cpu)
|
|
|
+ struct perf_cpu_context *cpuctx)
|
|
|
{
|
|
|
struct perf_event *event;
|
|
|
int can_add_hw = 1;
|
|
@@ -1322,11 +1315,11 @@ ctx_flexible_sched_in(struct perf_event_context *ctx,
|
|
|
* Listen to the 'cpu' scheduling filter constraint
|
|
|
* of events:
|
|
|
*/
|
|
|
- if (event->cpu != -1 && event->cpu != cpu)
|
|
|
+ if (event->cpu != -1 && event->cpu != smp_processor_id())
|
|
|
continue;
|
|
|
|
|
|
if (group_can_go_on(event, cpuctx, can_add_hw))
|
|
|
- if (group_sched_in(event, cpuctx, ctx, cpu))
|
|
|
+ if (group_sched_in(event, cpuctx, ctx))
|
|
|
can_add_hw = 0;
|
|
|
}
|
|
|
}
|
|
@@ -1336,8 +1329,6 @@ ctx_sched_in(struct perf_event_context *ctx,
|
|
|
struct perf_cpu_context *cpuctx,
|
|
|
enum event_type_t event_type)
|
|
|
{
|
|
|
- int cpu = smp_processor_id();
|
|
|
-
|
|
|
raw_spin_lock(&ctx->lock);
|
|
|
ctx->is_active = 1;
|
|
|
if (likely(!ctx->nr_events))
|
|
@@ -1352,11 +1343,11 @@ ctx_sched_in(struct perf_event_context *ctx,
|
|
|
* in order to give them the best chance of going on.
|
|
|
*/
|
|
|
if (event_type & EVENT_PINNED)
|
|
|
- ctx_pinned_sched_in(ctx, cpuctx, cpu);
|
|
|
+ ctx_pinned_sched_in(ctx, cpuctx);
|
|
|
|
|
|
/* Then walk through the lower prio flexible groups */
|
|
|
if (event_type & EVENT_FLEXIBLE)
|
|
|
- ctx_flexible_sched_in(ctx, cpuctx, cpu);
|
|
|
+ ctx_flexible_sched_in(ctx, cpuctx);
|
|
|
|
|
|
perf_enable();
|
|
|
out:
|