mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-01-16 02:14:58 +00:00
perf tools fixes for v6.13
A set of random fixes for this cycle. perf record ----------- * Fix build-id event size calculation in perf record * Fix perf record -C/--cpu option on hybrid systems * Fix perf mem record with precise-ip on SapphireRapids perf test --------- * Refresh hwmon directory before reading the test files * Make sure system_tsc_freq event is tested on x86 only Others ------ * Usual header file sync * Fix undefined behavior in perf ftrace profile * Properly initialize a return variable in perf probe Signed-off-by: Namhyung Kim <namhyung@kernel.org> -----BEGIN PGP SIGNATURE----- iHUEABYIAB0WIQSo2x5BnqMqsoHtzsmMstVUGiXMgwUCZ1taMgAKCRCMstVUGiXM g+JLAP99JamxAdmiXW9qwU7Z2OGWZ+J5RsVh5sId+XuH5Lui1wEAgxE5vhULfRaz IH74FuxietYfo0YpTLVlJJgntHO7ugo= =YUUe -----END PGP SIGNATURE----- Merge tag 'perf-tools-fixes-for-v6.13-2024-12-12' of git://git.kernel.org/pub/scm/linux/kernel/git/perf/perf-tools Pull perf tools fixes from Namhyung Kim: "A set of random fixes for this cycle. perf record: - Fix build-id event size calculation in perf record - Fix perf record -C/--cpu option on hybrid systems - Fix perf mem record with precise-ip on SapphireRapids perf test: - Refresh hwmon directory before reading the test files - Make sure system_tsc_freq event is tested on x86 only Others: - Usual header file sync - Fix undefined behavior in perf ftrace profile - Properly initialize a return variable in perf probe" * tag 'perf-tools-fixes-for-v6.13-2024-12-12' of git://git.kernel.org/pub/scm/linux/kernel/git/perf/perf-tools: (21 commits) perf probe: Fix uninitialized variable libperf: evlist: Fix --cpu argument on hybrid platform perf test expr: Fix system_tsc_freq for only x86 perf test hwmon_pmu: Fix event file location perf hwmon_pmu: Use openat rather than dup to refresh directory perf ftrace: Fix undefined behavior in cmp_profile_data() perf tools: Fix precise_ip fallback logic perf tools: Fix build error on generated/fs_at_flags_array.c tools headers: Sync uapi/linux/prctl.h with the kernel sources tools headers: Sync uapi/linux/mount.h with the kernel sources tools headers: Sync uapi/linux/fcntl.h with the kernel sources tools headers: Sync uapi/asm-generic/mman.h with the kernel sources tools headers: Sync *xattrat syscall changes with the kernel sources tools headers: Sync arm64 kvm header with the kernel sources tools headers: Sync x86 kvm and cpufeature headers with the kernel tools headers: Sync uapi/linux/kvm.h with the kernel sources tools headers: Sync uapi/linux/perf_event.h with the kernel sources tools headers: Sync uapi/drm/drm.h with the kernel sources perf machine: Initialize machine->env to address a segfault perf test: Don't signal all processes on system when interrupting tests ...
This commit is contained in:
commit
01abac26dc
@ -484,6 +484,12 @@ enum {
|
||||
*/
|
||||
#define KVM_SYSTEM_EVENT_RESET_FLAG_PSCI_RESET2 (1ULL << 0)
|
||||
|
||||
/*
|
||||
* Shutdown caused by a PSCI v1.3 SYSTEM_OFF2 call.
|
||||
* Valid only when the system event has a type of KVM_SYSTEM_EVENT_SHUTDOWN.
|
||||
*/
|
||||
#define KVM_SYSTEM_EVENT_SHUTDOWN_FLAG_PSCI_OFF2 (1ULL << 0)
|
||||
|
||||
/* run->fail_entry.hardware_entry_failure_reason codes. */
|
||||
#define KVM_EXIT_FAIL_ENTRY_CPU_UNSUPPORTED (1ULL << 0)
|
||||
|
||||
|
@ -215,7 +215,7 @@
|
||||
#define X86_FEATURE_SPEC_STORE_BYPASS_DISABLE ( 7*32+23) /* Disable Speculative Store Bypass. */
|
||||
#define X86_FEATURE_LS_CFG_SSBD ( 7*32+24) /* AMD SSBD implementation via LS_CFG MSR */
|
||||
#define X86_FEATURE_IBRS ( 7*32+25) /* "ibrs" Indirect Branch Restricted Speculation */
|
||||
#define X86_FEATURE_IBPB ( 7*32+26) /* "ibpb" Indirect Branch Prediction Barrier */
|
||||
#define X86_FEATURE_IBPB ( 7*32+26) /* "ibpb" Indirect Branch Prediction Barrier without a guaranteed RSB flush */
|
||||
#define X86_FEATURE_STIBP ( 7*32+27) /* "stibp" Single Thread Indirect Branch Predictors */
|
||||
#define X86_FEATURE_ZEN ( 7*32+28) /* Generic flag for all Zen and newer */
|
||||
#define X86_FEATURE_L1TF_PTEINV ( 7*32+29) /* L1TF workaround PTE inversion */
|
||||
@ -317,6 +317,9 @@
|
||||
#define X86_FEATURE_ZEN1 (11*32+31) /* CPU based on Zen1 microarchitecture */
|
||||
|
||||
/* Intel-defined CPU features, CPUID level 0x00000007:1 (EAX), word 12 */
|
||||
#define X86_FEATURE_SHA512 (12*32+ 0) /* SHA512 instructions */
|
||||
#define X86_FEATURE_SM3 (12*32+ 1) /* SM3 instructions */
|
||||
#define X86_FEATURE_SM4 (12*32+ 2) /* SM4 instructions */
|
||||
#define X86_FEATURE_AVX_VNNI (12*32+ 4) /* "avx_vnni" AVX VNNI instructions */
|
||||
#define X86_FEATURE_AVX512_BF16 (12*32+ 5) /* "avx512_bf16" AVX512 BFLOAT16 instructions */
|
||||
#define X86_FEATURE_CMPCCXADD (12*32+ 7) /* CMPccXADD instructions */
|
||||
@ -348,6 +351,7 @@
|
||||
#define X86_FEATURE_CPPC (13*32+27) /* "cppc" Collaborative Processor Performance Control */
|
||||
#define X86_FEATURE_AMD_PSFD (13*32+28) /* Predictive Store Forwarding Disable */
|
||||
#define X86_FEATURE_BTC_NO (13*32+29) /* Not vulnerable to Branch Type Confusion */
|
||||
#define X86_FEATURE_AMD_IBPB_RET (13*32+30) /* IBPB clears return address predictor */
|
||||
#define X86_FEATURE_BRS (13*32+31) /* "brs" Branch Sampling available */
|
||||
|
||||
/* Thermal and Power Management Leaf, CPUID level 0x00000006 (EAX), word 14 */
|
||||
@ -472,7 +476,9 @@
|
||||
#define X86_FEATURE_BHI_CTRL (21*32+ 2) /* BHI_DIS_S HW control available */
|
||||
#define X86_FEATURE_CLEAR_BHB_HW (21*32+ 3) /* BHI_DIS_S HW control enabled */
|
||||
#define X86_FEATURE_CLEAR_BHB_LOOP_ON_VMEXIT (21*32+ 4) /* Clear branch history at vmexit using SW loop */
|
||||
#define X86_FEATURE_AMD_FAST_CPPC (21*32 + 5) /* AMD Fast CPPC */
|
||||
#define X86_FEATURE_AMD_FAST_CPPC (21*32 + 5) /* Fast CPPC */
|
||||
#define X86_FEATURE_AMD_HETEROGENEOUS_CORES (21*32 + 6) /* Heterogeneous Core Topology */
|
||||
#define X86_FEATURE_AMD_WORKLOAD_CLASS (21*32 + 7) /* Workload Classification */
|
||||
|
||||
/*
|
||||
* BUG word(s)
|
||||
@ -523,4 +529,5 @@
|
||||
#define X86_BUG_DIV0 X86_BUG(1*32 + 1) /* "div0" AMD DIV0 speculation bug */
|
||||
#define X86_BUG_RFDS X86_BUG(1*32 + 2) /* "rfds" CPU is vulnerable to Register File Data Sampling */
|
||||
#define X86_BUG_BHI X86_BUG(1*32 + 3) /* "bhi" CPU is affected by Branch History Injection */
|
||||
#define X86_BUG_IBPB_NO_RET X86_BUG(1*32 + 4) /* "ibpb_no_ret" IBPB omits return target predictions */
|
||||
#endif /* _ASM_X86_CPUFEATURES_H */
|
||||
|
@ -440,6 +440,7 @@ struct kvm_sync_regs {
|
||||
#define KVM_X86_QUIRK_FIX_HYPERCALL_INSN (1 << 5)
|
||||
#define KVM_X86_QUIRK_MWAIT_NEVER_UD_FAULTS (1 << 6)
|
||||
#define KVM_X86_QUIRK_SLOT_ZAP_ALL (1 << 7)
|
||||
#define KVM_X86_QUIRK_STUFF_FEATURE_MSRS (1 << 8)
|
||||
|
||||
#define KVM_STATE_NESTED_FORMAT_VMX 0
|
||||
#define KVM_STATE_NESTED_FORMAT_SVM 1
|
||||
|
@ -19,4 +19,8 @@
|
||||
#define MCL_FUTURE 2 /* lock all future mappings */
|
||||
#define MCL_ONFAULT 4 /* lock all pages that are faulted in */
|
||||
|
||||
#define SHADOW_STACK_SET_TOKEN (1ULL << 0) /* Set up a restore token in the shadow stack */
|
||||
#define SHADOW_STACK_SET_MARKER (1ULL << 1) /* Set up a top of stack marker in the shadow stack */
|
||||
|
||||
|
||||
#endif /* __ASM_GENERIC_MMAN_H */
|
||||
|
@ -841,8 +841,17 @@ __SYSCALL(__NR_lsm_list_modules, sys_lsm_list_modules)
|
||||
#define __NR_mseal 462
|
||||
__SYSCALL(__NR_mseal, sys_mseal)
|
||||
|
||||
#define __NR_setxattrat 463
|
||||
__SYSCALL(__NR_setxattrat, sys_setxattrat)
|
||||
#define __NR_getxattrat 464
|
||||
__SYSCALL(__NR_getxattrat, sys_getxattrat)
|
||||
#define __NR_listxattrat 465
|
||||
__SYSCALL(__NR_listxattrat, sys_listxattrat)
|
||||
#define __NR_removexattrat 466
|
||||
__SYSCALL(__NR_removexattrat, sys_removexattrat)
|
||||
|
||||
#undef __NR_syscalls
|
||||
#define __NR_syscalls 463
|
||||
#define __NR_syscalls 467
|
||||
|
||||
/*
|
||||
* 32 bit systems traditionally used different
|
||||
|
@ -1024,6 +1024,13 @@ struct drm_crtc_queue_sequence {
|
||||
__u64 user_data; /* user data passed to event */
|
||||
};
|
||||
|
||||
#define DRM_CLIENT_NAME_MAX_LEN 64
|
||||
struct drm_set_client_name {
|
||||
__u64 name_len;
|
||||
__u64 name;
|
||||
};
|
||||
|
||||
|
||||
#if defined(__cplusplus)
|
||||
}
|
||||
#endif
|
||||
@ -1288,6 +1295,16 @@ extern "C" {
|
||||
*/
|
||||
#define DRM_IOCTL_MODE_CLOSEFB DRM_IOWR(0xD0, struct drm_mode_closefb)
|
||||
|
||||
/**
|
||||
* DRM_IOCTL_SET_CLIENT_NAME - Attach a name to a drm_file
|
||||
*
|
||||
* Having a name allows for easier tracking and debugging.
|
||||
* The length of the name (without null ending char) must be
|
||||
* <= DRM_CLIENT_NAME_MAX_LEN.
|
||||
* The call will fail if the name contains whitespaces or non-printable chars.
|
||||
*/
|
||||
#define DRM_IOCTL_SET_CLIENT_NAME DRM_IOWR(0xD1, struct drm_set_client_name)
|
||||
|
||||
/*
|
||||
* Device specific ioctls should only be in their respective headers
|
||||
* The device specific ioctl range is from 0x40 to 0x9f.
|
||||
|
@ -1158,7 +1158,15 @@ enum kvm_device_type {
|
||||
#define KVM_DEV_TYPE_ARM_PV_TIME KVM_DEV_TYPE_ARM_PV_TIME
|
||||
KVM_DEV_TYPE_RISCV_AIA,
|
||||
#define KVM_DEV_TYPE_RISCV_AIA KVM_DEV_TYPE_RISCV_AIA
|
||||
KVM_DEV_TYPE_LOONGARCH_IPI,
|
||||
#define KVM_DEV_TYPE_LOONGARCH_IPI KVM_DEV_TYPE_LOONGARCH_IPI
|
||||
KVM_DEV_TYPE_LOONGARCH_EIOINTC,
|
||||
#define KVM_DEV_TYPE_LOONGARCH_EIOINTC KVM_DEV_TYPE_LOONGARCH_EIOINTC
|
||||
KVM_DEV_TYPE_LOONGARCH_PCHPIC,
|
||||
#define KVM_DEV_TYPE_LOONGARCH_PCHPIC KVM_DEV_TYPE_LOONGARCH_PCHPIC
|
||||
|
||||
KVM_DEV_TYPE_MAX,
|
||||
|
||||
};
|
||||
|
||||
struct kvm_vfio_spapr_tce {
|
||||
|
@ -511,7 +511,16 @@ struct perf_event_attr {
|
||||
__u16 sample_max_stack;
|
||||
__u16 __reserved_2;
|
||||
__u32 aux_sample_size;
|
||||
__u32 __reserved_3;
|
||||
|
||||
union {
|
||||
__u32 aux_action;
|
||||
struct {
|
||||
__u32 aux_start_paused : 1, /* start AUX area tracing paused */
|
||||
aux_pause : 1, /* on overflow, pause AUX area tracing */
|
||||
aux_resume : 1, /* on overflow, resume AUX area tracing */
|
||||
__reserved_3 : 29;
|
||||
};
|
||||
};
|
||||
|
||||
/*
|
||||
* User provided data if sigtrap=1, passed back to user via
|
||||
|
@ -47,6 +47,20 @@ static void __perf_evlist__propagate_maps(struct perf_evlist *evlist,
|
||||
*/
|
||||
perf_cpu_map__put(evsel->cpus);
|
||||
evsel->cpus = perf_cpu_map__intersect(evlist->user_requested_cpus, evsel->own_cpus);
|
||||
|
||||
/*
|
||||
* Empty cpu lists would eventually get opened as "any" so remove
|
||||
* genuinely empty ones before they're opened in the wrong place.
|
||||
*/
|
||||
if (perf_cpu_map__is_empty(evsel->cpus)) {
|
||||
struct perf_evsel *next = perf_evlist__next(evlist, evsel);
|
||||
|
||||
perf_evlist__remove(evlist, evsel);
|
||||
/* Keep idx contiguous */
|
||||
if (next)
|
||||
list_for_each_entry_from(next, &evlist->entries, node)
|
||||
next->idx--;
|
||||
}
|
||||
} else if (!evsel->own_cpus || evlist->has_user_cpus ||
|
||||
(!evsel->requires_cpu && perf_cpu_map__has_any_cpu(evlist->user_requested_cpus))) {
|
||||
/*
|
||||
@ -80,11 +94,11 @@ static void __perf_evlist__propagate_maps(struct perf_evlist *evlist,
|
||||
|
||||
static void perf_evlist__propagate_maps(struct perf_evlist *evlist)
|
||||
{
|
||||
struct perf_evsel *evsel;
|
||||
struct perf_evsel *evsel, *n;
|
||||
|
||||
evlist->needs_map_propagation = true;
|
||||
|
||||
perf_evlist__for_each_evsel(evlist, evsel)
|
||||
list_for_each_entry_safe(evsel, n, &evlist->entries, node)
|
||||
__perf_evlist__propagate_maps(evlist, evsel);
|
||||
}
|
||||
|
||||
|
@ -377,3 +377,7 @@
|
||||
460 n64 lsm_set_self_attr sys_lsm_set_self_attr
|
||||
461 n64 lsm_list_modules sys_lsm_list_modules
|
||||
462 n64 mseal sys_mseal
|
||||
463 n64 setxattrat sys_setxattrat
|
||||
464 n64 getxattrat sys_getxattrat
|
||||
465 n64 listxattrat sys_listxattrat
|
||||
466 n64 removexattrat sys_removexattrat
|
||||
|
@ -553,3 +553,7 @@
|
||||
460 common lsm_set_self_attr sys_lsm_set_self_attr
|
||||
461 common lsm_list_modules sys_lsm_list_modules
|
||||
462 common mseal sys_mseal
|
||||
463 common setxattrat sys_setxattrat
|
||||
464 common getxattrat sys_getxattrat
|
||||
465 common listxattrat sys_listxattrat
|
||||
466 common removexattrat sys_removexattrat
|
||||
|
@ -465,3 +465,7 @@
|
||||
460 common lsm_set_self_attr sys_lsm_set_self_attr sys_lsm_set_self_attr
|
||||
461 common lsm_list_modules sys_lsm_list_modules sys_lsm_list_modules
|
||||
462 common mseal sys_mseal sys_mseal
|
||||
463 common setxattrat sys_setxattrat sys_setxattrat
|
||||
464 common getxattrat sys_getxattrat sys_getxattrat
|
||||
465 common listxattrat sys_listxattrat sys_listxattrat
|
||||
466 common removexattrat sys_removexattrat sys_removexattrat
|
||||
|
@ -468,3 +468,7 @@
|
||||
460 i386 lsm_set_self_attr sys_lsm_set_self_attr
|
||||
461 i386 lsm_list_modules sys_lsm_list_modules
|
||||
462 i386 mseal sys_mseal
|
||||
463 i386 setxattrat sys_setxattrat
|
||||
464 i386 getxattrat sys_getxattrat
|
||||
465 i386 listxattrat sys_listxattrat
|
||||
466 i386 removexattrat sys_removexattrat
|
||||
|
@ -386,6 +386,10 @@
|
||||
460 common lsm_set_self_attr sys_lsm_set_self_attr
|
||||
461 common lsm_list_modules sys_lsm_list_modules
|
||||
462 common mseal sys_mseal
|
||||
463 common setxattrat sys_setxattrat
|
||||
464 common getxattrat sys_getxattrat
|
||||
465 common listxattrat sys_listxattrat
|
||||
466 common removexattrat sys_removexattrat
|
||||
|
||||
#
|
||||
# Due to a historical design error, certain syscalls are numbered differently
|
||||
|
@ -1151,8 +1151,9 @@ static int cmp_profile_data(const void *a, const void *b)
|
||||
|
||||
if (v1 > v2)
|
||||
return -1;
|
||||
else
|
||||
if (v1 < v2)
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void print_profile_result(struct perf_ftrace *ftrace)
|
||||
|
@ -508,7 +508,7 @@ static int __cmd_test(struct test_suite **suites, int argc, const char *argv[],
|
||||
for (size_t x = 0; x < num_tests; x++) {
|
||||
struct child_test *child_test = child_tests[x];
|
||||
|
||||
if (!child_test)
|
||||
if (!child_test || child_test->process.pid <= 0)
|
||||
continue;
|
||||
|
||||
pr_debug3("Killing %d pid %d\n",
|
||||
|
@ -75,14 +75,12 @@ static int test__expr(struct test_suite *t __maybe_unused, int subtest __maybe_u
|
||||
double val, num_cpus_online, num_cpus, num_cores, num_dies, num_packages;
|
||||
int ret;
|
||||
struct expr_parse_ctx *ctx;
|
||||
bool is_intel = false;
|
||||
char strcmp_cpuid_buf[256];
|
||||
struct perf_cpu cpu = {-1};
|
||||
char *cpuid = get_cpuid_allow_env_override(cpu);
|
||||
char *escaped_cpuid1, *escaped_cpuid2;
|
||||
|
||||
TEST_ASSERT_VAL("get_cpuid", cpuid);
|
||||
is_intel = strstr(cpuid, "Intel") != NULL;
|
||||
|
||||
TEST_ASSERT_EQUAL("ids_union", test_ids_union(), 0);
|
||||
|
||||
@ -245,12 +243,19 @@ static int test__expr(struct test_suite *t __maybe_unused, int subtest __maybe_u
|
||||
if (num_dies) // Some platforms do not have CPU die support, for example s390
|
||||
TEST_ASSERT_VAL("#num_dies >= #num_packages", num_dies >= num_packages);
|
||||
|
||||
TEST_ASSERT_VAL("#system_tsc_freq", expr__parse(&val, ctx, "#system_tsc_freq") == 0);
|
||||
if (is_intel)
|
||||
TEST_ASSERT_VAL("#system_tsc_freq > 0", val > 0);
|
||||
else
|
||||
TEST_ASSERT_VAL("#system_tsc_freq == 0", fpclassify(val) == FP_ZERO);
|
||||
|
||||
if (expr__parse(&val, ctx, "#system_tsc_freq") == 0) {
|
||||
bool is_intel = strstr(cpuid, "Intel") != NULL;
|
||||
|
||||
if (is_intel)
|
||||
TEST_ASSERT_VAL("#system_tsc_freq > 0", val > 0);
|
||||
else
|
||||
TEST_ASSERT_VAL("#system_tsc_freq == 0", fpclassify(val) == FP_ZERO);
|
||||
} else {
|
||||
#if defined(__i386__) || defined(__x86_64__)
|
||||
TEST_ASSERT_VAL("#system_tsc_freq unsupported", 0);
|
||||
#endif
|
||||
}
|
||||
/*
|
||||
* Source count returns the number of events aggregating in a leader
|
||||
* event including the leader. Check parsing yields an id.
|
||||
|
@ -65,7 +65,7 @@ static struct perf_pmu *test_pmu_get(char *dir, size_t sz)
|
||||
{ "temp2_label", "test hwmon event2\n", },
|
||||
{ "temp2_input", "50000\n", },
|
||||
};
|
||||
int dirfd, file;
|
||||
int hwmon_dirfd = -1, test_dirfd = -1, file;
|
||||
struct perf_pmu *hwm = NULL;
|
||||
ssize_t len;
|
||||
|
||||
@ -76,19 +76,24 @@ static struct perf_pmu *test_pmu_get(char *dir, size_t sz)
|
||||
dir[0] = '\0';
|
||||
return NULL;
|
||||
}
|
||||
dirfd = open(dir, O_DIRECTORY);
|
||||
if (dirfd < 0) {
|
||||
test_dirfd = open(dir, O_PATH|O_DIRECTORY);
|
||||
if (test_dirfd < 0) {
|
||||
pr_err("Failed to open test directory \"%s\"\n", dir);
|
||||
goto err_out;
|
||||
}
|
||||
|
||||
/* Create the test hwmon directory and give it a name. */
|
||||
if (mkdirat(dirfd, "hwmon1234", 0755) < 0) {
|
||||
if (mkdirat(test_dirfd, "hwmon1234", 0755) < 0) {
|
||||
pr_err("Failed to mkdir hwmon directory\n");
|
||||
goto err_out;
|
||||
}
|
||||
file = openat(dirfd, "hwmon1234/name", O_WRONLY | O_CREAT, 0600);
|
||||
if (!file) {
|
||||
hwmon_dirfd = openat(test_dirfd, "hwmon1234", O_DIRECTORY);
|
||||
if (hwmon_dirfd < 0) {
|
||||
pr_err("Failed to open test hwmon directory \"%s/hwmon1234\"\n", dir);
|
||||
goto err_out;
|
||||
}
|
||||
file = openat(hwmon_dirfd, "name", O_WRONLY | O_CREAT, 0600);
|
||||
if (file < 0) {
|
||||
pr_err("Failed to open for writing file \"name\"\n");
|
||||
goto err_out;
|
||||
}
|
||||
@ -104,8 +109,8 @@ static struct perf_pmu *test_pmu_get(char *dir, size_t sz)
|
||||
for (size_t i = 0; i < ARRAY_SIZE(test_items); i++) {
|
||||
const struct test_item *item = &test_items[i];
|
||||
|
||||
file = openat(dirfd, item->name, O_WRONLY | O_CREAT, 0600);
|
||||
if (!file) {
|
||||
file = openat(hwmon_dirfd, item->name, O_WRONLY | O_CREAT, 0600);
|
||||
if (file < 0) {
|
||||
pr_err("Failed to open for writing file \"%s\"\n", item->name);
|
||||
goto err_out;
|
||||
}
|
||||
@ -119,16 +124,18 @@ static struct perf_pmu *test_pmu_get(char *dir, size_t sz)
|
||||
}
|
||||
|
||||
/* Make the PMU reading the files created above. */
|
||||
hwm = perf_pmus__add_test_hwmon_pmu(dirfd, "hwmon1234", test_hwmon_name);
|
||||
hwm = perf_pmus__add_test_hwmon_pmu(hwmon_dirfd, "hwmon1234", test_hwmon_name);
|
||||
if (!hwm)
|
||||
pr_err("Test hwmon creation failed\n");
|
||||
|
||||
err_out:
|
||||
if (!hwm) {
|
||||
test_pmu_put(dir, hwm);
|
||||
if (dirfd >= 0)
|
||||
close(dirfd);
|
||||
if (hwmon_dirfd >= 0)
|
||||
close(hwmon_dirfd);
|
||||
}
|
||||
if (test_dirfd >= 0)
|
||||
close(test_dirfd);
|
||||
return hwm;
|
||||
}
|
||||
|
||||
|
@ -13,13 +13,14 @@ printf "static const char *fs_at_flags[] = {\n"
|
||||
regex='^[[:space:]]*#[[:space:]]*define[[:space:]]+AT_([^_]+[[:alnum:]_]+)[[:space:]]+(0x[[:xdigit:]]+)[[:space:]]*.*'
|
||||
# AT_EACCESS is only meaningful to faccessat, so we will special case it there...
|
||||
# AT_STATX_SYNC_TYPE is not a bit, its a mask of AT_STATX_SYNC_AS_STAT, AT_STATX_FORCE_SYNC and AT_STATX_DONT_SYNC
|
||||
# AT_HANDLE_FID and AT_HANDLE_MNT_ID_UNIQUE are reusing values and are valid only for name_to_handle_at()
|
||||
# AT_HANDLE_FID, AT_HANDLE_MNT_ID_UNIQUE and AT_HANDLE_CONNECTABLE are reusing values and are valid only for name_to_handle_at()
|
||||
# AT_RENAME_NOREPLACE reuses 0x1 and is valid only for renameat2()
|
||||
grep -E $regex ${linux_fcntl} | \
|
||||
grep -v AT_EACCESS | \
|
||||
grep -v AT_STATX_SYNC_TYPE | \
|
||||
grep -v AT_HANDLE_FID | \
|
||||
grep -v AT_HANDLE_MNT_ID_UNIQUE | \
|
||||
grep -v AT_HANDLE_CONNECTABLE | \
|
||||
grep -v AT_RENAME_NOREPLACE | \
|
||||
sed -r "s/$regex/\2 \1/g" | \
|
||||
xargs printf "\t[ilog2(%s) + 1] = \"%s\",\n"
|
||||
|
@ -153,9 +153,6 @@
|
||||
object identity and may not be
|
||||
usable with open_by_handle_at(2). */
|
||||
#define AT_HANDLE_MNT_ID_UNIQUE 0x001 /* Return the u64 unique mount ID. */
|
||||
|
||||
#if defined(__KERNEL__)
|
||||
#define AT_GETATTR_NOSEC 0x80000000
|
||||
#endif
|
||||
#define AT_HANDLE_CONNECTABLE 0x002 /* Request a connectable file handle */
|
||||
|
||||
#endif /* _UAPI_LINUX_FCNTL_H */
|
||||
|
@ -154,7 +154,7 @@ struct mount_attr {
|
||||
*/
|
||||
struct statmount {
|
||||
__u32 size; /* Total size, including strings */
|
||||
__u32 mnt_opts; /* [str] Mount options of the mount */
|
||||
__u32 mnt_opts; /* [str] Options (comma separated, escaped) */
|
||||
__u64 mask; /* What results were written */
|
||||
__u32 sb_dev_major; /* Device ID */
|
||||
__u32 sb_dev_minor;
|
||||
@ -173,7 +173,13 @@ struct statmount {
|
||||
__u32 mnt_root; /* [str] Root of mount relative to root of fs */
|
||||
__u32 mnt_point; /* [str] Mountpoint relative to current root */
|
||||
__u64 mnt_ns_id; /* ID of the mount namespace */
|
||||
__u64 __spare2[49];
|
||||
__u32 fs_subtype; /* [str] Subtype of fs_type (if any) */
|
||||
__u32 sb_source; /* [str] Source string of the mount */
|
||||
__u32 opt_num; /* Number of fs options */
|
||||
__u32 opt_array; /* [str] Array of nul terminated fs options */
|
||||
__u32 opt_sec_num; /* Number of security options */
|
||||
__u32 opt_sec_array; /* [str] Array of nul terminated security options */
|
||||
__u64 __spare2[46];
|
||||
char str[]; /* Variable size part containing strings */
|
||||
};
|
||||
|
||||
@ -207,6 +213,10 @@ struct mnt_id_req {
|
||||
#define STATMOUNT_FS_TYPE 0x00000020U /* Want/got fs_type */
|
||||
#define STATMOUNT_MNT_NS_ID 0x00000040U /* Want/got mnt_ns_id */
|
||||
#define STATMOUNT_MNT_OPTS 0x00000080U /* Want/got mnt_opts */
|
||||
#define STATMOUNT_FS_SUBTYPE 0x00000100U /* Want/got fs_subtype */
|
||||
#define STATMOUNT_SB_SOURCE 0x00000200U /* Want/got sb_source */
|
||||
#define STATMOUNT_OPT_ARRAY 0x00000400U /* Want/got opt_... */
|
||||
#define STATMOUNT_OPT_SEC_ARRAY 0x00000800U /* Want/got opt_sec... */
|
||||
|
||||
/*
|
||||
* Special @mnt_id values that can be passed to listmount
|
||||
|
@ -230,7 +230,7 @@ struct prctl_mm_map {
|
||||
# define PR_PAC_APDBKEY (1UL << 3)
|
||||
# define PR_PAC_APGAKEY (1UL << 4)
|
||||
|
||||
/* Tagged user address controls for arm64 */
|
||||
/* Tagged user address controls for arm64 and RISC-V */
|
||||
#define PR_SET_TAGGED_ADDR_CTRL 55
|
||||
#define PR_GET_TAGGED_ADDR_CTRL 56
|
||||
# define PR_TAGGED_ADDR_ENABLE (1UL << 0)
|
||||
@ -244,6 +244,9 @@ struct prctl_mm_map {
|
||||
# define PR_MTE_TAG_MASK (0xffffUL << PR_MTE_TAG_SHIFT)
|
||||
/* Unused; kept only for source compatibility */
|
||||
# define PR_MTE_TCF_SHIFT 1
|
||||
/* RISC-V pointer masking tag length */
|
||||
# define PR_PMLEN_SHIFT 24
|
||||
# define PR_PMLEN_MASK (0x7fUL << PR_PMLEN_SHIFT)
|
||||
|
||||
/* Control reclaim behavior when allocating memory */
|
||||
#define PR_SET_IO_FLUSHER 57
|
||||
@ -328,4 +331,26 @@ struct prctl_mm_map {
|
||||
# define PR_PPC_DEXCR_CTRL_CLEAR_ONEXEC 0x10 /* Clear the aspect on exec */
|
||||
# define PR_PPC_DEXCR_CTRL_MASK 0x1f
|
||||
|
||||
/*
|
||||
* Get the current shadow stack configuration for the current thread,
|
||||
* this will be the value configured via PR_SET_SHADOW_STACK_STATUS.
|
||||
*/
|
||||
#define PR_GET_SHADOW_STACK_STATUS 74
|
||||
|
||||
/*
|
||||
* Set the current shadow stack configuration. Enabling the shadow
|
||||
* stack will cause a shadow stack to be allocated for the thread.
|
||||
*/
|
||||
#define PR_SET_SHADOW_STACK_STATUS 75
|
||||
# define PR_SHADOW_STACK_ENABLE (1UL << 0)
|
||||
# define PR_SHADOW_STACK_WRITE (1UL << 1)
|
||||
# define PR_SHADOW_STACK_PUSH (1UL << 2)
|
||||
|
||||
/*
|
||||
* Prevent further changes to the specified shadow stack
|
||||
* configuration. All bits may be locked via this call, including
|
||||
* undefined bits.
|
||||
*/
|
||||
#define PR_LOCK_SHADOW_STACK_STATUS 76
|
||||
|
||||
#endif /* _LINUX_PRCTL_H */
|
||||
|
@ -277,7 +277,7 @@ static int write_buildid(const char *name, size_t name_len, struct build_id *bid
|
||||
struct perf_record_header_build_id b;
|
||||
size_t len;
|
||||
|
||||
len = sizeof(b) + name_len + 1;
|
||||
len = name_len + 1;
|
||||
len = PERF_ALIGN(len, sizeof(u64));
|
||||
|
||||
memset(&b, 0, sizeof(b));
|
||||
@ -286,7 +286,7 @@ static int write_buildid(const char *name, size_t name_len, struct build_id *bid
|
||||
misc |= PERF_RECORD_MISC_BUILD_ID_SIZE;
|
||||
b.pid = pid;
|
||||
b.header.misc = misc;
|
||||
b.header.size = len;
|
||||
b.header.size = sizeof(b) + len;
|
||||
|
||||
err = do_write(fd, &b, sizeof(b));
|
||||
if (err < 0)
|
||||
|
@ -2571,12 +2571,12 @@ try_fallback:
|
||||
if (err == -EMFILE && rlimit__increase_nofile(&set_rlimit))
|
||||
goto retry_open;
|
||||
|
||||
if (err == -EOPNOTSUPP && evsel__precise_ip_fallback(evsel))
|
||||
goto retry_open;
|
||||
|
||||
if (err == -EINVAL && evsel__detect_missing_features(evsel))
|
||||
goto fallback_missing_features;
|
||||
|
||||
if (evsel__precise_ip_fallback(evsel))
|
||||
goto retry_open;
|
||||
|
||||
if (evsel__handle_error_quirks(evsel, err))
|
||||
goto retry_open;
|
||||
|
||||
|
@ -258,8 +258,12 @@ static int hwmon_pmu__read_events(struct hwmon_pmu *pmu)
|
||||
if (pmu->pmu.sysfs_aliases_loaded)
|
||||
return 0;
|
||||
|
||||
/* Use a dup-ed fd as closedir will close it. */
|
||||
dup_fd = dup(pmu->hwmon_dir_fd);
|
||||
/*
|
||||
* Use a dup-ed fd as closedir will close it. Use openat so that the
|
||||
* directory contents are refreshed.
|
||||
*/
|
||||
dup_fd = openat(pmu->hwmon_dir_fd, ".", O_DIRECTORY);
|
||||
|
||||
if (dup_fd == -1)
|
||||
return -ENOMEM;
|
||||
|
||||
@ -336,6 +340,9 @@ static int hwmon_pmu__read_events(struct hwmon_pmu *pmu)
|
||||
close(fd);
|
||||
}
|
||||
}
|
||||
if (hashmap__size(&pmu->events) == 0)
|
||||
pr_debug2("hwmon_pmu: %s has no events\n", pmu->pmu.name);
|
||||
|
||||
hashmap__for_each_entry_safe((&pmu->events), cur, tmp, bkt) {
|
||||
union hwmon_pmu_event_key key = {
|
||||
.type_and_num = cur->key,
|
||||
@ -343,8 +350,8 @@ static int hwmon_pmu__read_events(struct hwmon_pmu *pmu)
|
||||
struct hwmon_pmu_event_value *value = cur->pvalue;
|
||||
|
||||
if (!test_bit(HWMON_ITEM_INPUT, value->items)) {
|
||||
pr_debug("hwmon_pmu: removing event '%s%d' that has no input file\n",
|
||||
hwmon_type_strs[key.type], key.num);
|
||||
pr_debug("hwmon_pmu: %s removing event '%s%d' that has no input file\n",
|
||||
pmu->pmu.name, hwmon_type_strs[key.type], key.num);
|
||||
hashmap__delete(&pmu->events, key.type_and_num, &key, &value);
|
||||
zfree(&value->label);
|
||||
zfree(&value->name);
|
||||
|
@ -134,6 +134,8 @@ struct machine *machine__new_host(void)
|
||||
|
||||
if (machine__create_kernel_maps(machine) < 0)
|
||||
goto out_delete;
|
||||
|
||||
machine->env = &perf_env;
|
||||
}
|
||||
|
||||
return machine;
|
||||
|
@ -1370,7 +1370,7 @@ int parse_line_range_desc(const char *arg, struct line_range *lr)
|
||||
{
|
||||
char *buf = strdup(arg);
|
||||
char *p;
|
||||
int err;
|
||||
int err = 0;
|
||||
|
||||
if (!buf)
|
||||
return -ENOMEM;
|
||||
|
Loading…
x
Reference in New Issue
Block a user