| From foo@baz Tue Mar 12 09:27:32 PDT 2019 |
| From: "Peter Zijlstra (Intel)" <peterz@infradead.org> |
| Date: Tue, 5 Mar 2019 22:23:16 +0100 |
| Subject: perf/x86/intel: Generalize dynamic constraint creation |
| |
| From: "Peter Zijlstra (Intel)" <peterz@infradead.org> |
| |
| commit 11f8b2d65ca9029591c8df26bb6bd063c312b7fe upstream |
| |
| Such that we can re-use it. |
| |
| Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> |
| Signed-off-by: Thomas Gleixner <tglx@linutronix.de> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| arch/x86/events/intel/core.c | 51 +++++++++++++++++++++++++------------------ |
| 1 file changed, 30 insertions(+), 21 deletions(-) |
| |
| --- a/arch/x86/events/intel/core.c |
| +++ b/arch/x86/events/intel/core.c |
| @@ -2653,6 +2653,35 @@ intel_stop_scheduling(struct cpu_hw_even |
| } |
| |
| static struct event_constraint * |
| +dyn_constraint(struct cpu_hw_events *cpuc, struct event_constraint *c, int idx) |
| +{ |
| + WARN_ON_ONCE(!cpuc->constraint_list); |
| + |
| + if (!(c->flags & PERF_X86_EVENT_DYNAMIC)) { |
| + struct event_constraint *cx; |
| + |
| + /* |
| + * grab pre-allocated constraint entry |
| + */ |
| + cx = &cpuc->constraint_list[idx]; |
| + |
| + /* |
| + * initialize dynamic constraint |
| + * with static constraint |
| + */ |
| + *cx = *c; |
| + |
| + /* |
| + * mark constraint as dynamic |
| + */ |
| + cx->flags |= PERF_X86_EVENT_DYNAMIC; |
| + c = cx; |
| + } |
| + |
| + return c; |
| +} |
| + |
| +static struct event_constraint * |
| intel_get_excl_constraints(struct cpu_hw_events *cpuc, struct perf_event *event, |
| int idx, struct event_constraint *c) |
| { |
| @@ -2682,27 +2711,7 @@ intel_get_excl_constraints(struct cpu_hw |
| * only needed when constraint has not yet |
| * been cloned (marked dynamic) |
| */ |
| - if (!(c->flags & PERF_X86_EVENT_DYNAMIC)) { |
| - struct event_constraint *cx; |
| - |
| - /* |
| - * grab pre-allocated constraint entry |
| - */ |
| - cx = &cpuc->constraint_list[idx]; |
| - |
| - /* |
| - * initialize dynamic constraint |
| - * with static constraint |
| - */ |
| - *cx = *c; |
| - |
| - /* |
| - * mark constraint as dynamic, so we |
| - * can free it later on |
| - */ |
| - cx->flags |= PERF_X86_EVENT_DYNAMIC; |
| - c = cx; |
| - } |
| + c = dyn_constraint(cpuc, c, idx); |
| |
| /* |
| * From here on, the constraint is dynamic. |