Skip to content

Commit 95ab0e8

Browse files
committed
Merge tag 'perf-core-2022-03-21' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull x86 perf event updates from Ingo Molnar: - Fix address filtering for Intel/PT,ARM/CoreSight - Enable Intel/PEBS format 5 - Allow more fixed-function counters for x86 - Intel/PT: Enable not recording Taken-Not-Taken packets - Add a few branch-types * tag 'perf-core-2022-03-21' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: perf/x86/intel/uncore: Fix the build on !CONFIG_PHYS_ADDR_T_64BIT perf: Add irq and exception return branch types perf/x86/intel/uncore: Make uncore_discovery clean for 64 bit addresses perf/x86/intel/pt: Add a capability and config bit for disabling TNTs perf/x86/intel/pt: Add a capability and config bit for event tracing perf/x86/intel: Increase max number of the fixed counters KVM: x86: use the KVM side max supported fixed counter perf/x86/intel: Enable PEBS format 5 perf/core: Allow kernel address filter when not filtering the kernel perf/x86/intel/pt: Fix address filter config for 32-bit kernel perf/core: Fix address filter parser for multiple filters x86: Share definition of __is_canonical_address() perf/x86/intel/pt: Relax address filter validation
2 parents 5191290 + 02a08d7 commit 95ab0e8

File tree

23 files changed

+161
-54
lines changed

23 files changed

+161
-54
lines changed

arch/x86/events/intel/core.c

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,27 @@ static struct event_constraint intel_gen_event_constraints[] __read_mostly =
181181
EVENT_CONSTRAINT_END
182182
};
183183

184+
static struct event_constraint intel_v5_gen_event_constraints[] __read_mostly =
185+
{
186+
FIXED_EVENT_CONSTRAINT(0x00c0, 0), /* INST_RETIRED.ANY */
187+
FIXED_EVENT_CONSTRAINT(0x003c, 1), /* CPU_CLK_UNHALTED.CORE */
188+
FIXED_EVENT_CONSTRAINT(0x0300, 2), /* CPU_CLK_UNHALTED.REF */
189+
FIXED_EVENT_CONSTRAINT(0x0400, 3), /* SLOTS */
190+
FIXED_EVENT_CONSTRAINT(0x0500, 4),
191+
FIXED_EVENT_CONSTRAINT(0x0600, 5),
192+
FIXED_EVENT_CONSTRAINT(0x0700, 6),
193+
FIXED_EVENT_CONSTRAINT(0x0800, 7),
194+
FIXED_EVENT_CONSTRAINT(0x0900, 8),
195+
FIXED_EVENT_CONSTRAINT(0x0a00, 9),
196+
FIXED_EVENT_CONSTRAINT(0x0b00, 10),
197+
FIXED_EVENT_CONSTRAINT(0x0c00, 11),
198+
FIXED_EVENT_CONSTRAINT(0x0d00, 12),
199+
FIXED_EVENT_CONSTRAINT(0x0e00, 13),
200+
FIXED_EVENT_CONSTRAINT(0x0f00, 14),
201+
FIXED_EVENT_CONSTRAINT(0x1000, 15),
202+
EVENT_CONSTRAINT_END
203+
};
204+
184205
static struct event_constraint intel_slm_event_constraints[] __read_mostly =
185206
{
186207
FIXED_EVENT_CONSTRAINT(0x00c0, 0), /* INST_RETIRED.ANY */
@@ -6308,14 +6329,31 @@ __init int intel_pmu_init(void)
63086329
pr_cont("generic architected perfmon v1, ");
63096330
name = "generic_arch_v1";
63106331
break;
6311-
default:
6332+
case 2:
6333+
case 3:
6334+
case 4:
63126335
/*
63136336
* default constraints for v2 and up
63146337
*/
63156338
x86_pmu.event_constraints = intel_gen_event_constraints;
63166339
pr_cont("generic architected perfmon, ");
63176340
name = "generic_arch_v2+";
63186341
break;
6342+
default:
6343+
/*
6344+
* The default constraints for v5 and up can support up to
6345+
* 16 fixed counters. For the fixed counters 4 and later,
6346+
* the pseudo-encoding is applied.
6347+
* The constraints may be cut according to the CPUID enumeration
6348+
* by inserting the EVENT_CONSTRAINT_END.
6349+
*/
6350+
if (x86_pmu.num_counters_fixed > INTEL_PMC_MAX_FIXED)
6351+
x86_pmu.num_counters_fixed = INTEL_PMC_MAX_FIXED;
6352+
intel_v5_gen_event_constraints[x86_pmu.num_counters_fixed].weight = -1;
6353+
x86_pmu.event_constraints = intel_v5_gen_event_constraints;
6354+
pr_cont("generic architected perfmon, ");
6355+
name = "generic_arch_v5+";
6356+
break;
63196357
}
63206358
}
63216359

