int xnintr_query_next(int irq, xnintr_iterator_t *iterator, char *name_buf) { xnintr_t *intr; xnticks_t last_switch; int cpu_no = iterator->cpu + 1; int err = 0; spl_t s; if (cpu_no == xnarch_num_online_cpus()) cpu_no = 0; iterator->cpu = cpu_no; xnlock_get_irqsave(&intrlock, s); if (iterator->list_rev != xnintr_list_rev) { err = -EAGAIN; goto unlock_and_exit; } if (!iterator->prev) { if (irq == XNARCH_TIMER_IRQ) intr = &nkclock; else intr = xnintr_shirq_first(irq); } else intr = xnintr_shirq_next(iterator->prev); if (!intr) { cpu_no = -1; iterator->prev = NULL; err = -ENODEV; goto unlock_and_exit; } snprintf(name_buf, XNOBJECT_NAME_LEN, "IRQ%d: %s", irq, intr->name); iterator->hits = xnstat_counter_get(&intr->stat[cpu_no].hits); last_switch = xnpod_sched_slot(cpu_no)->last_account_switch; iterator->exectime_period = intr->stat[cpu_no].account.total; iterator->account_period = last_switch - intr->stat[cpu_no].account.start; intr->stat[cpu_no].sum.total += iterator->exectime_period; iterator->exectime_total = intr->stat[cpu_no].sum.total; intr->stat[cpu_no].account.total = 0; intr->stat[cpu_no].account.start = last_switch; /* Proceed to next entry in shared IRQ chain when all CPUs * have been visited for this one. */ if (cpu_no + 1 == xnarch_num_online_cpus()) iterator->prev = intr; unlock_and_exit: xnlock_put_irqrestore(&intrlock, s); return err; }
static unsigned long __intr_get_hits(RT_INTR *intr) { unsigned long sum = 0; int cpu; for (cpu = 0; cpu < XNARCH_NR_CPUS; cpu++) sum += xnstat_counter_get(&intr->intr_base.stat[cpu].hits); return sum; }