mirror of
https://github.com/torvalds/linux.git
synced 2024-11-22 12:11:40 +00:00
perf tools fixes for v6.5:
- Don't group events when computing metrics that require more than the maximum number of simultaneously enabled events on AMD systems. - Fix multi CU handling in 'perf probe', add a 'perf test' entry to regress test it. - Make the 'perf test task_exit' stop generating samples by using the 'dummy' event, all it is testing is if a PERF_RECORD_EXIT is generated at the end of a perf session. This makes this perf test to stop sometimes failing on some systems due to a full ring buffer. - Avoid SEGV if PMU lookup fails for legacy cache terms. - Fix libsubcmd SEGV/use-after-free when commands aren't excluded. - Fix OpenCSD (ARM64's CoreSight hardware tracing) library path resolution when specifying CSLIBS= in the make command line. - Fix broken feature check for libtracefs due to external lib changes, use the provided pkgconfig file instead future proof it. - Sync drm, fcntl, kvm, mount, prctl, socket, vhost, asound, arm64's cputype headers with the kernel sources, in some cases this made the tools become aware of new kernel APIs such as ioctls and the cachestat sysctl. Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> -----BEGIN PGP SIGNATURE----- iHUEABYKAB0WIQR2GiIUctdOfX2qHhGyPKLppCJ+JwUCZLbnYwAKCRCyPKLppCJ+ J74PAQD4FOQ1ZPDsE1z5cJZYRnA9T9CVqZtMhr0D0gzTY40ZpAD+JdtX3Qftrpuo rmjgGWzwtAmuQXSqTbFqJ6IsjlCkMw8= =shqX -----END PGP SIGNATURE----- Merge tag 'perf-tools-fixes-for-v6.5-1-2023-07-18' of git://git.kernel.org/pub/scm/linux/kernel/git/perf/perf-tools Pull perf tools fixes from Arnaldo Carvalho de Melo: - Don't group events when computing metrics that require more than the maximum number of simultaneously enabled events on AMD systems. - Fix multi CU handling in 'perf probe', add a 'perf test' entry to regress test it. - Make the 'perf test task_exit' stop generating samples by using the 'dummy' event, all it is testing is if a PERF_RECORD_EXIT is generated at the end of a perf session. This makes this perf test to stop sometimes failing on some systems due to a full ring buffer. - Avoid SEGV if PMU lookup fails for legacy cache terms. - Fix libsubcmd SEGV/use-after-free when commands aren't excluded. - Fix OpenCSD (ARM64's CoreSight hardware tracing) library path resolution when specifying CSLIBS= in the make command line. - Fix broken feature check for libtracefs due to external lib changes, use the provided pkgconfig file instead future proof it. - Sync drm, fcntl, kvm, mount, prctl, socket, vhost, asound, arm64's cputype headers with the kernel sources, in some cases this made the tools become aware of new kernel APIs such as ioctls and the cachestat sysctl. * tag 'perf-tools-fixes-for-v6.5-1-2023-07-18' of git://git.kernel.org/pub/scm/linux/kernel/git/perf/perf-tools: perf test task_exit: No need for a cycles event to check if we get an PERF_RECORD_EXIT tools headers arm64: Sync arm64's cputype.h with the kernel sources tools include UAPI: Sync the sound/asound.h copy with the kernel sources tools include UAPI: Sync linux/vhost.h with the kernel sources perf beauty: Update copy of linux/socket.h with the kernel sources perf parse-events: Avoid SEGV if PMU lookup fails for legacy cache terms libsubcmd: Avoid SEGV/use-after-free when commands aren't excluded tools headers UAPI: Sync linux/prctl.h with the kernel sources perf build: Fix broken feature check for libtracefs due to external lib changes tools include UAPI: Sync linux/mount.h copy with the kernel sources tools headers UAPI: Sync linux/kvm.h with the kernel sources tools headers uapi: Sync linux/fcntl.h with the kernel sources perf vendor events amd: Fix large metrics perf build: Fix library not found error when using CSLIBS tools headers UAPI: Sync files changed by new cachestat syscall with the kernel sources tools headers UAPI: Sync drm/i915_drm.h with the kernel sources perf probe: Read DWARF files from the correct CU perf probe: Add test for regression introduced by switch to die_get_decl_file()
This commit is contained in:
commit
ccff6d117d
@ -126,6 +126,10 @@
|
||||
#define APPLE_CPU_PART_M1_FIRESTORM_MAX 0x029
|
||||
#define APPLE_CPU_PART_M2_BLIZZARD 0x032
|
||||
#define APPLE_CPU_PART_M2_AVALANCHE 0x033
|
||||
#define APPLE_CPU_PART_M2_BLIZZARD_PRO 0x034
|
||||
#define APPLE_CPU_PART_M2_AVALANCHE_PRO 0x035
|
||||
#define APPLE_CPU_PART_M2_BLIZZARD_MAX 0x038
|
||||
#define APPLE_CPU_PART_M2_AVALANCHE_MAX 0x039
|
||||
|
||||
#define AMPERE_CPU_PART_AMPERE1 0xAC3
|
||||
|
||||
@ -181,6 +185,10 @@
|
||||
#define MIDR_APPLE_M1_FIRESTORM_MAX MIDR_CPU_MODEL(ARM_CPU_IMP_APPLE, APPLE_CPU_PART_M1_FIRESTORM_MAX)
|
||||
#define MIDR_APPLE_M2_BLIZZARD MIDR_CPU_MODEL(ARM_CPU_IMP_APPLE, APPLE_CPU_PART_M2_BLIZZARD)
|
||||
#define MIDR_APPLE_M2_AVALANCHE MIDR_CPU_MODEL(ARM_CPU_IMP_APPLE, APPLE_CPU_PART_M2_AVALANCHE)
|
||||
#define MIDR_APPLE_M2_BLIZZARD_PRO MIDR_CPU_MODEL(ARM_CPU_IMP_APPLE, APPLE_CPU_PART_M2_BLIZZARD_PRO)
|
||||
#define MIDR_APPLE_M2_AVALANCHE_PRO MIDR_CPU_MODEL(ARM_CPU_IMP_APPLE, APPLE_CPU_PART_M2_AVALANCHE_PRO)
|
||||
#define MIDR_APPLE_M2_BLIZZARD_MAX MIDR_CPU_MODEL(ARM_CPU_IMP_APPLE, APPLE_CPU_PART_M2_BLIZZARD_MAX)
|
||||
#define MIDR_APPLE_M2_AVALANCHE_MAX MIDR_CPU_MODEL(ARM_CPU_IMP_APPLE, APPLE_CPU_PART_M2_AVALANCHE_MAX)
|
||||
#define MIDR_AMPERE1 MIDR_CPU_MODEL(ARM_CPU_IMP_AMPERE, AMPERE_CPU_PART_AMPERE1)
|
||||
|
||||
/* Fujitsu Erratum 010001 affects A64FX 1.0 and 1.1, (v0r0 and v1r0) */
|
||||
|
@ -208,7 +208,7 @@ $(OUTPUT)test-libtraceevent.bin:
|
||||
$(BUILD) -ltraceevent
|
||||
|
||||
$(OUTPUT)test-libtracefs.bin:
|
||||
$(BUILD) -ltracefs
|
||||
$(BUILD) $(shell $(PKG_CONFIG) --cflags libtraceevent 2>/dev/null) -ltracefs
|
||||
|
||||
$(OUTPUT)test-libcrypto.bin:
|
||||
$(BUILD) -lcrypto
|
||||
|
@ -817,8 +817,11 @@ __SYSCALL(__NR_futex_waitv, sys_futex_waitv)
|
||||
#define __NR_set_mempolicy_home_node 450
|
||||
__SYSCALL(__NR_set_mempolicy_home_node, sys_set_mempolicy_home_node)
|
||||
|
||||
#define __NR_cachestat 451
|
||||
__SYSCALL(__NR_cachestat, sys_cachestat)
|
||||
|
||||
#undef __NR_syscalls
|
||||
#define __NR_syscalls 451
|
||||
#define __NR_syscalls 452
|
||||
|
||||
/*
|
||||
* 32 bit systems traditionally used different
|
||||
|
@ -280,7 +280,16 @@ enum drm_i915_pmu_engine_sample {
|
||||
#define I915_PMU_ENGINE_SEMA(class, instance) \
|
||||
__I915_PMU_ENGINE(class, instance, I915_SAMPLE_SEMA)
|
||||
|
||||
#define __I915_PMU_OTHER(x) (__I915_PMU_ENGINE(0xff, 0xff, 0xf) + 1 + (x))
|
||||
/*
|
||||
* Top 4 bits of every non-engine counter are GT id.
|
||||
*/
|
||||
#define __I915_PMU_GT_SHIFT (60)
|
||||
|
||||
#define ___I915_PMU_OTHER(gt, x) \
|
||||
(((__u64)__I915_PMU_ENGINE(0xff, 0xff, 0xf) + 1 + (x)) | \
|
||||
((__u64)(gt) << __I915_PMU_GT_SHIFT))
|
||||
|
||||
#define __I915_PMU_OTHER(x) ___I915_PMU_OTHER(0, x)
|
||||
|
||||
#define I915_PMU_ACTUAL_FREQUENCY __I915_PMU_OTHER(0)
|
||||
#define I915_PMU_REQUESTED_FREQUENCY __I915_PMU_OTHER(1)
|
||||
@ -290,6 +299,12 @@ enum drm_i915_pmu_engine_sample {
|
||||
|
||||
#define I915_PMU_LAST /* Deprecated - do not use */ I915_PMU_RC6_RESIDENCY
|
||||
|
||||
#define __I915_PMU_ACTUAL_FREQUENCY(gt) ___I915_PMU_OTHER(gt, 0)
|
||||
#define __I915_PMU_REQUESTED_FREQUENCY(gt) ___I915_PMU_OTHER(gt, 1)
|
||||
#define __I915_PMU_INTERRUPTS(gt) ___I915_PMU_OTHER(gt, 2)
|
||||
#define __I915_PMU_RC6_RESIDENCY(gt) ___I915_PMU_OTHER(gt, 3)
|
||||
#define __I915_PMU_SOFTWARE_GT_AWAKE_TIME(gt) ___I915_PMU_OTHER(gt, 4)
|
||||
|
||||
/* Each region is a minimum of 16k, and there are at most 255 of them.
|
||||
*/
|
||||
#define I915_NR_TEX_REGIONS 255 /* table size 2k - maximum due to use
|
||||
@ -659,7 +674,8 @@ typedef struct drm_i915_irq_wait {
|
||||
* If the IOCTL is successful, the returned parameter will be set to one of the
|
||||
* following values:
|
||||
* * 0 if HuC firmware load is not complete,
|
||||
* * 1 if HuC firmware is authenticated and running.
|
||||
* * 1 if HuC firmware is loaded and fully authenticated,
|
||||
* * 2 if HuC firmware is loaded and authenticated for clear media only
|
||||
*/
|
||||
#define I915_PARAM_HUC_STATUS 42
|
||||
|
||||
@ -771,6 +787,25 @@ typedef struct drm_i915_irq_wait {
|
||||
*/
|
||||
#define I915_PARAM_OA_TIMESTAMP_FREQUENCY 57
|
||||
|
||||
/*
|
||||
* Query the status of PXP support in i915.
|
||||
*
|
||||
* The query can fail in the following scenarios with the listed error codes:
|
||||
* -ENODEV = PXP support is not available on the GPU device or in the
|
||||
* kernel due to missing component drivers or kernel configs.
|
||||
*
|
||||
* If the IOCTL is successful, the returned parameter will be set to one of
|
||||
* the following values:
|
||||
* 1 = PXP feature is supported and is ready for use.
|
||||
* 2 = PXP feature is supported but should be ready soon (pending
|
||||
* initialization of non-i915 system dependencies).
|
||||
*
|
||||
* NOTE: When param is supported (positive return values), user space should
|
||||
* still refer to the GEM PXP context-creation UAPI header specs to be
|
||||
* aware of possible failure due to system state machine at the time.
|
||||
*/
|
||||
#define I915_PARAM_PXP_STATUS 58
|
||||
|
||||
/* Must be kept compact -- no holes and well documented */
|
||||
|
||||
/**
|
||||
@ -2096,6 +2131,21 @@ struct drm_i915_gem_context_param {
|
||||
*
|
||||
* -ENODEV: feature not available
|
||||
* -EPERM: trying to mark a recoverable or not bannable context as protected
|
||||
* -ENXIO: A dependency such as a component driver or firmware is not yet
|
||||
* loaded so user space may need to attempt again. Depending on the
|
||||
* device, this error may be reported if protected context creation is
|
||||
* attempted very early after kernel start because the internal timeout
|
||||
* waiting for such dependencies is not guaranteed to be larger than
|
||||
* required (numbers differ depending on system and kernel config):
|
||||
* - ADL/RPL: dependencies may take up to 3 seconds from kernel start
|
||||
* while context creation internal timeout is 250 milisecs
|
||||
* - MTL: dependencies may take up to 8 seconds from kernel start
|
||||
* while context creation internal timeout is 250 milisecs
|
||||
* NOTE: such dependencies happen once, so a subsequent call to create a
|
||||
* protected context after a prior successful call will not experience
|
||||
* such timeouts and will not return -ENXIO (unless the driver is reloaded,
|
||||
* or, depending on the device, resumes from a suspended state).
|
||||
* -EIO: The firmware did not succeed in creating the protected context.
|
||||
*/
|
||||
#define I915_CONTEXT_PARAM_PROTECTED_CONTENT 0xd
|
||||
/* Must be kept compact -- no holes and well documented */
|
||||
@ -3630,9 +3680,13 @@ struct drm_i915_gem_create_ext {
|
||||
*
|
||||
* For I915_GEM_CREATE_EXT_PROTECTED_CONTENT usage see
|
||||
* struct drm_i915_gem_create_ext_protected_content.
|
||||
*
|
||||
* For I915_GEM_CREATE_EXT_SET_PAT usage see
|
||||
* struct drm_i915_gem_create_ext_set_pat.
|
||||
*/
|
||||
#define I915_GEM_CREATE_EXT_MEMORY_REGIONS 0
|
||||
#define I915_GEM_CREATE_EXT_PROTECTED_CONTENT 1
|
||||
#define I915_GEM_CREATE_EXT_SET_PAT 2
|
||||
__u64 extensions;
|
||||
};
|
||||
|
||||
@ -3747,6 +3801,43 @@ struct drm_i915_gem_create_ext_protected_content {
|
||||
__u32 flags;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct drm_i915_gem_create_ext_set_pat - The
|
||||
* I915_GEM_CREATE_EXT_SET_PAT extension.
|
||||
*
|
||||
* If this extension is provided, the specified caching policy (PAT index) is
|
||||
* applied to the buffer object.
|
||||
*
|
||||
* Below is an example on how to create an object with specific caching policy:
|
||||
*
|
||||
* .. code-block:: C
|
||||
*
|
||||
* struct drm_i915_gem_create_ext_set_pat set_pat_ext = {
|
||||
* .base = { .name = I915_GEM_CREATE_EXT_SET_PAT },
|
||||
* .pat_index = 0,
|
||||
* };
|
||||
* struct drm_i915_gem_create_ext create_ext = {
|
||||
* .size = PAGE_SIZE,
|
||||
* .extensions = (uintptr_t)&set_pat_ext,
|
||||
* };
|
||||
*
|
||||
* int err = ioctl(fd, DRM_IOCTL_I915_GEM_CREATE_EXT, &create_ext);
|
||||
* if (err) ...
|
||||
*/
|
||||
struct drm_i915_gem_create_ext_set_pat {
|
||||
/** @base: Extension link. See struct i915_user_extension. */
|
||||
struct i915_user_extension base;
|
||||
/**
|
||||
* @pat_index: PAT index to be set
|
||||
* PAT index is a bit field in Page Table Entry to control caching
|
||||
* behaviors for GPU accesses. The definition of PAT index is
|
||||
* platform dependent and can be found in hardware specifications,
|
||||
*/
|
||||
__u32 pat_index;
|
||||
/** @rsvd: reserved for future use */
|
||||
__u32 rsvd;
|
||||
};
|
||||
|
||||
/* ID of the protected content session managed by i915 when PXP is active */
|
||||
#define I915_PROTECTED_CONTENT_DEFAULT_SESSION 0xf
|
||||
|
||||
|
@ -112,4 +112,9 @@
|
||||
|
||||
#define AT_RECURSIVE 0x8000 /* Apply to the entire subtree */
|
||||
|
||||
/* Flags for name_to_handle_at(2). We reuse AT_ flag space to save bits... */
|
||||
#define AT_HANDLE_FID AT_REMOVEDIR /* file handle is needed to
|
||||
compare object identity and may not
|
||||
be usable to open_by_handle_at(2) */
|
||||
|
||||
#endif /* _UAPI_LINUX_FCNTL_H */
|
||||
|
@ -1190,6 +1190,8 @@ struct kvm_ppc_resize_hpt {
|
||||
#define KVM_CAP_DIRTY_LOG_RING_WITH_BITMAP 225
|
||||
#define KVM_CAP_PMU_EVENT_MASKED_EVENTS 226
|
||||
#define KVM_CAP_COUNTER_OFFSET 227
|
||||
#define KVM_CAP_ARM_EAGER_SPLIT_CHUNK_SIZE 228
|
||||
#define KVM_CAP_ARM_SUPPORTED_BLOCK_SIZES 229
|
||||
|
||||
#ifdef KVM_CAP_IRQ_ROUTING
|
||||
|
||||
@ -1442,6 +1444,8 @@ enum kvm_device_type {
|
||||
#define KVM_DEV_TYPE_XIVE KVM_DEV_TYPE_XIVE
|
||||
KVM_DEV_TYPE_ARM_PV_TIME,
|
||||
#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_MAX,
|
||||
};
|
||||
|
||||
@ -1613,7 +1617,7 @@ struct kvm_s390_ucas_mapping {
|
||||
#define KVM_GET_DEBUGREGS _IOR(KVMIO, 0xa1, struct kvm_debugregs)
|
||||
#define KVM_SET_DEBUGREGS _IOW(KVMIO, 0xa2, struct kvm_debugregs)
|
||||
/*
|
||||
* vcpu version available with KVM_ENABLE_CAP
|
||||
* vcpu version available with KVM_CAP_ENABLE_CAP
|
||||
* vm version available with KVM_CAP_ENABLE_CAP_VM
|
||||
*/
|
||||
#define KVM_ENABLE_CAP _IOW(KVMIO, 0xa3, struct kvm_enable_cap)
|
||||
|
@ -4,6 +4,7 @@
|
||||
|
||||
#include <asm/mman.h>
|
||||
#include <asm-generic/hugetlb_encode.h>
|
||||
#include <linux/types.h>
|
||||
|
||||
#define MREMAP_MAYMOVE 1
|
||||
#define MREMAP_FIXED 2
|
||||
@ -41,4 +42,17 @@
|
||||
#define MAP_HUGE_2GB HUGETLB_FLAG_ENCODE_2GB
|
||||
#define MAP_HUGE_16GB HUGETLB_FLAG_ENCODE_16GB
|
||||
|
||||
struct cachestat_range {
|
||||
__u64 off;
|
||||
__u64 len;
|
||||
};
|
||||
|
||||
struct cachestat {
|
||||
__u64 nr_cache;
|
||||
__u64 nr_dirty;
|
||||
__u64 nr_writeback;
|
||||
__u64 nr_evicted;
|
||||
__u64 nr_recently_evicted;
|
||||
};
|
||||
|
||||
#endif /* _UAPI_LINUX_MMAN_H */
|
||||
|
@ -74,7 +74,8 @@
|
||||
#define MOVE_MOUNT_T_AUTOMOUNTS 0x00000020 /* Follow automounts on to path */
|
||||
#define MOVE_MOUNT_T_EMPTY_PATH 0x00000040 /* Empty to path permitted */
|
||||
#define MOVE_MOUNT_SET_GROUP 0x00000100 /* Set sharing group instead */
|
||||
#define MOVE_MOUNT__MASK 0x00000177
|
||||
#define MOVE_MOUNT_BENEATH 0x00000200 /* Mount beneath top mount */
|
||||
#define MOVE_MOUNT__MASK 0x00000377
|
||||
|
||||
/*
|
||||
* fsopen() flags.
|
||||
|
@ -294,4 +294,15 @@ struct prctl_mm_map {
|
||||
|
||||
#define PR_SET_MEMORY_MERGE 67
|
||||
#define PR_GET_MEMORY_MERGE 68
|
||||
|
||||
#define PR_RISCV_V_SET_CONTROL 69
|
||||
#define PR_RISCV_V_GET_CONTROL 70
|
||||
# define PR_RISCV_V_VSTATE_CTRL_DEFAULT 0
|
||||
# define PR_RISCV_V_VSTATE_CTRL_OFF 1
|
||||
# define PR_RISCV_V_VSTATE_CTRL_ON 2
|
||||
# define PR_RISCV_V_VSTATE_CTRL_INHERIT (1 << 4)
|
||||
# define PR_RISCV_V_VSTATE_CTRL_CUR_MASK 0x3
|
||||
# define PR_RISCV_V_VSTATE_CTRL_NEXT_MASK 0xc
|
||||
# define PR_RISCV_V_VSTATE_CTRL_MASK 0x1f
|
||||
|
||||
#endif /* _LINUX_PRCTL_H */
|
||||
|
@ -45,6 +45,25 @@
|
||||
#define VHOST_SET_LOG_BASE _IOW(VHOST_VIRTIO, 0x04, __u64)
|
||||
/* Specify an eventfd file descriptor to signal on log write. */
|
||||
#define VHOST_SET_LOG_FD _IOW(VHOST_VIRTIO, 0x07, int)
|
||||
/* By default, a device gets one vhost_worker that its virtqueues share. This
|
||||
* command allows the owner of the device to create an additional vhost_worker
|
||||
* for the device. It can later be bound to 1 or more of its virtqueues using
|
||||
* the VHOST_ATTACH_VRING_WORKER command.
|
||||
*
|
||||
* This must be called after VHOST_SET_OWNER and the caller must be the owner
|
||||
* of the device. The new thread will inherit caller's cgroups and namespaces,
|
||||
* and will share the caller's memory space. The new thread will also be
|
||||
* counted against the caller's RLIMIT_NPROC value.
|
||||
*
|
||||
* The worker's ID used in other commands will be returned in
|
||||
* vhost_worker_state.
|
||||
*/
|
||||
#define VHOST_NEW_WORKER _IOR(VHOST_VIRTIO, 0x8, struct vhost_worker_state)
|
||||
/* Free a worker created with VHOST_NEW_WORKER if it's not attached to any
|
||||
* virtqueue. If userspace is not able to call this for workers its created,
|
||||
* the kernel will free all the device's workers when the device is closed.
|
||||
*/
|
||||
#define VHOST_FREE_WORKER _IOW(VHOST_VIRTIO, 0x9, struct vhost_worker_state)
|
||||
|
||||
/* Ring setup. */
|
||||
/* Set number of descriptors in ring. This parameter can not
|
||||
@ -70,6 +89,18 @@
|
||||
#define VHOST_VRING_BIG_ENDIAN 1
|
||||
#define VHOST_SET_VRING_ENDIAN _IOW(VHOST_VIRTIO, 0x13, struct vhost_vring_state)
|
||||
#define VHOST_GET_VRING_ENDIAN _IOW(VHOST_VIRTIO, 0x14, struct vhost_vring_state)
|
||||
/* Attach a vhost_worker created with VHOST_NEW_WORKER to one of the device's
|
||||
* virtqueues.
|
||||
*
|
||||
* This will replace the virtqueue's existing worker. If the replaced worker
|
||||
* is no longer attached to any virtqueues, it can be freed with
|
||||
* VHOST_FREE_WORKER.
|
||||
*/
|
||||
#define VHOST_ATTACH_VRING_WORKER _IOW(VHOST_VIRTIO, 0x15, \
|
||||
struct vhost_vring_worker)
|
||||
/* Return the vring worker's ID */
|
||||
#define VHOST_GET_VRING_WORKER _IOWR(VHOST_VIRTIO, 0x16, \
|
||||
struct vhost_vring_worker)
|
||||
|
||||
/* The following ioctls use eventfd file descriptors to signal and poll
|
||||
* for events. */
|
||||
|
@ -274,6 +274,7 @@ typedef int __bitwise snd_pcm_subformat_t;
|
||||
#define SNDRV_PCM_INFO_DOUBLE 0x00000004 /* Double buffering needed for PCM start/stop */
|
||||
#define SNDRV_PCM_INFO_BATCH 0x00000010 /* double buffering */
|
||||
#define SNDRV_PCM_INFO_SYNC_APPLPTR 0x00000020 /* need the explicit sync of appl_ptr update */
|
||||
#define SNDRV_PCM_INFO_PERFECT_DRAIN 0x00000040 /* silencing at the end of stream is not required */
|
||||
#define SNDRV_PCM_INFO_INTERLEAVED 0x00000100 /* channels are interleaved */
|
||||
#define SNDRV_PCM_INFO_NONINTERLEAVED 0x00000200 /* channels are not interleaved */
|
||||
#define SNDRV_PCM_INFO_COMPLEX 0x00000400 /* complex frame organization (mmap only) */
|
||||
@ -383,6 +384,9 @@ typedef int snd_pcm_hw_param_t;
|
||||
#define SNDRV_PCM_HW_PARAMS_NORESAMPLE (1<<0) /* avoid rate resampling */
|
||||
#define SNDRV_PCM_HW_PARAMS_EXPORT_BUFFER (1<<1) /* export buffer */
|
||||
#define SNDRV_PCM_HW_PARAMS_NO_PERIOD_WAKEUP (1<<2) /* disable period wakeups */
|
||||
#define SNDRV_PCM_HW_PARAMS_NO_DRAIN_SILENCE (1<<3) /* suppress drain with the filling
|
||||
* of the silence samples
|
||||
*/
|
||||
|
||||
struct snd_interval {
|
||||
unsigned int min, max;
|
||||
@ -708,7 +712,7 @@ enum {
|
||||
* Raw MIDI section - /dev/snd/midi??
|
||||
*/
|
||||
|
||||
#define SNDRV_RAWMIDI_VERSION SNDRV_PROTOCOL_VERSION(2, 0, 2)
|
||||
#define SNDRV_RAWMIDI_VERSION SNDRV_PROTOCOL_VERSION(2, 0, 4)
|
||||
|
||||
enum {
|
||||
SNDRV_RAWMIDI_STREAM_OUTPUT = 0,
|
||||
@ -719,6 +723,7 @@ enum {
|
||||
#define SNDRV_RAWMIDI_INFO_OUTPUT 0x00000001
|
||||
#define SNDRV_RAWMIDI_INFO_INPUT 0x00000002
|
||||
#define SNDRV_RAWMIDI_INFO_DUPLEX 0x00000004
|
||||
#define SNDRV_RAWMIDI_INFO_UMP 0x00000008
|
||||
|
||||
struct snd_rawmidi_info {
|
||||
unsigned int device; /* RO/WR (control): device number */
|
||||
@ -779,6 +784,72 @@ struct snd_rawmidi_status {
|
||||
};
|
||||
#endif
|
||||
|
||||
/* UMP EP info flags */
|
||||
#define SNDRV_UMP_EP_INFO_STATIC_BLOCKS 0x01
|
||||
|
||||
/* UMP EP Protocol / JRTS capability bits */
|
||||
#define SNDRV_UMP_EP_INFO_PROTO_MIDI_MASK 0x0300
|
||||
#define SNDRV_UMP_EP_INFO_PROTO_MIDI1 0x0100 /* MIDI 1.0 */
|
||||
#define SNDRV_UMP_EP_INFO_PROTO_MIDI2 0x0200 /* MIDI 2.0 */
|
||||
#define SNDRV_UMP_EP_INFO_PROTO_JRTS_MASK 0x0003
|
||||
#define SNDRV_UMP_EP_INFO_PROTO_JRTS_TX 0x0001 /* JRTS Transmit */
|
||||
#define SNDRV_UMP_EP_INFO_PROTO_JRTS_RX 0x0002 /* JRTS Receive */
|
||||
|
||||
/* UMP Endpoint information */
|
||||
struct snd_ump_endpoint_info {
|
||||
int card; /* card number */
|
||||
int device; /* device number */
|
||||
unsigned int flags; /* additional info */
|
||||
unsigned int protocol_caps; /* protocol capabilities */
|
||||
unsigned int protocol; /* current protocol */
|
||||
unsigned int num_blocks; /* # of function blocks */
|
||||
unsigned short version; /* UMP major/minor version */
|
||||
unsigned short family_id; /* MIDI device family ID */
|
||||
unsigned short model_id; /* MIDI family model ID */
|
||||
unsigned int manufacturer_id; /* MIDI manufacturer ID */
|
||||
unsigned char sw_revision[4]; /* software revision */
|
||||
unsigned short padding;
|
||||
unsigned char name[128]; /* endpoint name string */
|
||||
unsigned char product_id[128]; /* unique product id string */
|
||||
unsigned char reserved[32];
|
||||
} __packed;
|
||||
|
||||
/* UMP direction */
|
||||
#define SNDRV_UMP_DIR_INPUT 0x01
|
||||
#define SNDRV_UMP_DIR_OUTPUT 0x02
|
||||
#define SNDRV_UMP_DIR_BIDIRECTION 0x03
|
||||
|
||||
/* UMP block info flags */
|
||||
#define SNDRV_UMP_BLOCK_IS_MIDI1 (1U << 0) /* MIDI 1.0 port w/o restrict */
|
||||
#define SNDRV_UMP_BLOCK_IS_LOWSPEED (1U << 1) /* 31.25Kbps B/W MIDI1 port */
|
||||
|
||||
/* UMP block user-interface hint */
|
||||
#define SNDRV_UMP_BLOCK_UI_HINT_UNKNOWN 0x00
|
||||
#define SNDRV_UMP_BLOCK_UI_HINT_RECEIVER 0x01
|
||||
#define SNDRV_UMP_BLOCK_UI_HINT_SENDER 0x02
|
||||
#define SNDRV_UMP_BLOCK_UI_HINT_BOTH 0x03
|
||||
|
||||
/* UMP groups and blocks */
|
||||
#define SNDRV_UMP_MAX_GROUPS 16
|
||||
#define SNDRV_UMP_MAX_BLOCKS 32
|
||||
|
||||
/* UMP Block information */
|
||||
struct snd_ump_block_info {
|
||||
int card; /* card number */
|
||||
int device; /* device number */
|
||||
unsigned char block_id; /* block ID (R/W) */
|
||||
unsigned char direction; /* UMP direction */
|
||||
unsigned char active; /* Activeness */
|
||||
unsigned char first_group; /* first group ID */
|
||||
unsigned char num_groups; /* number of groups */
|
||||
unsigned char midi_ci_version; /* MIDI-CI support version */
|
||||
unsigned char sysex8_streams; /* max number of sysex8 streams */
|
||||
unsigned char ui_hint; /* user interface hint */
|
||||
unsigned int flags; /* various info flags */
|
||||
unsigned char name[128]; /* block name string */
|
||||
unsigned char reserved[32];
|
||||
} __packed;
|
||||
|
||||
#define SNDRV_RAWMIDI_IOCTL_PVERSION _IOR('W', 0x00, int)
|
||||
#define SNDRV_RAWMIDI_IOCTL_INFO _IOR('W', 0x01, struct snd_rawmidi_info)
|
||||
#define SNDRV_RAWMIDI_IOCTL_USER_PVERSION _IOW('W', 0x02, int)
|
||||
@ -786,6 +857,9 @@ struct snd_rawmidi_status {
|
||||
#define SNDRV_RAWMIDI_IOCTL_STATUS _IOWR('W', 0x20, struct snd_rawmidi_status)
|
||||
#define SNDRV_RAWMIDI_IOCTL_DROP _IOW('W', 0x30, int)
|
||||
#define SNDRV_RAWMIDI_IOCTL_DRAIN _IOW('W', 0x31, int)
|
||||
/* Additional ioctls for UMP rawmidi devices */
|
||||
#define SNDRV_UMP_IOCTL_ENDPOINT_INFO _IOR('W', 0x40, struct snd_ump_endpoint_info)
|
||||
#define SNDRV_UMP_IOCTL_BLOCK_INFO _IOR('W', 0x41, struct snd_ump_block_info)
|
||||
|
||||
/*
|
||||
* Timer section - /dev/snd/timer
|
||||
@ -961,7 +1035,7 @@ struct snd_timer_tread {
|
||||
* *
|
||||
****************************************************************************/
|
||||
|
||||
#define SNDRV_CTL_VERSION SNDRV_PROTOCOL_VERSION(2, 0, 8)
|
||||
#define SNDRV_CTL_VERSION SNDRV_PROTOCOL_VERSION(2, 0, 9)
|
||||
|
||||
struct snd_ctl_card_info {
|
||||
int card; /* card number */
|
||||
@ -1122,6 +1196,9 @@ struct snd_ctl_tlv {
|
||||
#define SNDRV_CTL_IOCTL_RAWMIDI_NEXT_DEVICE _IOWR('U', 0x40, int)
|
||||
#define SNDRV_CTL_IOCTL_RAWMIDI_INFO _IOWR('U', 0x41, struct snd_rawmidi_info)
|
||||
#define SNDRV_CTL_IOCTL_RAWMIDI_PREFER_SUBDEVICE _IOW('U', 0x42, int)
|
||||
#define SNDRV_CTL_IOCTL_UMP_NEXT_DEVICE _IOWR('U', 0x43, int)
|
||||
#define SNDRV_CTL_IOCTL_UMP_ENDPOINT_INFO _IOWR('U', 0x44, struct snd_ump_endpoint_info)
|
||||
#define SNDRV_CTL_IOCTL_UMP_BLOCK_INFO _IOWR('U', 0x45, struct snd_ump_block_info)
|
||||
#define SNDRV_CTL_IOCTL_POWER _IOWR('U', 0xd0, int)
|
||||
#define SNDRV_CTL_IOCTL_POWER_STATE _IOR('U', 0xd1, int)
|
||||
|
||||
|
@ -68,8 +68,13 @@ void exclude_cmds(struct cmdnames *cmds, struct cmdnames *excludes)
|
||||
while (ci < cmds->cnt && ei < excludes->cnt) {
|
||||
cmp = strcmp(cmds->names[ci]->name, excludes->names[ei]->name);
|
||||
if (cmp < 0) {
|
||||
zfree(&cmds->names[cj]);
|
||||
cmds->names[cj++] = cmds->names[ci++];
|
||||
if (ci == cj) {
|
||||
ci++;
|
||||
cj++;
|
||||
} else {
|
||||
zfree(&cmds->names[cj]);
|
||||
cmds->names[cj++] = cmds->names[ci++];
|
||||
}
|
||||
} else if (cmp == 0) {
|
||||
ci++;
|
||||
ei++;
|
||||
@ -77,10 +82,11 @@ void exclude_cmds(struct cmdnames *cmds, struct cmdnames *excludes)
|
||||
ei++;
|
||||
}
|
||||
}
|
||||
|
||||
while (ci < cmds->cnt) {
|
||||
zfree(&cmds->names[cj]);
|
||||
cmds->names[cj++] = cmds->names[ci++];
|
||||
if (ci != cj) {
|
||||
while (ci < cmds->cnt) {
|
||||
zfree(&cmds->names[cj]);
|
||||
cmds->names[cj++] = cmds->names[ci++];
|
||||
}
|
||||
}
|
||||
for (ci = cj; ci < cmds->cnt; ci++)
|
||||
zfree(&cmds->names[ci]);
|
||||
|
@ -155,9 +155,9 @@ FEATURE_CHECK_LDFLAGS-libcrypto = -lcrypto
|
||||
ifdef CSINCLUDES
|
||||
LIBOPENCSD_CFLAGS := -I$(CSINCLUDES)
|
||||
endif
|
||||
OPENCSDLIBS := -lopencsd_c_api
|
||||
OPENCSDLIBS := -lopencsd_c_api -lopencsd
|
||||
ifeq ($(findstring -static,${LDFLAGS}),-static)
|
||||
OPENCSDLIBS += -lopencsd -lstdc++
|
||||
OPENCSDLIBS += -lstdc++
|
||||
endif
|
||||
ifdef CSLIBS
|
||||
LIBOPENCSD_LDFLAGS := -L$(CSLIBS)
|
||||
|
@ -365,3 +365,4 @@
|
||||
448 n64 process_mrelease sys_process_mrelease
|
||||
449 n64 futex_waitv sys_futex_waitv
|
||||
450 common set_mempolicy_home_node sys_set_mempolicy_home_node
|
||||
451 n64 cachestat sys_cachestat
|
||||
|
@ -537,3 +537,4 @@
|
||||
448 common process_mrelease sys_process_mrelease
|
||||
449 common futex_waitv sys_futex_waitv
|
||||
450 nospu set_mempolicy_home_node sys_set_mempolicy_home_node
|
||||
451 common cachestat sys_cachestat
|
||||
|
@ -453,3 +453,4 @@
|
||||
448 common process_mrelease sys_process_mrelease sys_process_mrelease
|
||||
449 common futex_waitv sys_futex_waitv sys_futex_waitv
|
||||
450 common set_mempolicy_home_node sys_set_mempolicy_home_node sys_set_mempolicy_home_node
|
||||
451 common cachestat sys_cachestat sys_cachestat
|
||||
|
@ -372,6 +372,7 @@
|
||||
448 common process_mrelease sys_process_mrelease
|
||||
449 common futex_waitv sys_futex_waitv
|
||||
450 common set_mempolicy_home_node sys_set_mempolicy_home_node
|
||||
451 common cachestat sys_cachestat
|
||||
|
||||
#
|
||||
# Due to a historical design error, certain syscalls are numbered differently
|
||||
|
@ -169,8 +169,9 @@
|
||||
},
|
||||
{
|
||||
"MetricName": "nps1_die_to_dram",
|
||||
"BriefDescription": "Approximate: Combined DRAM B/bytes of all channels on a NPS1 node (die) (may need --metric-no-group)",
|
||||
"BriefDescription": "Approximate: Combined DRAM B/bytes of all channels on a NPS1 node (die)",
|
||||
"MetricExpr": "dram_channel_data_controller_0 + dram_channel_data_controller_1 + dram_channel_data_controller_2 + dram_channel_data_controller_3 + dram_channel_data_controller_4 + dram_channel_data_controller_5 + dram_channel_data_controller_6 + dram_channel_data_controller_7",
|
||||
"MetricConstraint": "NO_GROUP_EVENTS",
|
||||
"MetricGroup": "data_fabric",
|
||||
"PerPkg": "1",
|
||||
"ScaleUnit": "6.1e-5MiB"
|
||||
|
@ -169,8 +169,9 @@
|
||||
},
|
||||
{
|
||||
"MetricName": "nps1_die_to_dram",
|
||||
"BriefDescription": "Approximate: Combined DRAM B/bytes of all channels on a NPS1 node (die) (may need --metric-no-group)",
|
||||
"BriefDescription": "Approximate: Combined DRAM B/bytes of all channels on a NPS1 node (die)",
|
||||
"MetricExpr": "dram_channel_data_controller_0 + dram_channel_data_controller_1 + dram_channel_data_controller_2 + dram_channel_data_controller_3 + dram_channel_data_controller_4 + dram_channel_data_controller_5 + dram_channel_data_controller_6 + dram_channel_data_controller_7",
|
||||
"MetricConstraint": "NO_GROUP_EVENTS",
|
||||
"MetricGroup": "data_fabric",
|
||||
"PerPkg": "1",
|
||||
"ScaleUnit": "6.1e-5MiB"
|
||||
|
@ -205,10 +205,11 @@
|
||||
},
|
||||
{
|
||||
"MetricName": "nps1_die_to_dram",
|
||||
"BriefDescription": "Approximate: Combined DRAM B/bytes of all channels on a NPS1 node (die) (may need --metric-no-group)",
|
||||
"BriefDescription": "Approximate: Combined DRAM B/bytes of all channels on a NPS1 node (die)",
|
||||
"MetricExpr": "dram_channel_data_controller_0 + dram_channel_data_controller_1 + dram_channel_data_controller_2 + dram_channel_data_controller_3 + dram_channel_data_controller_4 + dram_channel_data_controller_5 + dram_channel_data_controller_6 + dram_channel_data_controller_7",
|
||||
"MetricGroup": "data_fabric",
|
||||
"PerPkg": "1",
|
||||
"MetricConstraint": "NO_GROUP_EVENTS",
|
||||
"ScaleUnit": "6.1e-5MiB"
|
||||
}
|
||||
]
|
||||
|
77
tools/perf/tests/shell/test_uprobe_from_different_cu.sh
Executable file
77
tools/perf/tests/shell/test_uprobe_from_different_cu.sh
Executable file
@ -0,0 +1,77 @@
|
||||
#!/bin/bash
|
||||
# test perf probe of function from different CU
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
set -e
|
||||
|
||||
temp_dir=$(mktemp -d /tmp/perf-uprobe-different-cu-sh.XXXXXXXXXX)
|
||||
|
||||
cleanup()
|
||||
{
|
||||
trap - EXIT TERM INT
|
||||
if [[ "${temp_dir}" =~ ^/tmp/perf-uprobe-different-cu-sh.*$ ]]; then
|
||||
echo "--- Cleaning up ---"
|
||||
perf probe -x ${temp_dir}/testfile -d foo
|
||||
rm -f "${temp_dir}/"*
|
||||
rmdir "${temp_dir}"
|
||||
fi
|
||||
}
|
||||
|
||||
trap_cleanup()
|
||||
{
|
||||
cleanup
|
||||
exit 1
|
||||
}
|
||||
|
||||
trap trap_cleanup EXIT TERM INT
|
||||
|
||||
cat > ${temp_dir}/testfile-foo.h << EOF
|
||||
struct t
|
||||
{
|
||||
int *p;
|
||||
int c;
|
||||
};
|
||||
|
||||
extern int foo (int i, struct t *t);
|
||||
EOF
|
||||
|
||||
cat > ${temp_dir}/testfile-foo.c << EOF
|
||||
#include "testfile-foo.h"
|
||||
|
||||
int
|
||||
foo (int i, struct t *t)
|
||||
{
|
||||
int j, res = 0;
|
||||
for (j = 0; j < i && j < t->c; j++)
|
||||
res += t->p[j];
|
||||
|
||||
return res;
|
||||
}
|
||||
EOF
|
||||
|
||||
cat > ${temp_dir}/testfile-main.c << EOF
|
||||
#include "testfile-foo.h"
|
||||
|
||||
static struct t g;
|
||||
|
||||
int
|
||||
main (int argc, char **argv)
|
||||
{
|
||||
int i;
|
||||
int j[argc];
|
||||
g.c = argc;
|
||||
g.p = j;
|
||||
for (i = 0; i < argc; i++)
|
||||
j[i] = (int) argv[i][0];
|
||||
return foo (3, &g);
|
||||
}
|
||||
EOF
|
||||
|
||||
gcc -g -Og -flto -c ${temp_dir}/testfile-foo.c -o ${temp_dir}/testfile-foo.o
|
||||
gcc -g -Og -c ${temp_dir}/testfile-main.c -o ${temp_dir}/testfile-main.o
|
||||
gcc -g -Og -o ${temp_dir}/testfile ${temp_dir}/testfile-foo.o ${temp_dir}/testfile-main.o
|
||||
|
||||
perf probe -x ${temp_dir}/testfile --funcs foo
|
||||
perf probe -x ${temp_dir}/testfile foo
|
||||
|
||||
cleanup
|
@ -58,9 +58,9 @@ static int test__task_exit(struct test_suite *test __maybe_unused, int subtest _
|
||||
|
||||
signal(SIGCHLD, sig_handler);
|
||||
|
||||
evlist = evlist__new_default();
|
||||
evlist = evlist__new_dummy();
|
||||
if (evlist == NULL) {
|
||||
pr_debug("evlist__new_default\n");
|
||||
pr_debug("evlist__new_dummy\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
@ -177,6 +177,7 @@ static inline size_t msg_data_left(struct msghdr *msg)
|
||||
#define SCM_RIGHTS 0x01 /* rw: access rights (array of int) */
|
||||
#define SCM_CREDENTIALS 0x02 /* rw: struct ucred */
|
||||
#define SCM_SECURITY 0x03 /* rw: security label */
|
||||
#define SCM_PIDFD 0x04 /* ro: pidfd (int) */
|
||||
|
||||
struct ucred {
|
||||
__u32 pid;
|
||||
@ -326,6 +327,7 @@ struct ucred {
|
||||
*/
|
||||
|
||||
#define MSG_ZEROCOPY 0x4000000 /* Use user data in kernel path */
|
||||
#define MSG_SPLICE_PAGES 0x8000000 /* Splice the pages from the iterator in sendmsg() */
|
||||
#define MSG_FASTOPEN 0x20000000 /* Send data in TCP SYN */
|
||||
#define MSG_CMSG_CLOEXEC 0x40000000 /* Set close_on_exec for file
|
||||
descriptor received through
|
||||
@ -336,6 +338,9 @@ struct ucred {
|
||||
#define MSG_CMSG_COMPAT 0 /* We never have 32 bit fixups */
|
||||
#endif
|
||||
|
||||
/* Flags to be cleared on entry by sendmsg and sendmmsg syscalls */
|
||||
#define MSG_INTERNAL_SENDMSG_FLAGS \
|
||||
(MSG_SPLICE_PAGES | MSG_SENDPAGE_NOPOLICY | MSG_SENDPAGE_DECRYPTED)
|
||||
|
||||
/* Setsockoptions(2) level. Thanks to BSD these must match IPPROTO_xxx */
|
||||
#define SOL_IP 0
|
||||
|
@ -10,7 +10,7 @@ fi
|
||||
linux_mount=${linux_header_dir}/mount.h
|
||||
|
||||
printf "static const char *move_mount_flags[] = {\n"
|
||||
regex='^[[:space:]]*#[[:space:]]*define[[:space:]]+MOVE_MOUNT_([^_]+_[[:alnum:]_]+)[[:space:]]+(0x[[:xdigit:]]+)[[:space:]]*.*'
|
||||
regex='^[[:space:]]*#[[:space:]]*define[[:space:]]+MOVE_MOUNT_([^_]+[[:alnum:]_]+)[[:space:]]+(0x[[:xdigit:]]+)[[:space:]]*.*'
|
||||
grep -E $regex ${linux_mount} | \
|
||||
sed -r "s/$regex/\2 \1/g" | \
|
||||
xargs printf "\t[ilog2(%s) + 1] = \"%s\",\n"
|
||||
|
@ -8,6 +8,12 @@
|
||||
#ifndef MSG_WAITFORONE
|
||||
#define MSG_WAITFORONE 0x10000
|
||||
#endif
|
||||
#ifndef MSG_BATCH
|
||||
#define MSG_BATCH 0x40000
|
||||
#endif
|
||||
#ifndef MSG_ZEROCOPY
|
||||
#define MSG_ZEROCOPY 0x4000000
|
||||
#endif
|
||||
#ifndef MSG_SPLICE_PAGES
|
||||
#define MSG_SPLICE_PAGES 0x8000000
|
||||
#endif
|
||||
@ -50,6 +56,8 @@ static size_t syscall_arg__scnprintf_msg_flags(char *bf, size_t size,
|
||||
P_MSG_FLAG(NOSIGNAL);
|
||||
P_MSG_FLAG(MORE);
|
||||
P_MSG_FLAG(WAITFORONE);
|
||||
P_MSG_FLAG(BATCH);
|
||||
P_MSG_FLAG(ZEROCOPY);
|
||||
P_MSG_FLAG(SPLICE_PAGES);
|
||||
P_MSG_FLAG(FASTOPEN);
|
||||
P_MSG_FLAG(CMSG_CLOEXEC);
|
||||
|
@ -478,8 +478,10 @@ static const char *die_get_file_name(Dwarf_Die *dw_die, int idx)
|
||||
{
|
||||
Dwarf_Die cu_die;
|
||||
Dwarf_Files *files;
|
||||
Dwarf_Attribute attr_mem;
|
||||
|
||||
if (idx < 0 || !dwarf_diecu(dw_die, &cu_die, NULL, NULL) ||
|
||||
if (idx < 0 || !dwarf_attr_integrate(dw_die, DW_AT_decl_file, &attr_mem) ||
|
||||
!dwarf_cu_die(attr_mem.cu, &cu_die, NULL, NULL, NULL, NULL, NULL, NULL) ||
|
||||
dwarf_getsrcfiles(&cu_die, &files, NULL) != 0)
|
||||
return NULL;
|
||||
|
||||
|
@ -1216,6 +1216,14 @@ static int config_term_pmu(struct perf_event_attr *attr,
|
||||
if (term->type_term == PARSE_EVENTS__TERM_TYPE_LEGACY_CACHE) {
|
||||
const struct perf_pmu *pmu = perf_pmus__find_by_type(attr->type);
|
||||
|
||||
if (!pmu) {
|
||||
char *err_str;
|
||||
|
||||
if (asprintf(&err_str, "Failed to find PMU for type %d", attr->type) >= 0)
|
||||
parse_events_error__handle(err, term->err_term,
|
||||
err_str, /*help=*/NULL);
|
||||
return -EINVAL;
|
||||
}
|
||||
if (perf_pmu__supports_legacy_cache(pmu)) {
|
||||
attr->type = PERF_TYPE_HW_CACHE;
|
||||
return parse_events__decode_legacy_cache(term->config, pmu->type,
|
||||
|
Loading…
Reference in New Issue
Block a user