arch/x86/events/intel/ds.c

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1203,7 +1203,10 @@ static void intel_pmu_pebs_via_pt_enable(struct perf_event *event)
12031203
if (hwc->idx >= INTEL_PMC_IDX_FIXED) {
12041204
base = MSR_RELOAD_FIXED_CTR0;
12051205
idx = hwc->idx - INTEL_PMC_IDX_FIXED;
1206-
value = ds->pebs_event_reset[MAX_PEBS_EVENTS + idx];
1206+
if (x86_pmu.intel_cap.pebs_format < 5)
1207+
value = ds->pebs_event_reset[MAX_PEBS_EVENTS_FMT4 + idx];
1208+
else
1209+
value = ds->pebs_event_reset[MAX_PEBS_EVENTS + idx];
12071210
}
12081211
wrmsrl(base + idx, value);
12091212
}
@@ -1232,8 +1235,12 @@ void intel_pmu_pebs_enable(struct perf_event *event)
12321235
}
12331236
}
12341237

1235-
if (idx >= INTEL_PMC_IDX_FIXED)
1236-
idx = MAX_PEBS_EVENTS + (idx - INTEL_PMC_IDX_FIXED);
1238+
if (idx >= INTEL_PMC_IDX_FIXED) {
1239+
if (x86_pmu.intel_cap.pebs_format < 5)
1240+
idx = MAX_PEBS_EVENTS_FMT4 + (idx - INTEL_PMC_IDX_FIXED);
1241+
else
1242+
idx = MAX_PEBS_EVENTS + (idx - INTEL_PMC_IDX_FIXED);
1243+
}
12371244

12381245
/*
12391246
* Use auto-reload if possible to save a MSR write in the PMI.
@@ -2204,6 +2211,7 @@ void __init intel_ds_init(void)
22042211
break;
22052212

22062213
case 4:
2214+
case 5:
22072215
x86_pmu.drain_pebs = intel_pmu_drain_pebs_icl;
22082216
x86_pmu.pebs_record_size = sizeof(struct pebs_basic);
22092217
if (x86_pmu.intel_cap.pebs_baseline) {

arch/x86/events/intel/lbr.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1329,10 +1329,10 @@ static int branch_map[X86_BR_TYPE_MAP_MAX] = {
13291329
PERF_BR_SYSCALL, /* X86_BR_SYSCALL */
13301330
PERF_BR_SYSRET, /* X86_BR_SYSRET */
13311331
PERF_BR_UNKNOWN, /* X86_BR_INT */
1332-
PERF_BR_UNKNOWN, /* X86_BR_IRET */
1332+
PERF_BR_ERET, /* X86_BR_IRET */
13331333
PERF_BR_COND, /* X86_BR_JCC */
13341334
PERF_BR_UNCOND, /* X86_BR_JMP */
1335-
PERF_BR_UNKNOWN, /* X86_BR_IRQ */
1335+
PERF_BR_IRQ, /* X86_BR_IRQ */
13361336
PERF_BR_IND_CALL, /* X86_BR_IND_CALL */
13371337
PERF_BR_UNKNOWN, /* X86_BR_ABORT */
13381338
PERF_BR_UNKNOWN, /* X86_BR_IN_TX */

arch/x86/events/intel/pt.c

Lines changed: 57 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
1414

1515
#include <linux/types.h>
16+
#include <linux/bits.h>
17+
#include <linux/limits.h>
1618
#include <linux/slab.h>
1719
#include <linux/device.h>
1820

