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:
Ingo Molnar 2019-01-22 11:08:47 +01:00
commit d3c8c0af75
6 changed files with 35 additions and 23 deletions

View File

@ -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();

View File

@ -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;

View File

@ -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(&notes->lock); pthread_mutex_unlock(&notes->lock);

View File

@ -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:

View File

@ -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) {

View File

@ -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