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 Thomas Gleixner:
"Another pile of fixes for perf:
- Plug overflows and races in the core code
- Sanitize the flow of the perf syscall so we error out before
handling the more complex and hard to undo setups
- Improve and fix Broadwell and Skylake hardware support
- Revert a fix which broke what it tried to fix in perf tools
- A couple of smaller fixes in various places of perf tools"
* 'perf-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
perf tools: Fix copying of /proc/kcore
perf intel-pt: Remove no_force_psb from documentation
perf probe: Use existing routine to look for a kernel module by dso->short_name
perf/x86: Change test_aperfmperf() and test_intel() to static
tools lib traceevent: Fix string handling in heterogeneous arch environments
perf record: Avoid infinite loop at buildid processing with no samples
perf: Fix races in computing the header sizes
perf: Fix u16 overflows
perf: Restructure perf syscall point of no return
perf/x86/intel: Fix Skylake FRONTEND MSR extrareg mask
perf/x86/intel/pebs: Add PEBS frontend profiling for Skylake
perf/x86/intel: Make the CYCLE_ACTIVITY.* constraint on Broadwell more specific
perf tools: Bool functions shouldn't return -1
tools build: Add test for presence of __get_cpuid() gcc builtin
tools build: Add test for presence of numa_num_possible_cpus() in libnuma
Revert "perf symbols: Fix mismatched declarations for elf_getphdrnum"
perf stat: Fix per-pkg event reporting bug
This commit is contained in:
@@ -41,6 +41,7 @@ FEATURE_TESTS ?= \
|
||||
libelf-getphdrnum \
|
||||
libelf-mmap \
|
||||
libnuma \
|
||||
numa_num_possible_cpus \
|
||||
libperl \
|
||||
libpython \
|
||||
libpython-version \
|
||||
@@ -51,7 +52,8 @@ FEATURE_TESTS ?= \
|
||||
timerfd \
|
||||
libdw-dwarf-unwind \
|
||||
zlib \
|
||||
lzma
|
||||
lzma \
|
||||
get_cpuid
|
||||
|
||||
FEATURE_DISPLAY ?= \
|
||||
dwarf \
|
||||
@@ -61,13 +63,15 @@ FEATURE_DISPLAY ?= \
|
||||
libbfd \
|
||||
libelf \
|
||||
libnuma \
|
||||
numa_num_possible_cpus \
|
||||
libperl \
|
||||
libpython \
|
||||
libslang \
|
||||
libunwind \
|
||||
libdw-dwarf-unwind \
|
||||
zlib \
|
||||
lzma
|
||||
lzma \
|
||||
get_cpuid
|
||||
|
||||
# Set FEATURE_CHECK_(C|LD)FLAGS-all for all FEATURE_TESTS features.
|
||||
# If in the future we need per-feature checks/flags for features not
|
||||
|
||||
@@ -19,6 +19,7 @@ FILES= \
|
||||
test-libelf-getphdrnum.bin \
|
||||
test-libelf-mmap.bin \
|
||||
test-libnuma.bin \
|
||||
test-numa_num_possible_cpus.bin \
|
||||
test-libperl.bin \
|
||||
test-libpython.bin \
|
||||
test-libpython-version.bin \
|
||||
@@ -34,7 +35,8 @@ FILES= \
|
||||
test-compile-x32.bin \
|
||||
test-zlib.bin \
|
||||
test-lzma.bin \
|
||||
test-bpf.bin
|
||||
test-bpf.bin \
|
||||
test-get_cpuid.bin
|
||||
|
||||
CC := $(CROSS_COMPILE)gcc -MD
|
||||
PKG_CONFIG := $(CROSS_COMPILE)pkg-config
|
||||
@@ -87,6 +89,9 @@ test-libelf-getphdrnum.bin:
|
||||
test-libnuma.bin:
|
||||
$(BUILD) -lnuma
|
||||
|
||||
test-numa_num_possible_cpus.bin:
|
||||
$(BUILD) -lnuma
|
||||
|
||||
test-libunwind.bin:
|
||||
$(BUILD) -lelf
|
||||
|
||||
@@ -162,6 +167,9 @@ test-zlib.bin:
|
||||
test-lzma.bin:
|
||||
$(BUILD) -llzma
|
||||
|
||||
test-get_cpuid.bin:
|
||||
$(BUILD)
|
||||
|
||||
test-bpf.bin:
|
||||
$(BUILD)
|
||||
|
||||
|
||||
@@ -77,6 +77,10 @@
|
||||
# include "test-libnuma.c"
|
||||
#undef main
|
||||
|
||||
#define main main_test_numa_num_possible_cpus
|
||||
# include "test-numa_num_possible_cpus.c"
|
||||
#undef main
|
||||
|
||||
#define main main_test_timerfd
|
||||
# include "test-timerfd.c"
|
||||
#undef main
|
||||
@@ -117,6 +121,10 @@
|
||||
# include "test-lzma.c"
|
||||
#undef main
|
||||
|
||||
#define main main_test_get_cpuid
|
||||
# include "test-get_cpuid.c"
|
||||
#undef main
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
main_test_libpython();
|
||||
@@ -136,6 +144,7 @@ int main(int argc, char *argv[])
|
||||
main_test_libbfd();
|
||||
main_test_backtrace();
|
||||
main_test_libnuma();
|
||||
main_test_numa_num_possible_cpus();
|
||||
main_test_timerfd();
|
||||
main_test_stackprotector_all();
|
||||
main_test_libdw_dwarf_unwind();
|
||||
@@ -143,6 +152,7 @@ int main(int argc, char *argv[])
|
||||
main_test_zlib();
|
||||
main_test_pthread_attr_setaffinity_np();
|
||||
main_test_lzma();
|
||||
main_test_get_cpuid();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
#include <cpuid.h>
|
||||
|
||||
int main(void)
|
||||
{
|
||||
unsigned int eax = 0, ebx = 0, ecx = 0, edx = 0;
|
||||
return __get_cpuid(0x15, &eax, &ebx, &ecx, &edx);
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
#include <numa.h>
|
||||
|
||||
int main(void)
|
||||
{
|
||||
return numa_num_possible_cpus();
|
||||
}
|
||||
@@ -3795,7 +3795,7 @@ static void print_str_arg(struct trace_seq *s, void *data, int size,
|
||||
struct format_field *field;
|
||||
struct printk_map *printk;
|
||||
long long val, fval;
|
||||
unsigned long addr;
|
||||
unsigned long long addr;
|
||||
char *str;
|
||||
unsigned char *hex;
|
||||
int print;
|
||||
@@ -3828,13 +3828,30 @@ static void print_str_arg(struct trace_seq *s, void *data, int size,
|
||||
*/
|
||||
if (!(field->flags & FIELD_IS_ARRAY) &&
|
||||
field->size == pevent->long_size) {
|
||||
addr = *(unsigned long *)(data + field->offset);
|
||||
|
||||
/* Handle heterogeneous recording and processing
|
||||
* architectures
|
||||
*
|
||||
* CASE I:
|
||||
* Traces recorded on 32-bit devices (32-bit
|
||||
* addressing) and processed on 64-bit devices:
|
||||
* In this case, only 32 bits should be read.
|
||||
*
|
||||
* CASE II:
|
||||
* Traces recorded on 64 bit devices and processed
|
||||
* on 32-bit devices:
|
||||
* In this case, 64 bits must be read.
|
||||
*/
|
||||
addr = (pevent->long_size == 8) ?
|
||||
*(unsigned long long *)(data + field->offset) :
|
||||
(unsigned long long)*(unsigned int *)(data + field->offset);
|
||||
|
||||
/* Check if it matches a print format */
|
||||
printk = find_printk(pevent, addr);
|
||||
if (printk)
|
||||
trace_seq_puts(s, printk->printk);
|
||||
else
|
||||
trace_seq_printf(s, "%lx", addr);
|
||||
trace_seq_printf(s, "%llx", addr);
|
||||
break;
|
||||
}
|
||||
str = malloc(len + 1);
|
||||
|
||||
@@ -364,21 +364,6 @@ cyc_thresh Specifies how frequently CYC packets are produced - see cyc
|
||||
|
||||
CYC packets are not requested by default.
|
||||
|
||||
no_force_psb This is a driver option and is not in the IA32_RTIT_CTL MSR.
|
||||
|
||||
It stops the driver resetting the byte count to zero whenever
|
||||
enabling the trace (for example on context switches) which in
|
||||
turn results in no PSB being forced. However some processors
|
||||
will produce a PSB anyway.
|
||||
|
||||
In any case, there is still a PSB when the trace is enabled for
|
||||
the first time.
|
||||
|
||||
no_force_psb can be used to slightly decrease the trace size but
|
||||
may make it harder for the decoder to recover from errors.
|
||||
|
||||
no_force_psb is not selected by default.
|
||||
|
||||
|
||||
new snapshot option
|
||||
-------------------
|
||||
|
||||
@@ -573,9 +573,14 @@ ifndef NO_LIBNUMA
|
||||
msg := $(warning No numa.h found, disables 'perf bench numa mem' benchmark, please install numactl-devel/libnuma-devel/libnuma-dev);
|
||||
NO_LIBNUMA := 1
|
||||
else
|
||||
CFLAGS += -DHAVE_LIBNUMA_SUPPORT
|
||||
EXTLIBS += -lnuma
|
||||
$(call detected,CONFIG_NUMA)
|
||||
ifeq ($(feature-numa_num_possible_cpus), 0)
|
||||
msg := $(warning Old numa library found, disables 'perf bench numa mem' benchmark, please install numactl-devel/libnuma-devel/libnuma-dev >= 2.0.8);
|
||||
NO_LIBNUMA := 1
|
||||
else
|
||||
CFLAGS += -DHAVE_LIBNUMA_SUPPORT
|
||||
EXTLIBS += -lnuma
|
||||
$(call detected,CONFIG_NUMA)
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
|
||||
@@ -621,8 +626,13 @@ ifdef LIBBABELTRACE
|
||||
endif
|
||||
|
||||
ifndef NO_AUXTRACE
|
||||
$(call detected,CONFIG_AUXTRACE)
|
||||
CFLAGS += -DHAVE_AUXTRACE_SUPPORT
|
||||
ifeq ($(feature-get_cpuid), 0)
|
||||
msg := $(warning Your gcc lacks the __get_cpuid() builtin, disables support for auxtrace/Intel PT, please install a newer gcc);
|
||||
NO_AUXTRACE := 1
|
||||
else
|
||||
$(call detected,CONFIG_AUXTRACE)
|
||||
CFLAGS += -DHAVE_AUXTRACE_SUPPORT
|
||||
endif
|
||||
endif
|
||||
|
||||
# Among the variables below, these:
|
||||
|
||||
@@ -270,12 +270,13 @@ static int kernel_get_module_dso(const char *module, struct dso **pdso)
|
||||
int ret = 0;
|
||||
|
||||
if (module) {
|
||||
list_for_each_entry(dso, &host_machine->dsos.head, node) {
|
||||
if (!dso->kernel)
|
||||
continue;
|
||||
if (strncmp(dso->short_name + 1, module,
|
||||
dso->short_name_len - 2) == 0)
|
||||
goto found;
|
||||
char module_name[128];
|
||||
|
||||
snprintf(module_name, sizeof(module_name), "[%s]", module);
|
||||
map = map_groups__find_by_name(&host_machine->kmaps, MAP__FUNCTION, module_name);
|
||||
if (map) {
|
||||
dso = map->dso;
|
||||
goto found;
|
||||
}
|
||||
pr_debug("Failed to find module %s.\n", module);
|
||||
return -ENOENT;
|
||||
|
||||
@@ -1580,7 +1580,10 @@ static int __perf_session__process_events(struct perf_session *session,
|
||||
file_offset = page_offset;
|
||||
head = data_offset - page_offset;
|
||||
|
||||
if (data_size && (data_offset + data_size < file_size))
|
||||
if (data_size == 0)
|
||||
goto out;
|
||||
|
||||
if (data_offset + data_size < file_size)
|
||||
file_size = data_offset + data_size;
|
||||
|
||||
ui_progress__init(&prog, file_size, "Processing events...");
|
||||
|
||||
+14
-2
@@ -196,7 +196,8 @@ static void zero_per_pkg(struct perf_evsel *counter)
|
||||
memset(counter->per_pkg_mask, 0, MAX_NR_CPUS);
|
||||
}
|
||||
|
||||
static int check_per_pkg(struct perf_evsel *counter, int cpu, bool *skip)
|
||||
static int check_per_pkg(struct perf_evsel *counter,
|
||||
struct perf_counts_values *vals, int cpu, bool *skip)
|
||||
{
|
||||
unsigned long *mask = counter->per_pkg_mask;
|
||||
struct cpu_map *cpus = perf_evsel__cpus(counter);
|
||||
@@ -218,6 +219,17 @@ static int check_per_pkg(struct perf_evsel *counter, int cpu, bool *skip)
|
||||
counter->per_pkg_mask = mask;
|
||||
}
|
||||
|
||||
/*
|
||||
* we do not consider an event that has not run as a good
|
||||
* instance to mark a package as used (skip=1). Otherwise
|
||||
* we may run into a situation where the first CPU in a package
|
||||
* is not running anything, yet the second is, and this function
|
||||
* would mark the package as used after the first CPU and would
|
||||
* not read the values from the second CPU.
|
||||
*/
|
||||
if (!(vals->run && vals->ena))
|
||||
return 0;
|
||||
|
||||
s = cpu_map__get_socket(cpus, cpu);
|
||||
if (s < 0)
|
||||
return -1;
|
||||
@@ -235,7 +247,7 @@ process_counter_values(struct perf_stat_config *config, struct perf_evsel *evsel
|
||||
static struct perf_counts_values zero;
|
||||
bool skip = false;
|
||||
|
||||
if (check_per_pkg(evsel, cpu, &skip)) {
|
||||
if (check_per_pkg(evsel, count, cpu, &skip)) {
|
||||
pr_err("failed to read per-pkg counter\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -38,7 +38,7 @@ static inline char *bfd_demangle(void __maybe_unused *v,
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_ELF_GETPHDRNUM_SUPPORT
|
||||
int elf_getphdrnum(Elf *elf, size_t *dst)
|
||||
static int elf_getphdrnum(Elf *elf, size_t *dst)
|
||||
{
|
||||
GElf_Ehdr gehdr;
|
||||
GElf_Ehdr *ehdr;
|
||||
@@ -1271,8 +1271,6 @@ out_close:
|
||||
static int kcore__init(struct kcore *kcore, char *filename, int elfclass,
|
||||
bool temp)
|
||||
{
|
||||
GElf_Ehdr *ehdr;
|
||||
|
||||
kcore->elfclass = elfclass;
|
||||
|
||||
if (temp)
|
||||
@@ -1289,9 +1287,7 @@ static int kcore__init(struct kcore *kcore, char *filename, int elfclass,
|
||||
if (!gelf_newehdr(kcore->elf, elfclass))
|
||||
goto out_end;
|
||||
|
||||
ehdr = gelf_getehdr(kcore->elf, &kcore->ehdr);
|
||||
if (!ehdr)
|
||||
goto out_end;
|
||||
memset(&kcore->ehdr, 0, sizeof(GElf_Ehdr));
|
||||
|
||||
return 0;
|
||||
|
||||
@@ -1348,23 +1344,18 @@ static int kcore__copy_hdr(struct kcore *from, struct kcore *to, size_t count)
|
||||
static int kcore__add_phdr(struct kcore *kcore, int idx, off_t offset,
|
||||
u64 addr, u64 len)
|
||||
{
|
||||
GElf_Phdr gphdr;
|
||||
GElf_Phdr *phdr;
|
||||
GElf_Phdr phdr = {
|
||||
.p_type = PT_LOAD,
|
||||
.p_flags = PF_R | PF_W | PF_X,
|
||||
.p_offset = offset,
|
||||
.p_vaddr = addr,
|
||||
.p_paddr = 0,
|
||||
.p_filesz = len,
|
||||
.p_memsz = len,
|
||||
.p_align = page_size,
|
||||
};
|
||||
|
||||
phdr = gelf_getphdr(kcore->elf, idx, &gphdr);
|
||||
if (!phdr)
|
||||
return -1;
|
||||
|
||||
phdr->p_type = PT_LOAD;
|
||||
phdr->p_flags = PF_R | PF_W | PF_X;
|
||||
phdr->p_offset = offset;
|
||||
phdr->p_vaddr = addr;
|
||||
phdr->p_paddr = 0;
|
||||
phdr->p_filesz = len;
|
||||
phdr->p_memsz = len;
|
||||
phdr->p_align = page_size;
|
||||
|
||||
if (!gelf_update_phdr(kcore->elf, idx, phdr))
|
||||
if (!gelf_update_phdr(kcore->elf, idx, &phdr))
|
||||
return -1;
|
||||
|
||||
return 0;
|
||||
|
||||
@@ -709,7 +709,7 @@ bool find_process(const char *name)
|
||||
|
||||
dir = opendir(procfs__mountpoint());
|
||||
if (!dir)
|
||||
return -1;
|
||||
return false;
|
||||
|
||||
/* Walk through the directory. */
|
||||
while (ret && (d = readdir(dir)) != NULL) {
|
||||
|
||||
Reference in New Issue
Block a user