@@ -57,6 +59,8 @@ static struct pt_cap_desc {
5759
PT_CAP(mtc, 0, CPUID_EBX, BIT(3)),
5860
PT_CAP(ptwrite, 0, CPUID_EBX, BIT(4)),
5961
PT_CAP(power_event_trace, 0, CPUID_EBX, BIT(5)),
62+
PT_CAP(event_trace, 0, CPUID_EBX, BIT(7)),
63+
PT_CAP(tnt_disable, 0, CPUID_EBX, BIT(8)),
6064
PT_CAP(topa_output, 0, CPUID_ECX, BIT(0)),
6165
PT_CAP(topa_multiple_entries, 0, CPUID_ECX, BIT(1)),
6266
PT_CAP(single_range_output, 0, CPUID_ECX, BIT(2)),
@@ -108,6 +112,8 @@ PMU_FORMAT_ATTR(tsc, "config:10" );
108112
PMU_FORMAT_ATTR(noretcomp, "config:11" );
109113
PMU_FORMAT_ATTR(ptw, "config:12" );
110114
PMU_FORMAT_ATTR(branch, "config:13" );
115+
PMU_FORMAT_ATTR(event, "config:31" );
116+
PMU_FORMAT_ATTR(notnt, "config:55" );
111117
PMU_FORMAT_ATTR(mtc_period, "config:14-17" );
112118
PMU_FORMAT_ATTR(cyc_thresh, "config:19-22" );
113119
PMU_FORMAT_ATTR(psb_period, "config:24-27" );
@@ -116,6 +122,8 @@ static struct attribute *pt_formats_attr[] = {
116122
&format_attr_pt.attr,
117123
&format_attr_cyc.attr,
118124
&format_attr_pwr_evt.attr,
125+
&format_attr_event.attr,
126+
&format_attr_notnt.attr,
119127
&format_attr_fup_on_ptw.attr,
120128
&format_attr_mtc.attr,
121129
&format_attr_tsc.attr,
@@ -296,6 +304,8 @@ static int __init pt_pmu_hw_init(void)
296304
RTIT_CTL_CYC_PSB | \
297305
RTIT_CTL_MTC | \
298306
RTIT_CTL_PWR_EVT_EN | \
307+
RTIT_CTL_EVENT_EN | \
308+
RTIT_CTL_NOTNT | \
299309
RTIT_CTL_FUP_ON_PTW | \
300310
RTIT_CTL_PTW_EN)
301311

@@ -350,6 +360,14 @@ static bool pt_event_valid(struct perf_event *event)
350360
!intel_pt_validate_hw_cap(PT_CAP_power_event_trace))
351361
return false;
352362

363+
if (config & RTIT_CTL_EVENT_EN &&
364+
!intel_pt_validate_hw_cap(PT_CAP_event_trace))
365+
return false;
366+
367+
if (config & RTIT_CTL_NOTNT &&
368+
!intel_pt_validate_hw_cap(PT_CAP_tnt_disable))
369+
return false;
370+
353371
if (config & RTIT_CTL_PTW) {
354372
if (!intel_pt_validate_hw_cap(PT_CAP_ptwrite))
355373
return false;
@@ -472,7 +490,7 @@ static u64 pt_config_filters(struct perf_event *event)
472490
pt->filters.filter[range].msr_b = filter->msr_b;
473491
}
474492

475-
rtit_ctl |= filter->config << pt_address_ranges[range].reg_off;
493+
rtit_ctl |= (u64)filter->config << pt_address_ranges[range].reg_off;
476494
}
477495

478496
return rtit_ctl;
@@ -1348,10 +1366,26 @@ static void pt_addr_filters_fini(struct perf_event *event)
13481366
event->hw.addr_filters = NULL;
13491367
}
13501368

