History

perf/x86: Add flags to event constraints

This patch adds a flags field to each event constraint. It can be used to store event specific features which can then later be used by scheduling code or low-level x86 code. The flags are propagated into event->hw.flags during the get_event_constraint() call. They are cleared during the put_event_constraint() call. This mechanism is going to be used by the PEBS-LL patches. It avoids defining yet another table to hold event specific information.

Stephane Eranian committed 13 years ago

Commit 9fac2cf1 parent 3a54aaa6 files · +16 −7Browse files

Unified · Split

6 files
  1. arch/x86/kernel/cpu/perf_event.c +1 −1
  2. arch/x86/kernel/cpu/perf_event.h +5 −3
  3. arch/x86/kernel/cpu/perf_event_intel.c +5 −1
  4. arch/x86/kernel/cpu/perf_event_intel_ds.c +3 −1
  5. arch/x86/kernel/cpu/perf_event_intel_uncore.c +1 −1
  6. include/linux/perf_event.h +1 −0
arch/x86/kernel/cpu/perf_event.c+1−1
@@ -1489,7 +1489,7 @@ static int __init init_hw_perf_events(void) · 1488 unmodified lines
1489 1489
1490 unconstrained = (struct event_constraint)1490 unconstrained = (struct event_constraint)
1491 __EVENT_CONSTRAINT(0, (1ULL << x86_pmu.num_counters) - 1,1491 __EVENT_CONSTRAINT(0, (1ULL << x86_pmu.num_counters) - 1,
1492 0, x86_pmu.num_counters, 0);1492 0, x86_pmu.num_counters, 0, 0);
1493 1493
1494 x86_pmu.attr_rdpmc = 1; /* enable userspace RDPMC usage by default */1494 x86_pmu.attr_rdpmc = 1; /* enable userspace RDPMC usage by default */
1495 x86_pmu_format_group.attrs = x86_pmu.format_attrs;1495 x86_pmu_format_group.attrs = x86_pmu.format_attrs;
arch/x86/kernel/cpu/perf_event.h+5−3
@@ -59,6 +59,7 @@ struct event_constraint { · 58 unmodified lines
59 u64 cmask;59 u64 cmask;
60 int weight;60 int weight;
61 int overlap;61 int overlap;
62 int flags;
62};63};
63 64
64struct amd_nb {65struct amd_nb {
@@ -170,16 +171,17 @@ struct cpu_hw_events { · 105 unmodified lines
170 void *kfree_on_online;171 void *kfree_on_online;
171};172};
172 173
173#define __EVENT_CONSTRAINT(c, n, m, w, o) {\174#define __EVENT_CONSTRAINT(c, n, m, w, o, f) {\
174 { .idxmsk64 = (n) }, \175 { .idxmsk64 = (n) }, \
175 .code = (c), \176 .code = (c), \
176 .cmask = (m), \177 .cmask = (m), \
177 .weight = (w), \178 .weight = (w), \
178 .overlap = (o), \179 .overlap = (o), \
180 .flags = f, \
179}181}
180 182
181#define EVENT_CONSTRAINT(c, n, m) \183#define EVENT_CONSTRAINT(c, n, m) \
182 __EVENT_CONSTRAINT(c, n, m, HWEIGHT(n), 0)184 __EVENT_CONSTRAINT(c, n, m, HWEIGHT(n), 0, 0)
183 185
184/*186/*
185 * The overlap flag marks event constraints with overlapping counter187 * The overlap flag marks event constraints with overlapping counter
@@ -203,7 +205,7 @@ struct cpu_hw_events { · 17 unmodified lines
203 * and its counter masks must be kept at a minimum.205 * and its counter masks must be kept at a minimum.
204 */206 */
205#define EVENT_CONSTRAINT_OVERLAP(c, n, m) \207#define EVENT_CONSTRAINT_OVERLAP(c, n, m) \
206 __EVENT_CONSTRAINT(c, n, m, HWEIGHT(n), 1)208 __EVENT_CONSTRAINT(c, n, m, HWEIGHT(n), 1, 0)
207 209
208/*210/*
209 * Constraint on the Event code.211 * Constraint on the Event code.
arch/x86/kernel/cpu/perf_event_intel.c+5−1
@@ -1392,8 +1392,11 @@ x86_get_event_constraints(struct cpu_hw_events *cpuc, struct perf_event *event) · 1391 unmodified lines
1392 1392
1393 if (x86_pmu.event_constraints) {1393 if (x86_pmu.event_constraints) {
1394 for_each_event_constraint(c, x86_pmu.event_constraints) {1394 for_each_event_constraint(c, x86_pmu.event_constraints) {
1395 if ((event->hw.config & c->cmask) == c->code)1395 if ((event->hw.config & c->cmask) == c->code) {
1396 /* hw.flags zeroed at initialization */
1397 event->hw.flags |= c->flags;
1396 return c;1398 return c;
1399 }
1397 }1400 }
1398 }1401 }
1399 1402
@@ -1438,6 +1441,7 @@ intel_put_shared_regs_event_constraints(struct cpu_hw_events *cpuc, · 38 unmodified lines
1438static void intel_put_event_constraints(struct cpu_hw_events *cpuc,1441static void intel_put_event_constraints(struct cpu_hw_events *cpuc,
1439 struct perf_event *event)1442 struct perf_event *event)
1440{1443{
1444 event->hw.flags = 0;
1441 intel_put_shared_regs_event_constraints(cpuc, event);1445 intel_put_shared_regs_event_constraints(cpuc, event);
1442}1446}
1443 1447
arch/x86/kernel/cpu/perf_event_intel_ds.c+3−1
@@ -430,8 +430,10 @@ struct event_constraint *intel_pebs_constraints(struct perf_event *event) · 429 unmodified lines
430 430
431 if (x86_pmu.pebs_constraints) {431 if (x86_pmu.pebs_constraints) {
432 for_each_event_constraint(c, x86_pmu.pebs_constraints) {432 for_each_event_constraint(c, x86_pmu.pebs_constraints) {
433 if ((event->hw.config & c->cmask) == c->code)433 if ((event->hw.config & c->cmask) == c->code) {
434 event->hw.flags |= c->flags;
434 return c;435 return c;
436 }
435 }437 }
436 }438 }
437 439
arch/x86/kernel/cpu/perf_event_intel_uncore.c+1−1
@@ -2438,7 +2438,7 @@ static int __init uncore_type_init(struct intel_uncore_type *type) · 2437 unmodified lines
2438 2438
2439 type->unconstrainted = (struct event_constraint)2439 type->unconstrainted = (struct event_constraint)
2440 __EVENT_CONSTRAINT(0, (1ULL << type->num_counters) - 1,2440 __EVENT_CONSTRAINT(0, (1ULL << type->num_counters) - 1,
2441 0, type->num_counters, 0);2441 0, type->num_counters, 0, 0);
2442 2442
2443 for (i = 0; i < type->num_boxes; i++) {2443 for (i = 0; i < type->num_boxes; i++) {
2444 pmus[i].func_id = -1;2444 pmus[i].func_id = -1;
include/linux/perf_event.h+1−0
@@ -127,6 +127,7 @@ struct hw_perf_event { · 126 unmodified lines
127 int event_base_rdpmc;127 int event_base_rdpmc;
128 int idx;128 int idx;
129 int last_cpu;129 int last_cpu;
130 int flags;
130 131
131 struct hw_perf_event_extra extra_reg;132 struct hw_perf_event_extra extra_reg;
132 struct hw_perf_event_extra branch_reg;133 struct hw_perf_event_extra branch_reg;

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t