You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
Merge branch 'perf-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull perf fixes from Ingo Molnar: "This includes perf namespace support kernel side fixes, plus an accumulated set of perf tooling fixes - including UAPI header synchronization that should make the perf build less noisy" * 'perf-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: (31 commits) tooling/headers: Synchronize updated s390 and x86 UAPI headers tools headers: Syncronize mman.h ABI header tools headers: Synchronize prctl.h ABI header tools headers: Synchronize KVM arch ABI headers tools headers: Synchronize drm/i915_drm.h tools headers uapi: Synchronize drm/drm.h tools headers: Synchronize perf_event.h header tools headers: Synchronize kernel ABI headers wrt SPDX tags tools/headers: Synchronize kernel x86 UAPI headers perf intel-pt: Bring instruction decoder files into line with the kernel perf test: Fix test 21 for s390x perf bench numa: Fixup discontiguous/sparse numa nodes perf top: Use signal interface for SIGWINCH handler perf top: Fix window dimensions change handling perf: Fix header.size for namespace events perf top: Ignore kptr_restrict when not sampling the kernel perf record: Ignore kptr_restrict when not sampling the kernel perf report: Ignore kptr_restrict when not sampling the kernel perf evlist: Add helper to check if attr.exclude_kernel is set in all evsels perf test shell: Fix test case probe libc's inet_pton on s390x ...
This commit is contained in:
@@ -6639,6 +6639,7 @@ static void perf_event_namespaces_output(struct perf_event *event,
|
||||
struct perf_namespaces_event *namespaces_event = data;
|
||||
struct perf_output_handle handle;
|
||||
struct perf_sample_data sample;
|
||||
u16 header_size = namespaces_event->event_id.header.size;
|
||||
int ret;
|
||||
|
||||
if (!perf_event_namespaces_match(event))
|
||||
@@ -6649,7 +6650,7 @@ static void perf_event_namespaces_output(struct perf_event *event,
|
||||
ret = perf_output_begin(&handle, event,
|
||||
namespaces_event->event_id.header.size);
|
||||
if (ret)
|
||||
return;
|
||||
goto out;
|
||||
|
||||
namespaces_event->event_id.pid = perf_event_pid(event,
|
||||
namespaces_event->task);
|
||||
@@ -6661,6 +6662,8 @@ static void perf_event_namespaces_output(struct perf_event *event,
|
||||
perf_event__output_id_sample(event, &handle, &sample);
|
||||
|
||||
perf_output_end(&handle);
|
||||
out:
|
||||
namespaces_event->event_id.header.size = header_size;
|
||||
}
|
||||
|
||||
static void perf_fill_ns_link_info(struct perf_ns_link_info *ns_link_info,
|
||||
|
||||
@@ -152,6 +152,12 @@ struct kvm_arch_memory_slot {
|
||||
(__ARM_CP15_REG(op1, 0, crm, 0) | KVM_REG_SIZE_U64)
|
||||
#define ARM_CP15_REG64(...) __ARM_CP15_REG64(__VA_ARGS__)
|
||||
|
||||
/* PL1 Physical Timer Registers */
|
||||
#define KVM_REG_ARM_PTIMER_CTL ARM_CP15_REG32(0, 14, 2, 1)
|
||||
#define KVM_REG_ARM_PTIMER_CNT ARM_CP15_REG64(0, 14)
|
||||
#define KVM_REG_ARM_PTIMER_CVAL ARM_CP15_REG64(2, 14)
|
||||
|
||||
/* Virtual Timer Registers */
|
||||
#define KVM_REG_ARM_TIMER_CTL ARM_CP15_REG32(0, 14, 3, 1)
|
||||
#define KVM_REG_ARM_TIMER_CNT ARM_CP15_REG64(1, 14)
|
||||
#define KVM_REG_ARM_TIMER_CVAL ARM_CP15_REG64(3, 14)
|
||||
@@ -216,6 +222,7 @@ struct kvm_arch_memory_slot {
|
||||
#define KVM_DEV_ARM_ITS_SAVE_TABLES 1
|
||||
#define KVM_DEV_ARM_ITS_RESTORE_TABLES 2
|
||||
#define KVM_DEV_ARM_VGIC_SAVE_PENDING_TABLES 3
|
||||
#define KVM_DEV_ARM_ITS_CTRL_RESET 4
|
||||
|
||||
/* KVM_IRQ_LINE irq field index values */
|
||||
#define KVM_ARM_IRQ_TYPE_SHIFT 24
|
||||
|
||||
@@ -196,6 +196,12 @@ struct kvm_arch_memory_slot {
|
||||
|
||||
#define ARM64_SYS_REG(...) (__ARM64_SYS_REG(__VA_ARGS__) | KVM_REG_SIZE_U64)
|
||||
|
||||
/* Physical Timer EL0 Registers */
|
||||
#define KVM_REG_ARM_PTIMER_CTL ARM64_SYS_REG(3, 3, 14, 2, 1)
|
||||
#define KVM_REG_ARM_PTIMER_CVAL ARM64_SYS_REG(3, 3, 14, 2, 2)
|
||||
#define KVM_REG_ARM_PTIMER_CNT ARM64_SYS_REG(3, 3, 14, 0, 1)
|
||||
|
||||
/* EL0 Virtual Timer Registers */
|
||||
#define KVM_REG_ARM_TIMER_CTL ARM64_SYS_REG(3, 3, 14, 3, 1)
|
||||
#define KVM_REG_ARM_TIMER_CNT ARM64_SYS_REG(3, 3, 14, 3, 2)
|
||||
#define KVM_REG_ARM_TIMER_CVAL ARM64_SYS_REG(3, 3, 14, 0, 2)
|
||||
@@ -228,6 +234,7 @@ struct kvm_arch_memory_slot {
|
||||
#define KVM_DEV_ARM_ITS_SAVE_TABLES 1
|
||||
#define KVM_DEV_ARM_ITS_RESTORE_TABLES 2
|
||||
#define KVM_DEV_ARM_VGIC_SAVE_PENDING_TABLES 3
|
||||
#define KVM_DEV_ARM_ITS_CTRL_RESET 4
|
||||
|
||||
/* Device Control API on vcpu fd */
|
||||
#define KVM_ARM_VCPU_PMU_V3_CTRL 0
|
||||
|
||||
@@ -6,10 +6,6 @@
|
||||
*
|
||||
* Copyright IBM Corp. 2008
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License (version 2 only)
|
||||
* as published by the Free Software Foundation.
|
||||
*
|
||||
* Author(s): Carsten Otte <cotte@de.ibm.com>
|
||||
* Christian Borntraeger <borntraeger@de.ibm.com>
|
||||
*/
|
||||
|
||||
@@ -4,10 +4,6 @@
|
||||
*
|
||||
* Copyright 2014 IBM Corp.
|
||||
* Author(s): Alexander Yarygin <yarygin@linux.vnet.ibm.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License (version 2 only)
|
||||
* as published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#ifndef __LINUX_KVM_PERF_S390_H
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -16,6 +16,12 @@
|
||||
# define DISABLE_MPX (1<<(X86_FEATURE_MPX & 31))
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_X86_INTEL_UMIP
|
||||
# define DISABLE_UMIP 0
|
||||
#else
|
||||
# define DISABLE_UMIP (1<<(X86_FEATURE_UMIP & 31))
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_X86_64
|
||||
# define DISABLE_VME (1<<(X86_FEATURE_VME & 31))
|
||||
# define DISABLE_K6_MTRR (1<<(X86_FEATURE_K6_MTRR & 31))
|
||||
@@ -63,7 +69,7 @@
|
||||
#define DISABLED_MASK13 0
|
||||
#define DISABLED_MASK14 0
|
||||
#define DISABLED_MASK15 0
|
||||
#define DISABLED_MASK16 (DISABLE_PKU|DISABLE_OSPKE|DISABLE_LA57)
|
||||
#define DISABLED_MASK16 (DISABLE_PKU|DISABLE_OSPKE|DISABLE_LA57|DISABLE_UMIP)
|
||||
#define DISABLED_MASK17 0
|
||||
#define DISABLED_MASK_CHECK BUILD_BUG_ON_ZERO(NCAPINTS != 18)
|
||||
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
#define MAP_NONBLOCK 0x10000 /* do not block on IO */
|
||||
#define MAP_STACK 0x20000 /* give out an address that is best suited for process/thread stacks */
|
||||
#define MAP_HUGETLB 0x40000 /* create a huge page mapping */
|
||||
#define MAP_SYNC 0x80000 /* perform synchronous page faults for the mapping */
|
||||
|
||||
/* Bits [26:31] are reserved, see mman-common.h for MAP_HUGETLB usage */
|
||||
|
||||
|
||||
@@ -737,6 +737,28 @@ struct drm_syncobj_array {
|
||||
__u32 pad;
|
||||
};
|
||||
|
||||
/* Query current scanout sequence number */
|
||||
struct drm_crtc_get_sequence {
|
||||
__u32 crtc_id; /* requested crtc_id */
|
||||
__u32 active; /* return: crtc output is active */
|
||||
__u64 sequence; /* return: most recent vblank sequence */
|
||||
__s64 sequence_ns; /* return: most recent time of first pixel out */
|
||||
};
|
||||
|
||||
/* Queue event to be delivered at specified sequence. Time stamp marks
|
||||
* when the first pixel of the refresh cycle leaves the display engine
|
||||
* for the display
|
||||
*/
|
||||
#define DRM_CRTC_SEQUENCE_RELATIVE 0x00000001 /* sequence is relative to current */
|
||||
#define DRM_CRTC_SEQUENCE_NEXT_ON_MISS 0x00000002 /* Use next sequence if we've missed */
|
||||
|
||||
struct drm_crtc_queue_sequence {
|
||||
__u32 crtc_id;
|
||||
__u32 flags;
|
||||
__u64 sequence; /* on input, target sequence. on output, actual sequence */
|
||||
__u64 user_data; /* user data passed to event */
|
||||
};
|
||||
|
||||
#if defined(__cplusplus)
|
||||
}
|
||||
#endif
|
||||
@@ -819,6 +841,9 @@ extern "C" {
|
||||
|
||||
#define DRM_IOCTL_WAIT_VBLANK DRM_IOWR(0x3a, union drm_wait_vblank)
|
||||
|
||||
#define DRM_IOCTL_CRTC_GET_SEQUENCE DRM_IOWR(0x3b, struct drm_crtc_get_sequence)
|
||||
#define DRM_IOCTL_CRTC_QUEUE_SEQUENCE DRM_IOWR(0x3c, struct drm_crtc_queue_sequence)
|
||||
|
||||
#define DRM_IOCTL_UPDATE_DRAW DRM_IOW(0x3f, struct drm_update_draw)
|
||||
|
||||
#define DRM_IOCTL_MODE_GETRESOURCES DRM_IOWR(0xA0, struct drm_mode_card_res)
|
||||
@@ -863,6 +888,11 @@ extern "C" {
|
||||
#define DRM_IOCTL_SYNCOBJ_RESET DRM_IOWR(0xC4, struct drm_syncobj_array)
|
||||
#define DRM_IOCTL_SYNCOBJ_SIGNAL DRM_IOWR(0xC5, struct drm_syncobj_array)
|
||||
|
||||
#define DRM_IOCTL_MODE_CREATE_LEASE DRM_IOWR(0xC6, struct drm_mode_create_lease)
|
||||
#define DRM_IOCTL_MODE_LIST_LESSEES DRM_IOWR(0xC7, struct drm_mode_list_lessees)
|
||||
#define DRM_IOCTL_MODE_GET_LEASE DRM_IOWR(0xC8, struct drm_mode_get_lease)
|
||||
#define DRM_IOCTL_MODE_REVOKE_LEASE DRM_IOWR(0xC9, struct drm_mode_revoke_lease)
|
||||
|
||||
/**
|
||||
* Device specific ioctls should only be in their respective headers
|
||||
* The device specific ioctl range is from 0x40 to 0x9f.
|
||||
@@ -893,6 +923,7 @@ struct drm_event {
|
||||
|
||||
#define DRM_EVENT_VBLANK 0x01
|
||||
#define DRM_EVENT_FLIP_COMPLETE 0x02
|
||||
#define DRM_EVENT_CRTC_SEQUENCE 0x03
|
||||
|
||||
struct drm_event_vblank {
|
||||
struct drm_event base;
|
||||
@@ -903,6 +934,16 @@ struct drm_event_vblank {
|
||||
__u32 crtc_id; /* 0 on older kernels that do not support this */
|
||||
};
|
||||
|
||||
/* Event delivered at sequence. Time stamp marks when the first pixel
|
||||
* of the refresh cycle leaves the display engine for the display
|
||||
*/
|
||||
struct drm_event_crtc_sequence {
|
||||
struct drm_event base;
|
||||
__u64 user_data;
|
||||
__s64 time_ns;
|
||||
__u64 sequence;
|
||||
};
|
||||
|
||||
/* typedef area */
|
||||
#ifndef __KERNEL__
|
||||
typedef struct drm_clip_rect drm_clip_rect_t;
|
||||
|
||||
@@ -397,10 +397,20 @@ typedef struct drm_i915_irq_wait {
|
||||
#define I915_PARAM_MIN_EU_IN_POOL 39
|
||||
#define I915_PARAM_MMAP_GTT_VERSION 40
|
||||
|
||||
/* Query whether DRM_I915_GEM_EXECBUFFER2 supports user defined execution
|
||||
/*
|
||||
* Query whether DRM_I915_GEM_EXECBUFFER2 supports user defined execution
|
||||
* priorities and the driver will attempt to execute batches in priority order.
|
||||
* The param returns a capability bitmask, nonzero implies that the scheduler
|
||||
* is enabled, with different features present according to the mask.
|
||||
*
|
||||
* The initial priority for each batch is supplied by the context and is
|
||||
* controlled via I915_CONTEXT_PARAM_PRIORITY.
|
||||
*/
|
||||
#define I915_PARAM_HAS_SCHEDULER 41
|
||||
#define I915_SCHEDULER_CAP_ENABLED (1ul << 0)
|
||||
#define I915_SCHEDULER_CAP_PRIORITY (1ul << 1)
|
||||
#define I915_SCHEDULER_CAP_PREEMPTION (1ul << 2)
|
||||
|
||||
#define I915_PARAM_HUC_STATUS 42
|
||||
|
||||
/* Query whether DRM_I915_GEM_EXECBUFFER2 supports the ability to opt-out of
|
||||
@@ -1309,14 +1319,16 @@ struct drm_i915_reg_read {
|
||||
* be specified
|
||||
*/
|
||||
__u64 offset;
|
||||
#define I915_REG_READ_8B_WA (1ul << 0)
|
||||
|
||||
__u64 val; /* Return value */
|
||||
};
|
||||
/* Known registers:
|
||||
*
|
||||
* Render engine timestamp - 0x2358 + 64bit - gen7+
|
||||
* - Note this register returns an invalid value if using the default
|
||||
* single instruction 8byte read, in order to workaround that use
|
||||
* offset (0x2538 | 1) instead.
|
||||
* single instruction 8byte read, in order to workaround that pass
|
||||
* flag I915_REG_READ_8B_WA in offset field.
|
||||
*
|
||||
*/
|
||||
|
||||
@@ -1359,6 +1371,10 @@ struct drm_i915_gem_context_param {
|
||||
#define I915_CONTEXT_PARAM_GTT_SIZE 0x3
|
||||
#define I915_CONTEXT_PARAM_NO_ERROR_CAPTURE 0x4
|
||||
#define I915_CONTEXT_PARAM_BANNABLE 0x5
|
||||
#define I915_CONTEXT_PARAM_PRIORITY 0x6
|
||||
#define I915_CONTEXT_MAX_USER_PRIORITY 1023 /* inclusive */
|
||||
#define I915_CONTEXT_DEFAULT_PRIORITY 0
|
||||
#define I915_CONTEXT_MIN_USER_PRIORITY -1023 /* inclusive */
|
||||
__u64 value;
|
||||
};
|
||||
|
||||
@@ -1510,9 +1526,14 @@ struct drm_i915_perf_oa_config {
|
||||
__u32 n_boolean_regs;
|
||||
__u32 n_flex_regs;
|
||||
|
||||
__u64 __user mux_regs_ptr;
|
||||
__u64 __user boolean_regs_ptr;
|
||||
__u64 __user flex_regs_ptr;
|
||||
/*
|
||||
* These fields are pointers to tuples of u32 values (register
|
||||
* address, value). For example the expected length of the buffer
|
||||
* pointed by mux_regs_ptr is (2 * sizeof(u32) * n_mux_regs).
|
||||
*/
|
||||
__u64 mux_regs_ptr;
|
||||
__u64 boolean_regs_ptr;
|
||||
__u64 flex_regs_ptr;
|
||||
};
|
||||
|
||||
#if defined(__cplusplus)
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
|
||||
#ifndef _UAPI_LINUX_KCMP_H
|
||||
#define _UAPI_LINUX_KCMP_H
|
||||
|
||||
|
||||
@@ -931,6 +931,7 @@ struct kvm_ppc_resize_hpt {
|
||||
#define KVM_CAP_PPC_SMT_POSSIBLE 147
|
||||
#define KVM_CAP_HYPERV_SYNIC2 148
|
||||
#define KVM_CAP_HYPERV_VP_INDEX 149
|
||||
#define KVM_CAP_S390_AIS_MIGRATION 150
|
||||
|
||||
#ifdef KVM_CAP_IRQ_ROUTING
|
||||
|
||||
|
||||
@@ -942,6 +942,7 @@ enum perf_callchain_context {
|
||||
#define PERF_AUX_FLAG_TRUNCATED 0x01 /* record was truncated to fit */
|
||||
#define PERF_AUX_FLAG_OVERWRITE 0x02 /* snapshot from overwrite mode */
|
||||
#define PERF_AUX_FLAG_PARTIAL 0x04 /* record contains gaps */
|
||||
#define PERF_AUX_FLAG_COLLISION 0x08 /* sample collided with another */
|
||||
|
||||
#define PERF_FLAG_FD_NO_GROUP (1UL << 0)
|
||||
#define PERF_FLAG_FD_OUTPUT (1UL << 1)
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
|
||||
#ifndef _LINUX_PRCTL_H
|
||||
#define _LINUX_PRCTL_H
|
||||
|
||||
@@ -197,4 +198,13 @@ struct prctl_mm_map {
|
||||
# define PR_CAP_AMBIENT_LOWER 3
|
||||
# define PR_CAP_AMBIENT_CLEAR_ALL 4
|
||||
|
||||
/* arm64 Scalable Vector Extension controls */
|
||||
/* Flag values must be kept in sync with ptrace NT_ARM_SVE interface */
|
||||
#define PR_SVE_SET_VL 50 /* set task vector length */
|
||||
# define PR_SVE_SET_VL_ONEXEC (1 << 18) /* defer effect until exec */
|
||||
#define PR_SVE_GET_VL 51 /* get task vector length */
|
||||
/* Bits common to PR_SVE_SET_VL and PR_SVE_GET_VL */
|
||||
# define PR_SVE_VL_LEN_MASK 0xffff
|
||||
# define PR_SVE_VL_INHERIT (1 << 17) /* inherit across exec */
|
||||
|
||||
#endif /* _LINUX_PRCTL_H */
|
||||
|
||||
+51
-5
@@ -216,6 +216,47 @@ static const char * const numa_usage[] = {
|
||||
NULL
|
||||
};
|
||||
|
||||
/*
|
||||
* To get number of numa nodes present.
|
||||
*/
|
||||
static int nr_numa_nodes(void)
|
||||
{
|
||||
int i, nr_nodes = 0;
|
||||
|
||||
for (i = 0; i < g->p.nr_nodes; i++) {
|
||||
if (numa_bitmask_isbitset(numa_nodes_ptr, i))
|
||||
nr_nodes++;
|
||||
}
|
||||
|
||||
return nr_nodes;
|
||||
}
|
||||
|
||||
/*
|
||||
* To check if given numa node is present.
|
||||
*/
|
||||
static int is_node_present(int node)
|
||||
{
|
||||
return numa_bitmask_isbitset(numa_nodes_ptr, node);
|
||||
}
|
||||
|
||||
/*
|
||||
* To check given numa node has cpus.
|
||||
*/
|
||||
static bool node_has_cpus(int node)
|
||||
{
|
||||
struct bitmask *cpu = numa_allocate_cpumask();
|
||||
unsigned int i;
|
||||
|
||||
if (cpu && !numa_node_to_cpus(node, cpu)) {
|
||||
for (i = 0; i < cpu->size; i++) {
|
||||
if (numa_bitmask_isbitset(cpu, i))
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false; /* lets fall back to nocpus safely */
|
||||
}
|
||||
|
||||
static cpu_set_t bind_to_cpu(int target_cpu)
|
||||
{
|
||||
cpu_set_t orig_mask, mask;
|
||||
@@ -244,12 +285,12 @@ static cpu_set_t bind_to_cpu(int target_cpu)
|
||||
|
||||
static cpu_set_t bind_to_node(int target_node)
|
||||
{
|
||||
int cpus_per_node = g->p.nr_cpus/g->p.nr_nodes;
|
||||
int cpus_per_node = g->p.nr_cpus / nr_numa_nodes();
|
||||
cpu_set_t orig_mask, mask;
|
||||
int cpu;
|
||||
int ret;
|
||||
|
||||
BUG_ON(cpus_per_node*g->p.nr_nodes != g->p.nr_cpus);
|
||||
BUG_ON(cpus_per_node * nr_numa_nodes() != g->p.nr_cpus);
|
||||
BUG_ON(!cpus_per_node);
|
||||
|
||||
ret = sched_getaffinity(0, sizeof(orig_mask), &orig_mask);
|
||||
@@ -649,7 +690,7 @@ static int parse_setup_node_list(void)
|
||||
int i;
|
||||
|
||||
for (i = 0; i < mul; i++) {
|
||||
if (t >= g->p.nr_tasks) {
|
||||
if (t >= g->p.nr_tasks || !node_has_cpus(bind_node)) {
|
||||
printf("\n# NOTE: ignoring bind NODEs starting at NODE#%d\n", bind_node);
|
||||
goto out;
|
||||
}
|
||||
@@ -964,6 +1005,8 @@ static void calc_convergence(double runtime_ns_max, double *convergence)
|
||||
sum = 0;
|
||||
|
||||
for (node = 0; node < g->p.nr_nodes; node++) {
|
||||
if (!is_node_present(node))
|
||||
continue;
|
||||
nr = nodes[node];
|
||||
nr_min = min(nr, nr_min);
|
||||
nr_max = max(nr, nr_max);
|
||||
@@ -984,8 +1027,11 @@ static void calc_convergence(double runtime_ns_max, double *convergence)
|
||||
process_groups = 0;
|
||||
|
||||
for (node = 0; node < g->p.nr_nodes; node++) {
|
||||
int processes = count_node_processes(node);
|
||||
int processes;
|
||||
|
||||
if (!is_node_present(node))
|
||||
continue;
|
||||
processes = count_node_processes(node);
|
||||
nr = nodes[node];
|
||||
tprintf(" %2d/%-2d", nr, processes);
|
||||
|
||||
@@ -1291,7 +1337,7 @@ static void print_summary(void)
|
||||
|
||||
printf("\n ###\n");
|
||||
printf(" # %d %s will execute (on %d nodes, %d CPUs):\n",
|
||||
g->p.nr_tasks, g->p.nr_tasks == 1 ? "task" : "tasks", g->p.nr_nodes, g->p.nr_cpus);
|
||||
g->p.nr_tasks, g->p.nr_tasks == 1 ? "task" : "tasks", nr_numa_nodes(), g->p.nr_cpus);
|
||||
printf(" # %5dx %5ldMB global shared mem operations\n",
|
||||
g->p.nr_loops, g->p.bytes_global/1024/1024);
|
||||
printf(" # %5dx %5ldMB process shared mem operations\n",
|
||||
|
||||
@@ -284,7 +284,7 @@ static int perf_help_config(const char *var, const char *value, void *cb)
|
||||
add_man_viewer(value);
|
||||
return 0;
|
||||
}
|
||||
if (!strstarts(var, "man."))
|
||||
if (strstarts(var, "man."))
|
||||
return add_man_viewer_info(var, value);
|
||||
|
||||
return 0;
|
||||
@@ -314,7 +314,7 @@ static const char *cmd_to_page(const char *perf_cmd)
|
||||
|
||||
if (!perf_cmd)
|
||||
return "perf";
|
||||
else if (!strstarts(perf_cmd, "perf"))
|
||||
else if (strstarts(perf_cmd, "perf"))
|
||||
return perf_cmd;
|
||||
|
||||
return asprintf(&s, "perf-%s", perf_cmd) < 0 ? NULL : s;
|
||||
|
||||
+29
-11
@@ -339,6 +339,22 @@ static int record__open(struct record *rec)
|
||||
struct perf_evsel_config_term *err_term;
|
||||
int rc = 0;
|
||||
|
||||
/*
|
||||
* For initial_delay we need to add a dummy event so that we can track
|
||||
* PERF_RECORD_MMAP while we wait for the initial delay to enable the
|
||||
* real events, the ones asked by the user.
|
||||
*/
|
||||
if (opts->initial_delay) {
|
||||
if (perf_evlist__add_dummy(evlist))
|
||||
return -ENOMEM;
|
||||
|
||||
pos = perf_evlist__first(evlist);
|
||||
pos->tracking = 0;
|
||||
pos = perf_evlist__last(evlist);
|
||||
pos->tracking = 1;
|
||||
pos->attr.enable_on_exec = 1;
|
||||
}
|
||||
|
||||
perf_evlist__config(evlist, opts, &callchain_param);
|
||||
|
||||
evlist__for_each_entry(evlist, pos) {
|
||||
@@ -749,17 +765,19 @@ static int record__synthesize(struct record *rec, bool tail)
|
||||
goto out;
|
||||
}
|
||||
|
||||
err = perf_event__synthesize_kernel_mmap(tool, process_synthesized_event,
|
||||
machine);
|
||||
WARN_ONCE(err < 0, "Couldn't record kernel reference relocation symbol\n"
|
||||
"Symbol resolution may be skewed if relocation was used (e.g. kexec).\n"
|
||||
"Check /proc/kallsyms permission or run as root.\n");
|
||||
if (!perf_evlist__exclude_kernel(rec->evlist)) {
|
||||
err = perf_event__synthesize_kernel_mmap(tool, process_synthesized_event,
|
||||
machine);
|
||||
WARN_ONCE(err < 0, "Couldn't record kernel reference relocation symbol\n"
|
||||
"Symbol resolution may be skewed if relocation was used (e.g. kexec).\n"
|
||||
"Check /proc/kallsyms permission or run as root.\n");
|
||||
|
||||
err = perf_event__synthesize_modules(tool, process_synthesized_event,
|
||||
machine);
|
||||
WARN_ONCE(err < 0, "Couldn't record kernel module information.\n"
|
||||
"Symbol resolution may be skewed if relocation was used (e.g. kexec).\n"
|
||||
"Check /proc/modules permission or run as root.\n");
|
||||
err = perf_event__synthesize_modules(tool, process_synthesized_event,
|
||||
machine);
|
||||
WARN_ONCE(err < 0, "Couldn't record kernel module information.\n"
|
||||
"Symbol resolution may be skewed if relocation was used (e.g. kexec).\n"
|
||||
"Check /proc/modules permission or run as root.\n");
|
||||
}
|
||||
|
||||
if (perf_guest) {
|
||||
machines__process_guests(&session->machines,
|
||||
@@ -1693,7 +1711,7 @@ int cmd_record(int argc, const char **argv)
|
||||
|
||||
err = -ENOMEM;
|
||||
|
||||
if (symbol_conf.kptr_restrict)
|
||||
if (symbol_conf.kptr_restrict && !perf_evlist__exclude_kernel(rec->evlist))
|
||||
pr_warning(
|
||||
"WARNING: Kernel address maps (/proc/{kallsyms,modules}) are restricted,\n"
|
||||
"check /proc/sys/kernel/kptr_restrict.\n\n"
|
||||
|
||||
@@ -441,6 +441,9 @@ static void report__warn_kptr_restrict(const struct report *rep)
|
||||
struct map *kernel_map = machine__kernel_map(&rep->session->machines.host);
|
||||
struct kmap *kernel_kmap = kernel_map ? map__kmap(kernel_map) : NULL;
|
||||
|
||||
if (perf_evlist__exclude_kernel(rep->session->evlist))
|
||||
return;
|
||||
|
||||
if (kernel_map == NULL ||
|
||||
(kernel_map->dso->hit &&
|
||||
(kernel_kmap->ref_reloc_sym == NULL ||
|
||||
|
||||
@@ -1955,6 +1955,16 @@ static int perf_script__fopen_per_event_dump(struct perf_script *script)
|
||||
struct perf_evsel *evsel;
|
||||
|
||||
evlist__for_each_entry(script->session->evlist, evsel) {
|
||||
/*
|
||||
* Already setup? I.e. we may be called twice in cases like
|
||||
* Intel PT, one for the intel_pt// and dummy events, then
|
||||
* for the evsels syntheized from the auxtrace info.
|
||||
*
|
||||
* Ses perf_script__process_auxtrace_info.
|
||||
*/
|
||||
if (evsel->priv != NULL)
|
||||
continue;
|
||||
|
||||
evsel->priv = perf_evsel_script__new(evsel, script->session->data);
|
||||
if (evsel->priv == NULL)
|
||||
goto out_err_fclose;
|
||||
@@ -2838,6 +2848,25 @@ int process_cpu_map_event(struct perf_tool *tool __maybe_unused,
|
||||
return set_maps(script);
|
||||
}
|
||||
|
||||
#ifdef HAVE_AUXTRACE_SUPPORT
|
||||
static int perf_script__process_auxtrace_info(struct perf_tool *tool,
|
||||
union perf_event *event,
|
||||
struct perf_session *session)
|
||||
{
|
||||
int ret = perf_event__process_auxtrace_info(tool, event, session);
|
||||
|
||||
if (ret == 0) {
|
||||
struct perf_script *script = container_of(tool, struct perf_script, tool);
|
||||
|
||||
ret = perf_script__setup_per_event_dump(script);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
#else
|
||||
#define perf_script__process_auxtrace_info 0
|
||||
#endif
|
||||
|
||||
int cmd_script(int argc, const char **argv)
|
||||
{
|
||||
bool show_full_info = false;
|
||||
@@ -2866,7 +2895,7 @@ int cmd_script(int argc, const char **argv)
|
||||
.feature = perf_event__process_feature,
|
||||
.build_id = perf_event__process_build_id,
|
||||
.id_index = perf_event__process_id_index,
|
||||
.auxtrace_info = perf_event__process_auxtrace_info,
|
||||
.auxtrace_info = perf_script__process_auxtrace_info,
|
||||
.auxtrace = perf_event__process_auxtrace,
|
||||
.auxtrace_error = perf_event__process_auxtrace_error,
|
||||
.stat = perf_event__process_stat_event,
|
||||
|
||||
+19
-17
@@ -77,6 +77,7 @@
|
||||
#include "sane_ctype.h"
|
||||
|
||||
static volatile int done;
|
||||
static volatile int resize;
|
||||
|
||||
#define HEADER_LINE_NR 5
|
||||
|
||||
@@ -85,11 +86,13 @@ static void perf_top__update_print_entries(struct perf_top *top)
|
||||
top->print_entries = top->winsize.ws_row - HEADER_LINE_NR;
|
||||
}
|
||||
|
||||
static void perf_top__sig_winch(int sig __maybe_unused,
|
||||
siginfo_t *info __maybe_unused, void *arg)
|
||||
static void winch_sig(int sig __maybe_unused)
|
||||
{
|
||||
struct perf_top *top = arg;
|
||||
resize = 1;
|
||||
}
|
||||
|
||||
static void perf_top__resize(struct perf_top *top)
|
||||
{
|
||||
get_term_dimensions(&top->winsize);
|
||||
perf_top__update_print_entries(top);
|
||||
}
|
||||
@@ -473,12 +476,8 @@ static bool perf_top__handle_keypress(struct perf_top *top, int c)
|
||||
case 'e':
|
||||
prompt_integer(&top->print_entries, "Enter display entries (lines)");
|
||||
if (top->print_entries == 0) {
|
||||
struct sigaction act = {
|
||||
.sa_sigaction = perf_top__sig_winch,
|
||||
.sa_flags = SA_SIGINFO,
|
||||
};
|
||||
perf_top__sig_winch(SIGWINCH, NULL, top);
|
||||
sigaction(SIGWINCH, &act, NULL);
|
||||
perf_top__resize(top);
|
||||
signal(SIGWINCH, winch_sig);
|
||||
} else {
|
||||
signal(SIGWINCH, SIG_DFL);
|
||||
}
|
||||
@@ -732,14 +731,16 @@ static void perf_event__process_sample(struct perf_tool *tool,
|
||||
if (!machine->kptr_restrict_warned &&
|
||||
symbol_conf.kptr_restrict &&
|
||||
al.cpumode == PERF_RECORD_MISC_KERNEL) {
|
||||
ui__warning(
|
||||
if (!perf_evlist__exclude_kernel(top->session->evlist)) {
|
||||
ui__warning(
|
||||
"Kernel address maps (/proc/{kallsyms,modules}) are restricted.\n\n"
|
||||
"Check /proc/sys/kernel/kptr_restrict.\n\n"
|
||||
"Kernel%s samples will not be resolved.\n",
|
||||
al.map && !RB_EMPTY_ROOT(&al.map->dso->symbols[MAP__FUNCTION]) ?
|
||||
" modules" : "");
|
||||
if (use_browser <= 0)
|
||||
sleep(5);
|
||||
if (use_browser <= 0)
|
||||
sleep(5);
|
||||
}
|
||||
machine->kptr_restrict_warned = true;
|
||||
}
|
||||
|
||||
@@ -1030,6 +1031,11 @@ static int __cmd_top(struct perf_top *top)
|
||||
|
||||
if (hits == top->samples)
|
||||
ret = perf_evlist__poll(top->evlist, 100);
|
||||
|
||||
if (resize) {
|
||||
perf_top__resize(top);
|
||||
resize = 0;
|
||||
}
|
||||
}
|
||||
|
||||
ret = 0;
|
||||
@@ -1352,12 +1358,8 @@ int cmd_top(int argc, const char **argv)
|
||||
|
||||
get_term_dimensions(&top.winsize);
|
||||
if (top.print_entries == 0) {
|
||||
struct sigaction act = {
|
||||
.sa_sigaction = perf_top__sig_winch,
|
||||
.sa_flags = SA_SIGINFO,
|
||||
};
|
||||
perf_top__update_print_entries(&top);
|
||||
sigaction(SIGWINCH, &act, NULL);
|
||||
signal(SIGWINCH, winch_sig);
|
||||
}
|
||||
|
||||
status = __cmd_top(&top);
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user