Subject: perfmon2: don't call rtas when counting cycles From: Kevin Corry Don't make the RTAS 'activate-signals' call for counters that are counting cycles, since the RTAS code will treat that as an error. Signed-off-by: Kevin Corry Signed-off-by: Carl Love Signed-off-by: Arnd Bergmann Index: linux-2.6/arch/powerpc/perfmon/perfmon_cell.c =================================================================== --- linux-2.6.orig/arch/powerpc/perfmon/perfmon_cell.c +++ linux-2.6/arch/powerpc/perfmon/perfmon_cell.c @@ -191,13 +191,20 @@ static int rtas_activate_signals(struct static void write_pm07_event(int cpu, unsigned int ctr, u64 value) { struct cell_rtas_arg signal; + s32 signal_number; int rc; + signal_number = RTAS_SIGNAL_NUMBER(value); + if (!signal_number) { + /* Don't include counters that are counting cycles. */ + return; + } + signal.cpu = RTAS_CPU(cpu); signal.bus_word = 1 << RTAS_BUS_WORD(value); signal.sub_unit = RTAS_SUB_UNIT(value); - signal.signal_group = RTAS_SIGNAL_NUMBER(value) / 100; - signal.bit = RTAS_SIGNAL_NUMBER(value) % 100; + signal.signal_group = signal_number / 100; + signal.bit = signal_number % 100; rc = rtas_activate_signals(&signal, 1); if (rc) { @@ -327,6 +334,7 @@ void pfm_cell_restore_pmcs(struct pfm_ev struct cell_rtas_arg signals[NR_CTRS]; u64 value, *used_pmcs = set->used_pmcs; int i, rc, num_used = 0, cpu = smp_processor_id(); + s32 signal_number; memset(signals, 0, sizeof(signals)); @@ -337,21 +345,27 @@ void pfm_cell_restore_pmcs(struct pfm_ev */ cbe_write_pm07_control(cpu, i, set->pmcs[i]); - if (test_bit(i + NR_CTRS, used_pmcs)) { - /* Set up the next RTAS array entry for this counter. - * Only include pm07_event registers that are in use - * by this set so the RTAS call doesn't have to - * process blank array entries. - */ - value = set->pmcs[i + NR_CTRS]; - signals[num_used].cpu = RTAS_CPU(cpu); - signals[num_used].sub_unit = RTAS_SUB_UNIT(value); - signals[num_used].bus_word = 1 << RTAS_BUS_WORD(value); - signals[num_used].bit = RTAS_SIGNAL_NUMBER(value) % 100; - signals[num_used].signal_group = - RTAS_SIGNAL_NUMBER(value) / 100; - num_used++; + /* Set up the next RTAS array entry for this counter. Only + * include pm07_event registers that are in use by this set + * so the RTAS call doesn't have to process blank array entries. + */ + if (!test_bit(i + NR_CTRS, used_pmcs)) { + continue; } + + value = set->pmcs[i + NR_CTRS]; + signal_number = RTAS_SIGNAL_NUMBER(value); + if (!signal_number) { + /* Don't include counters that are counting cycles. */ + continue; + } + + signals[num_used].cpu = RTAS_CPU(cpu); + signals[num_used].sub_unit = RTAS_SUB_UNIT(value); + signals[num_used].bus_word = 1 << RTAS_BUS_WORD(value); + signals[num_used].signal_group = signal_number / 100; + signals[num_used].bit = signal_number % 100; + num_used++; } rc = rtas_activate_signals(signals, num_used);