aboutsummaryrefslogtreecommitdiff
path: root/idlestat.c
diff options
context:
space:
mode:
Diffstat (limited to 'idlestat.c')
-rw-r--r--idlestat.c22
1 files changed, 18 insertions, 4 deletions
diff --git a/idlestat.c b/idlestat.c
index 8058f7b..004fc87 100644
--- a/idlestat.c
+++ b/idlestat.c
@@ -18,6 +18,12 @@
#define IDLESTAT_VERSION "0.2"
+static char irq_type_name[][10] = {
+ "hard",
+ "soft",
+ "ipi"
+ };
+
static char buffer[BUFSIZE];
static inline int error(const char *str)
@@ -86,7 +92,7 @@ static int display_cstates(struct cpuidle_cstates *cstates, int state,
for (j = 0; j < wakeinfo->nrdata; j++, irqinfo++) {
printf("\t%s", str);
printf("/%sirq id %d, name %s, wakeup count %d\n",
- (irqinfo->irq_type == 0) ? "hard" : "soft",
+ (irqinfo->irq_type < IRQ_TYPE_MAX) ? irq_type_name[irqinfo->irq_type] : "NULL",
irqinfo->id, irqinfo->name, irqinfo->count);
}
}
@@ -317,6 +323,7 @@ static int store_irq(int cpu, int irqid, char *irqname,
#define TRACE_IRQ_FORMAT "%*[^[][%d] %*[^=]=%d%*[^=]=%16s"
#define TRACE_SOFTIRQ_FORMAT "%*[^[][%d] %*[^=]=%d%*[^=]=%16[^]]s"
+#define TRACE_IPIIRQ_FORMAT "%*[^[][%d] %*[^=]=%d%*[^=]=%16s"
#define TRACE_CMD_FORMAT "%*[^]]] %lf:%*[^=]=%u%*[^=]=%d"
#define TRACE_FORMAT "%*[^]]] %*s %lf:%*[^=]=%u%*[^=]=%d"
@@ -329,14 +336,21 @@ static int get_wakeup_irq(struct cpuidle_datas *datas, char *buffer, int count)
if (strstr(buffer, "irq_handler_entry")) {
sscanf(buffer, TRACE_IRQ_FORMAT, &cpu, &irqid, irqname);
- store_irq(cpu, irqid, irqname, datas, count, 0);
+ store_irq(cpu, irqid, irqname, datas, count, HARD_IRQ);
return 0;
}
- if (strstr(buffer, "softirq_raise")) {
+ if (strstr(buffer, "softirq_entry")) {
sscanf(buffer, TRACE_SOFTIRQ_FORMAT, &cpu, &irqid, irqname);
- store_irq(cpu, irqid, irqname, datas, count, 1);
+ store_irq(cpu, irqid, irqname, datas, count, SOFT_IRQ);
+ return 0;
+ }
+
+ if (strstr(buffer, "ipi_handler_entry")) {
+ sscanf(buffer, TRACE_IPIIRQ_FORMAT, &cpu, &irqid, irqname);
+
+ store_irq(cpu, irqid, irqname, datas, count, IPI_IRQ);
return 0;
}