Merge branch 'perf-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip

* 'perf-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip:
  perf tools: Run generate-cmdlist.sh properly
  perf_event: Clean up perf_event_init_task()
  perf_event: Fix event group handling in __perf_event_sched_*()
  perf timechart: Add a power-only mode
  perf top: Add poll_idle to the skip list
This commit is contained in:
Linus Torvalds 2009-10-05 12:04:41 -07:00
commit 41cb6654eb
6 changed files with 34 additions and 30 deletions

View file

@ -1030,14 +1030,10 @@ void __perf_event_sched_out(struct perf_event_context *ctx,
update_context_time(ctx);
perf_disable();
if (ctx->nr_active) {
list_for_each_entry(event, &ctx->group_list, group_entry) {
if (event != event->group_leader)
event_sched_out(event, cpuctx, ctx);
else
group_sched_out(event, cpuctx, ctx);
}
}
if (ctx->nr_active)
list_for_each_entry(event, &ctx->group_list, group_entry)
group_sched_out(event, cpuctx, ctx);
perf_enable();
out:
spin_unlock(&ctx->lock);
@ -1258,12 +1254,8 @@ __perf_event_sched_in(struct perf_event_context *ctx,
if (event->cpu != -1 && event->cpu != cpu)
continue;
if (event != event->group_leader)
event_sched_in(event, cpuctx, ctx, cpu);
else {
if (group_can_go_on(event, cpuctx, 1))
group_sched_in(event, cpuctx, ctx, cpu);
}
if (group_can_go_on(event, cpuctx, 1))
group_sched_in(event, cpuctx, ctx, cpu);
/*
* If this pinned group hasn't been scheduled,
@ -1291,15 +1283,9 @@ __perf_event_sched_in(struct perf_event_context *ctx,
if (event->cpu != -1 && event->cpu != cpu)
continue;
if (event != event->group_leader) {
if (event_sched_in(event, cpuctx, ctx, cpu))
if (group_can_go_on(event, cpuctx, can_add_hw))
if (group_sched_in(event, cpuctx, ctx, cpu))
can_add_hw = 0;
} else {
if (group_can_go_on(event, cpuctx, can_add_hw)) {
if (group_sched_in(event, cpuctx, ctx, cpu))
can_add_hw = 0;
}
}
}
perf_enable();
out:
@ -4781,9 +4767,7 @@ int perf_event_init_task(struct task_struct *child)
* We dont have to disable NMIs - we are only looking at
* the list, not manipulating it:
*/
list_for_each_entry_rcu(event, &parent_ctx->event_list, event_entry) {
if (event != event->group_leader)
continue;
list_for_each_entry(event, &parent_ctx->group_list, group_entry) {
if (!event->attr.inherit) {
inherited_all = 0;

View file

@ -31,6 +31,9 @@ OPTIONS
-w::
--width=::
Select the width of the SVG file (default: 1000)
-p::
--power-only::
Only output the CPU power section of the diagram
SEE ALSO

View file

@ -728,7 +728,7 @@ $(BUILT_INS): perf$X
common-cmds.h: util/generate-cmdlist.sh command-list.txt
common-cmds.h: $(wildcard Documentation/perf-*.txt)
$(QUIET_GEN)util/generate-cmdlist.sh > $@+ && mv $@+ $@
$(QUIET_GEN). util/generate-cmdlist.sh > $@+ && mv $@+ $@
$(patsubst %.sh,%,$(SCRIPT_SH)) : % : %.sh
$(QUIET_GEN)$(RM) $@ $@+ && \

View file

@ -46,6 +46,8 @@ static u64 turbo_frequency;
static u64 first_time, last_time;
static int power_only;
static struct perf_header *header;
@ -547,7 +549,7 @@ static void end_sample_processing(void)
u64 cpu;
struct power_event *pwr;
for (cpu = 0; cpu < numcpus; cpu++) {
for (cpu = 0; cpu <= numcpus; cpu++) {
pwr = malloc(sizeof(struct power_event));
if (!pwr)
return;
@ -871,7 +873,7 @@ static int determine_display_tasks(u64 threshold)
/* no exit marker, task kept running to the end */
if (p->end_time == 0)
p->end_time = last_time;
if (p->total_time >= threshold)
if (p->total_time >= threshold && !power_only)
p->display = 1;
c = p->all;
@ -882,7 +884,7 @@ static int determine_display_tasks(u64 threshold)
if (c->start_time == 1)
c->start_time = first_time;
if (c->total_time >= threshold) {
if (c->total_time >= threshold && !power_only) {
c->display = 1;
count++;
}
@ -1134,6 +1136,8 @@ static const struct option options[] = {
"output file name"),
OPT_INTEGER('w', "width", &svg_page_width,
"page width"),
OPT_BOOLEAN('p', "power-only", &power_only,
"output power data only"),
OPT_END()
};

View file

@ -782,6 +782,7 @@ static const char *skip_symbols[] = {
"exit_idle",
"mwait_idle",
"mwait_idle_with_hints",
"poll_idle",
"ppc64_runlatch_off",
"pseries_dedicated_idle_sleep",
NULL

View file

@ -28,7 +28,7 @@ static u64 turbo_frequency, max_freq;
int svg_page_width = 1000;
#define MIN_TEXT_SIZE 0.001
#define MIN_TEXT_SIZE 0.01
static u64 total_height;
static FILE *svgfile;
@ -217,6 +217,18 @@ static char *cpu_model(void)
}
fclose(file);
}
/* CPU type */
file = fopen("/sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies", "r");
if (file) {
while (fgets(buf, 255, file)) {
unsigned int freq;
freq = strtoull(buf, NULL, 10);
if (freq > max_freq)
max_freq = freq;
}
fclose(file);
}
return cpu_m;
}