1351-
static inline bool valid_kernel_ip(unsigned long ip)
1369+
#ifdef CONFIG_X86_64
1370+
/* Clamp to a canonical address greater-than-or-equal-to the address given */
1371+
static u64 clamp_to_ge_canonical_addr(u64 vaddr, u8 vaddr_bits)
1372+
{
1373+
return __is_canonical_address(vaddr, vaddr_bits) ?
1374+
vaddr :
1375+
-BIT_ULL(vaddr_bits - 1);
1376+
}
1377+
1378+
/* Clamp to a canonical address less-than-or-equal-to the address given */
1379+
static u64 clamp_to_le_canonical_addr(u64 vaddr, u8 vaddr_bits)
13521380
{
1353-
return virt_addr_valid(ip) && kernel_ip(ip);
1381+
return __is_canonical_address(vaddr, vaddr_bits) ?
1382+
vaddr :
1383+
BIT_ULL(vaddr_bits - 1) - 1;
13541384
}
1385+
#else
1386+
#define clamp_to_ge_canonical_addr(x, y) (x)
1387+
#define clamp_to_le_canonical_addr(x, y) (x)
1388+
#endif
13551389

13561390
static int pt_event_addr_filters_validate(struct list_head *filters)
13571391
{
@@ -1367,14 +1401,6 @@ static int pt_event_addr_filters_validate(struct list_head *filters)
13671401
filter->action == PERF_ADDR_FILTER_ACTION_START)
13681402
return -EOPNOTSUPP;
13691403

1370-
if (!filter->path.dentry) {
1371-
if (!valid_kernel_ip(filter->offset))
1372-
return -EINVAL;
1373-
1374-
if (!valid_kernel_ip(filter->offset + filter->size))
1375-
return -EINVAL;
1376-
}
1377-
13781404
if (++range > intel_pt_validate_hw_cap(PT_CAP_num_address_ranges))
13791405
return -EOPNOTSUPP;
13801406
}
@@ -1398,9 +1424,26 @@ static void pt_event_addr_filters_sync(struct perf_event *event)
13981424
if (filter->path.dentry && !fr[range].start) {
13991425
msr_a = msr_b = 0;
14001426
} else {
1401-
/* apply the offset */
1402-
msr_a = fr[range].start;
1403-
msr_b = msr_a + fr[range].size - 1;
1427+
unsigned long n = fr[range].size - 1;
1428+
unsigned long a = fr[range].start;
1429+
unsigned long b;
1430+
1431+
if (a > ULONG_MAX - n)
1432+
b = ULONG_MAX;
1433+
else
1434+
b = a + n;
1435+
/*
1436+
* Apply the offset. 64-bit addresses written to the
1437+
* MSRs must be canonical, but the range can encompass
1438+
* non-canonical addresses. Since software cannot
1439+
* execute at non-canonical addresses, adjusting to
1440+
* canonical addresses does not affect the result of the
1441+
* address filter.
1442+
*/
1443+
msr_a = clamp_to_ge_canonical_addr(a, boot_cpu_data.x86_virt_bits);
1444+
msr_b = clamp_to_le_canonical_addr(b, boot_cpu_data.x86_virt_bits);
1445+
if (msr_b < msr_a)
1446+
msr_a = msr_b = 0;
14041447
}
14051448

14061449
filters->filter[range].msr_a = msr_a;

