From 58731e5390d0cc392fc224b9221eab8f4514653b Mon Sep 17 00:00:00 2001 From: Sebastien GODARD Date: Sat, 29 Jan 2022 16:03:31 +0100 Subject: [PATCH] A_IRQ: Update sadf JSON output report Signed-off-by: Sebastien GODARD --- json_stats.c | 64 ++++++++++++++++++++++++++++++++++------------------ 1 file changed, 42 insertions(+), 22 deletions(-) diff --git a/json_stats.c b/json_stats.c index 735cbc4..cb139ea 100644 --- a/json_stats.c +++ b/json_stats.c @@ -329,41 +329,61 @@ __print_funct_t json_print_pcsw_stats(struct activity *a, int curr, int tab, __print_funct_t json_print_irq_stats(struct activity *a, int curr, int tab, unsigned long long itv) { - int i; - struct stats_irq *sic, *sip; + int i, c; + struct stats_irq *stc_cpu_irq, *stp_cpu_irq, *stc_cpuall_irq; + unsigned char masked_cpu_bitmap[BITMAP_SIZE(NR_CPUS)] = {0}; int sep = FALSE; - char irqno[16]; xprintf(tab++, "\"interrupts\": ["); - for (i = 0; (i < a->nr[curr]) && (i < a->bitmap->b_size + 1); i++) { + /* @nr[curr] cannot normally be greater than @nr_ini */ + if (a->nr[curr] > a->nr_ini) { + a->nr_ini = a->nr[curr]; + } - sic = (struct stats_irq *) ((char *) a->buf[curr] + i * a->msize); - sip = (struct stats_irq *) ((char *) a->buf[!curr] + i * a->msize); + /* Identify offline and unselected CPU, and keep persistent statistics values */ + get_global_int_statistics(a, !curr, curr, flags, masked_cpu_bitmap); - /* Should current interrupt (including int "sum") be displayed? */ - if (a->bitmap->b_array[i >> 3] & (1 << (i & 0x07))) { + for (i = 0; i < a->nr2; i++) { - /* Yes: Display it */ + stc_cpuall_irq = (struct stats_irq *) ((char *) a->buf[curr] + i * a->msize); - if (sep) { - printf(",\n"); - } - sep = TRUE; + if (a->item_list != NULL) { + /* A list of devices has been entered on the command line */ + if (!search_list_item(a->item_list, stc_cpuall_irq->irq_name)) + /* Device not found */ + continue; + } + + if (sep) { + printf(",\n"); + } + xprintf0(tab, "{\"intr\": \"%s\"", stc_cpuall_irq->irq_name); + sep = TRUE; - if (!i) { - /* This is interrupt "sum" */ - strcpy(irqno, "sum"); + for (c = 0; (c < a->nr[curr]) && (c < a->bitmap->b_size + 1); c++) { + + stc_cpu_irq = (struct stats_irq *) ((char *) a->buf[curr] + c * a->msize * a->nr2 + + i * a->msize); + stp_cpu_irq = (struct stats_irq *) ((char *) a->buf[!curr] + c * a->msize * a->nr2 + + i * a->msize); + + /* Should current CPU (including CPU "all") be displayed? */ + if (masked_cpu_bitmap[c >> 3] & (1 << (c & 0x07))) + /* No */ + continue; + + /* Yes: Display it */ + if (!c) { + printf(", \"all\": %.2f", + S_VALUE(stp_cpu_irq->irq_nr, stc_cpu_irq->irq_nr, itv)); } else { - sprintf(irqno, "%d", i - 1); + printf(", \"CPU%d\": %.2f", c - 1, + S_VALUE(stp_cpu_irq->irq_nr, stc_cpu_irq->irq_nr, itv)); } - - xprintf0(tab, "{\"intr\": \"%s\", " - "\"value\": %.2f}", - irqno, - S_VALUE(sip->irq_nr, sic->irq_nr, itv)); } + printf("}"); } printf("\n"); -- 2.40.0