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.
Unified · Split
| @@ -1489,7 +1489,7 @@ static int __init init_hw_perf_events(void) · 1488 unmodified lines | ||
| 1489 | 1489 | |
| 1490 | 1490 | unconstrained = (struct event_constraint) |
| 1491 | 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 | 1494 | x86_pmu.attr_rdpmc = 1; /* enable userspace RDPMC usage by default */ |
| 1495 | 1495 | x86_pmu_format_group.attrs = x86_pmu.format_attrs; |
| @@ -59,6 +59,7 @@ struct event_constraint { · 58 unmodified lines | ||
| 59 | 59 | u64 cmask; |
| 60 | 60 | int weight; |
| 61 | 61 | int overlap; |
| 62 | + int flags; | |
| 62 | 63 | }; |
| 63 | 64 | |
| 64 | 65 | struct amd_nb { |
| @@ -170,16 +171,17 @@ struct cpu_hw_events { · 105 unmodified lines | ||
| 170 | 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 | 175 | { .idxmsk64 = (n) }, \ |
| 175 | 176 | .code = (c), \ |
| 176 | 177 | .cmask = (m), \ |
| 177 | 178 | .weight = (w), \ |
| 178 | 179 | .overlap = (o), \ |
| 180 | + .flags = f, \ | |
| 179 | 181 | } |
| 180 | 182 | |
| 181 | 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 | 187 | * The overlap flag marks event constraints with overlapping counter |
| @@ -203,7 +205,7 @@ struct cpu_hw_events { · 17 unmodified lines | ||
| 203 | 205 | * and its counter masks must be kept at a minimum. |
| 204 | 206 | */ |
| 205 | 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 | 211 | * Constraint on the Event code. |
| @@ -1392,8 +1392,11 @@ x86_get_event_constraints(struct cpu_hw_events *cpuc, struct perf_event *event) · 1391 unmodified lines | ||
| 1392 | 1392 | |
| 1393 | 1393 | if (x86_pmu.event_constraints) { |
| 1394 | 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 | 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 | ||
| 1438 | 1441 | static void intel_put_event_constraints(struct cpu_hw_events *cpuc, |
| 1439 | 1442 | struct perf_event *event) |
| 1440 | 1443 | { |
| 1444 | + event->hw.flags = 0; | |
| 1441 | 1445 | intel_put_shared_regs_event_constraints(cpuc, event); |
| 1442 | 1446 | } |
| 1443 | 1447 | |
| @@ -430,8 +430,10 @@ struct event_constraint *intel_pebs_constraints(struct perf_event *event) · 429 unmodified lines | ||
| 430 | 430 | |
| 431 | 431 | if (x86_pmu.pebs_constraints) { |
| 432 | 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 | 435 | return c; |
| 436 | + } | |
| 435 | 437 | } |
| 436 | 438 | } |
| 437 | 439 | |
| @@ -2438,7 +2438,7 @@ static int __init uncore_type_init(struct intel_uncore_type *type) · 2437 unmodified lines | ||
| 2438 | 2438 | |
| 2439 | 2439 | type->unconstrainted = (struct event_constraint) |
| 2440 | 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 | 2443 | for (i = 0; i < type->num_boxes; i++) { |
| 2444 | 2444 | pmus[i].func_id = -1; |
| @@ -127,6 +127,7 @@ struct hw_perf_event { · 126 unmodified lines | ||
| 127 | 127 | int event_base_rdpmc; |
| 128 | 128 | int idx; |
| 129 | 129 | int last_cpu; |
| 130 | + int flags; | |
| 130 | 131 | |
| 131 | 132 | struct hw_perf_event_extra extra_reg; |
| 132 | 133 | struct hw_perf_event_extra branch_reg; |