arch/x86/events/intel/uncore_discovery.c

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -215,10 +215,18 @@ static int parse_discovery_table(struct pci_dev *dev, int die,
215215

216216
pci_read_config_dword(dev, bar_offset, &val);
217217

218-
if (val & UNCORE_DISCOVERY_MASK)
218+
if (val & ~PCI_BASE_ADDRESS_MEM_MASK & ~PCI_BASE_ADDRESS_MEM_TYPE_64)
219219
return -EINVAL;
220220

221-
addr = (resource_size_t)(val & ~UNCORE_DISCOVERY_MASK);
221+
addr = (resource_size_t)(val & PCI_BASE_ADDRESS_MEM_MASK);
222+
#ifdef CONFIG_PHYS_ADDR_T_64BIT
223+
if ((val & PCI_BASE_ADDRESS_MEM_TYPE_MASK) == PCI_BASE_ADDRESS_MEM_TYPE_64) {
224+
u32 val2;
225+
226+
pci_read_config_dword(dev, bar_offset + 4, &val2);
227+
addr |= ((resource_size_t)val2) << 32;
228+
}
229+
#endif
222230
size = UNCORE_DISCOVERY_GLOBAL_MAP_SIZE;
223231
io_addr = ioremap(addr, size);
224232
if (!io_addr)
@@ -444,7 +452,7 @@ static struct intel_uncore_ops generic_uncore_pci_ops = {
444452

445453
#define UNCORE_GENERIC_MMIO_SIZE 0x4000
446454

447-
static unsigned int generic_uncore_mmio_box_ctl(struct intel_uncore_box *box)
455+
static u64 generic_uncore_mmio_box_ctl(struct intel_uncore_box *box)
448456
{
449457
struct intel_uncore_type *type = box->pmu->type;
450458

@@ -456,7 +464,7 @@ static unsigned int generic_uncore_mmio_box_ctl(struct intel_uncore_box *box)
456464

457465
void intel_generic_uncore_mmio_init_box(struct intel_uncore_box *box)
458466
{
459-
unsigned int box_ctl = generic_uncore_mmio_box_ctl(box);
467+
u64 box_ctl = generic_uncore_mmio_box_ctl(box);
460468
struct intel_uncore_type *type = box->pmu->type;
461469
resource_size_t addr;
462470

arch/x86/events/intel/uncore_discovery.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,6 @@
1818
#define UNCORE_DISCOVERY_BIR_BASE 0x10
1919
/* Discovery table BAR step */
2020
#define UNCORE_DISCOVERY_BIR_STEP 0x4
21-
/* Mask of the discovery table offset */
22-
#define UNCORE_DISCOVERY_MASK 0xf
2321
/* Global discovery table size */
2422
#define UNCORE_DISCOVERY_GLOBAL_MAP_SIZE 0x20
2523

arch/x86/include/asm/intel_ds.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,9 @@
77
#define PEBS_BUFFER_SIZE (PAGE_SIZE << 4)
88

99
/* The maximal number of PEBS events: */
10-
#define MAX_PEBS_EVENTS 8
11-
#define MAX_FIXED_PEBS_EVENTS 4
10+
#define MAX_PEBS_EVENTS_FMT4 8
11+
#define MAX_PEBS_EVENTS 32
12+
#define MAX_FIXED_PEBS_EVENTS 16
1213

1314
/*
1415
* A debug store configuration.

arch/x86/include/asm/intel_pt.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ enum pt_capabilities {
1313
PT_CAP_mtc,
1414
PT_CAP_ptwrite,
1515
PT_CAP_power_event_trace,
16+
PT_CAP_event_trace,
17+
PT_CAP_tnt_disable,
1618
PT_CAP_topa_output,
1719
PT_CAP_topa_multiple_entries,
1820
PT_CAP_single_range_output,

arch/x86/include/asm/kvm_host.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -498,6 +498,7 @@ struct kvm_pmc {
498498
bool intr;
499499
};
500500

501+
#define KVM_PMC_MAX_FIXED 3
501502
struct kvm_pmu {
502503
unsigned nr_arch_gp_counters;
503504
unsigned nr_arch_fixed_counters;
@@ -511,7 +512,7 @@ struct kvm_pmu {
511512
u64 reserved_bits;
512513
u8 version;
513514
struct kvm_pmc gp_counters[INTEL_PMC_MAX_GENERIC];
514-
struct kvm_pmc fixed_counters[INTEL_PMC_MAX_FIXED];
515+
struct kvm_pmc fixed_counters[KVM_PMC_MAX_FIXED];
515516
struct irq_work irq_work;
516517
DECLARE_BITMAP(reprogram_pmi, X86_PMC_IDX_MAX);
517518
DECLARE_BITMAP(all_valid_pmc_idx, X86_PMC_IDX_MAX);

arch/x86/include/asm/msr-index.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,8 @@
205205
#define RTIT_CTL_DISRETC BIT(11)
206206
#define RTIT_CTL_PTW_EN BIT(12)
207207
#define RTIT_CTL_BRANCH_EN BIT(13)
208+
#define RTIT_CTL_EVENT_EN BIT(31)
209+
#define RTIT_CTL_NOTNT BIT_ULL(55)
208210
#define RTIT_CTL_MTC_RANGE_OFFSET 14
209211
#define RTIT_CTL_MTC_RANGE (0x0full << RTIT_CTL_MTC_RANGE_OFFSET)
210212
#define RTIT_CTL_CYC_THRESH_OFFSET 19

0 commit comments

Comments
 (0)