perf/urgent fixes:
Kernel: Stephane Eranian: - Fix perf_proc_update_handler() bug. perf script: Andi Kleen: - Fix crash with printing mixed trace point and other events. Tony Jones: - Fix crash when processing recorded stat data. perf top: He Kuang: - Fix wrong hottest instruction highlighted. perf python: Arnaldo Carvalho de Melo: - Remove -fstack-clash-protection when building with some clang versions. perf ordered_events: Jiri Olsa: - Fix out of buffers crash in ordered_events__free(). perf cpu_map: Stephane Eranian: - Handle TOPOLOGY headers with no CPU. Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> -----BEGIN PGP SIGNATURE----- iHUEABYIAB0WIQR2GiIUctdOfX2qHhGyPKLppCJ+JwUCXEYQMgAKCRCyPKLppCJ+ J/pYAP0c+6frwxCAll72bigi+/+5t+1kc/zpM5jNgt97moGh2AD+KKrN5h4E0Z/J g5T2FOpiwB4cxpVjYTVRchDlx9JohgA= =X2zj -----END PGP SIGNATURE----- Merge tag 'perf-urgent-for-mingo-5.0-20190121' of git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux into perf/urgent Pull perf/urgent fixes from Arnaldo Carvalho de Melo: Kernel: Stephane Eranian: - Fix perf_proc_update_handler() bug. perf script: Andi Kleen: - Fix crash with printing mixed trace point and other events. Tony Jones: - Fix crash when processing recorded stat data. perf top: He Kuang: - Fix wrong hottest instruction highlighted. perf python: Arnaldo Carvalho de Melo: - Remove -fstack-clash-protection when building with some clang versions. perf ordered_events: Jiri Olsa: - Fix out of buffers crash in ordered_events__free(). perf cpu_map: Stephane Eranian: - Handle TOPOLOGY headers with no CPU. Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> Signed-off-by: Ingo Molnar <mingo@kernel.org>
This commit is contained in:
commit
d3c8c0af75
@ -436,18 +436,18 @@ int perf_proc_update_handler(struct ctl_table *table, int write,
|
|||||||
void __user *buffer, size_t *lenp,
|
void __user *buffer, size_t *lenp,
|
||||||
loff_t *ppos)
|
loff_t *ppos)
|
||||||
{
|
{
|
||||||
int ret = proc_dointvec_minmax(table, write, buffer, lenp, ppos);
|
int ret;
|
||||||
|
int perf_cpu = sysctl_perf_cpu_time_max_percent;
|
||||||
if (ret || !write)
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If throttling is disabled don't allow the write:
|
* If throttling is disabled don't allow the write:
|
||||||
*/
|
*/
|
||||||
if (sysctl_perf_cpu_time_max_percent == 100 ||
|
if (write && (perf_cpu == 100 || perf_cpu == 0))
|
||||||
sysctl_perf_cpu_time_max_percent == 0)
|
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
|
ret = proc_dointvec_minmax(table, write, buffer, lenp, ppos);
|
||||||
|
if (ret || !write)
|
||||||
|
return ret;
|
||||||
|
|
||||||
max_samples_per_tick = DIV_ROUND_UP(sysctl_perf_event_sample_rate, HZ);
|
max_samples_per_tick = DIV_ROUND_UP(sysctl_perf_event_sample_rate, HZ);
|
||||||
perf_sample_period_ns = NSEC_PER_SEC / sysctl_perf_event_sample_rate;
|
perf_sample_period_ns = NSEC_PER_SEC / sysctl_perf_event_sample_rate;
|
||||||
update_perf_cpu_limits();
|
update_perf_cpu_limits();
|
||||||
|
@ -1681,13 +1681,8 @@ static void perf_sample__fprint_metric(struct perf_script *script,
|
|||||||
.force_header = false,
|
.force_header = false,
|
||||||
};
|
};
|
||||||
struct perf_evsel *ev2;
|
struct perf_evsel *ev2;
|
||||||
static bool init;
|
|
||||||
u64 val;
|
u64 val;
|
||||||
|
|
||||||
if (!init) {
|
|
||||||
perf_stat__init_shadow_stats();
|
|
||||||
init = true;
|
|
||||||
}
|
|
||||||
if (!evsel->stats)
|
if (!evsel->stats)
|
||||||
perf_evlist__alloc_stats(script->session->evlist, false);
|
perf_evlist__alloc_stats(script->session->evlist, false);
|
||||||
if (evsel_script(evsel->leader)->gnum++ == 0)
|
if (evsel_script(evsel->leader)->gnum++ == 0)
|
||||||
@ -1794,7 +1789,7 @@ static void process_event(struct perf_script *script,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (PRINT_FIELD(TRACE)) {
|
if (PRINT_FIELD(TRACE) && sample->raw_data) {
|
||||||
event_format__fprintf(evsel->tp_format, sample->cpu,
|
event_format__fprintf(evsel->tp_format, sample->cpu,
|
||||||
sample->raw_data, sample->raw_size, fp);
|
sample->raw_data, sample->raw_size, fp);
|
||||||
}
|
}
|
||||||
@ -2359,6 +2354,8 @@ static int __cmd_script(struct perf_script *script)
|
|||||||
|
|
||||||
signal(SIGINT, sig_handler);
|
signal(SIGINT, sig_handler);
|
||||||
|
|
||||||
|
perf_stat__init_shadow_stats();
|
||||||
|
|
||||||
/* override event processing functions */
|
/* override event processing functions */
|
||||||
if (script->show_task_events) {
|
if (script->show_task_events) {
|
||||||
script->tool.comm = process_comm_event;
|
script->tool.comm = process_comm_event;
|
||||||
|
@ -224,20 +224,24 @@ static unsigned int annotate_browser__refresh(struct ui_browser *browser)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int disasm__cmp(struct annotation_line *a, struct annotation_line *b)
|
static double disasm__cmp(struct annotation_line *a, struct annotation_line *b,
|
||||||
|
int percent_type)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = 0; i < a->data_nr; i++) {
|
for (i = 0; i < a->data_nr; i++) {
|
||||||
if (a->data[i].percent == b->data[i].percent)
|
if (a->data[i].percent[percent_type] == b->data[i].percent[percent_type])
|
||||||
continue;
|
continue;
|
||||||
return a->data[i].percent < b->data[i].percent;
|
return a->data[i].percent[percent_type] -
|
||||||
|
b->data[i].percent[percent_type];
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void disasm_rb_tree__insert(struct rb_root *root, struct annotation_line *al)
|
static void disasm_rb_tree__insert(struct annotate_browser *browser,
|
||||||
|
struct annotation_line *al)
|
||||||
{
|
{
|
||||||
|
struct rb_root *root = &browser->entries;
|
||||||
struct rb_node **p = &root->rb_node;
|
struct rb_node **p = &root->rb_node;
|
||||||
struct rb_node *parent = NULL;
|
struct rb_node *parent = NULL;
|
||||||
struct annotation_line *l;
|
struct annotation_line *l;
|
||||||
@ -246,7 +250,7 @@ static void disasm_rb_tree__insert(struct rb_root *root, struct annotation_line
|
|||||||
parent = *p;
|
parent = *p;
|
||||||
l = rb_entry(parent, struct annotation_line, rb_node);
|
l = rb_entry(parent, struct annotation_line, rb_node);
|
||||||
|
|
||||||
if (disasm__cmp(al, l))
|
if (disasm__cmp(al, l, browser->opts->percent_type) < 0)
|
||||||
p = &(*p)->rb_left;
|
p = &(*p)->rb_left;
|
||||||
else
|
else
|
||||||
p = &(*p)->rb_right;
|
p = &(*p)->rb_right;
|
||||||
@ -329,7 +333,7 @@ static void annotate_browser__calc_percent(struct annotate_browser *browser,
|
|||||||
RB_CLEAR_NODE(&pos->al.rb_node);
|
RB_CLEAR_NODE(&pos->al.rb_node);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
disasm_rb_tree__insert(&browser->entries, &pos->al);
|
disasm_rb_tree__insert(browser, &pos->al);
|
||||||
}
|
}
|
||||||
pthread_mutex_unlock(¬es->lock);
|
pthread_mutex_unlock(¬es->lock);
|
||||||
|
|
||||||
|
@ -134,7 +134,12 @@ struct cpu_map *cpu_map__new(const char *cpu_list)
|
|||||||
if (!cpu_list)
|
if (!cpu_list)
|
||||||
return cpu_map__read_all_cpu_map();
|
return cpu_map__read_all_cpu_map();
|
||||||
|
|
||||||
if (!isdigit(*cpu_list))
|
/*
|
||||||
|
* must handle the case of empty cpumap to cover
|
||||||
|
* TOPOLOGY header for NUMA nodes with no CPU
|
||||||
|
* ( e.g., because of CPU hotplug)
|
||||||
|
*/
|
||||||
|
if (!isdigit(*cpu_list) && *cpu_list != '\0')
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
while (isdigit(*cpu_list)) {
|
while (isdigit(*cpu_list)) {
|
||||||
@ -181,8 +186,10 @@ struct cpu_map *cpu_map__new(const char *cpu_list)
|
|||||||
|
|
||||||
if (nr_cpus > 0)
|
if (nr_cpus > 0)
|
||||||
cpus = cpu_map__trim_new(nr_cpus, tmp_cpus);
|
cpus = cpu_map__trim_new(nr_cpus, tmp_cpus);
|
||||||
else
|
else if (*cpu_list != '\0')
|
||||||
cpus = cpu_map__default_new();
|
cpus = cpu_map__default_new();
|
||||||
|
else
|
||||||
|
cpus = cpu_map__dummy_new();
|
||||||
invalid:
|
invalid:
|
||||||
free(tmp_cpus);
|
free(tmp_cpus);
|
||||||
out:
|
out:
|
||||||
|
@ -391,8 +391,10 @@ void ordered_events__free(struct ordered_events *oe)
|
|||||||
* Current buffer might not have all the events allocated
|
* Current buffer might not have all the events allocated
|
||||||
* yet, we need to free only allocated ones ...
|
* yet, we need to free only allocated ones ...
|
||||||
*/
|
*/
|
||||||
list_del(&oe->buffer->list);
|
if (oe->buffer) {
|
||||||
ordered_events_buffer__free(oe->buffer, oe->buffer_idx, oe);
|
list_del(&oe->buffer->list);
|
||||||
|
ordered_events_buffer__free(oe->buffer, oe->buffer_idx, oe);
|
||||||
|
}
|
||||||
|
|
||||||
/* ... and continue with the rest */
|
/* ... and continue with the rest */
|
||||||
list_for_each_entry_safe(buffer, tmp, &oe->to_free, list) {
|
list_for_each_entry_safe(buffer, tmp, &oe->to_free, list) {
|
||||||
|
@ -17,6 +17,8 @@ if cc == "clang":
|
|||||||
vars[var] = sub("-mcet", "", vars[var])
|
vars[var] = sub("-mcet", "", vars[var])
|
||||||
if not clang_has_option("-fcf-protection"):
|
if not clang_has_option("-fcf-protection"):
|
||||||
vars[var] = sub("-fcf-protection", "", vars[var])
|
vars[var] = sub("-fcf-protection", "", vars[var])
|
||||||
|
if not clang_has_option("-fstack-clash-protection"):
|
||||||
|
vars[var] = sub("-fstack-clash-protection", "", vars[var])
|
||||||
|
|
||||||
from distutils.core import setup, Extension
|
from distutils.core import setup, Extension
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user