Skip to content

Commit 22a8352

Browse files
committed
tools/power turbostat: Add an NMI column
Add an NMI column, a proper sub-set of the IRQ column. It would be preferable if the kernel exported /sys/kernel/irq/NMI/per_cpu_count. But since we are already forced to parse /proc/interrupts, noticing which row is the NMI is simple enough. Suggested-by: Artem Bityutskiy <artem.bityutskiy@intel.com> Signed-off-by: Len Brown <len.brown@intel.com>
1 parent 05c14d8 commit 22a8352

File tree

1 file changed

+48
-6
lines changed

1 file changed

+48
-6
lines changed

tools/power/x86/turbostat/turbostat.c

Lines changed: 48 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,7 @@ struct msr_counter bic[] = {
202202
{ 0x0, "Die%c6", NULL, 0, 0, 0, NULL, 0 },
203203
{ 0x0, "SysWatt", NULL, 0, 0, 0, NULL, 0 },
204204
{ 0x0, "Sys_J", NULL, 0, 0, 0, NULL, 0 },
205+
{ 0x0, "NMI", NULL, 0, 0, 0, NULL, 0 },
205206
};
206207

207208
#define MAX_BIC (sizeof(bic) / sizeof(struct msr_counter))
@@ -266,12 +267,13 @@ struct msr_counter bic[] = {
266267
#define BIC_Diec6 (1ULL << 58)
267268
#define BIC_SysWatt (1ULL << 59)
268269
#define BIC_Sys_J (1ULL << 60)
270+
#define BIC_NMI (1ULL << 61)
269271

270272
#define BIC_TOPOLOGY (BIC_Package | BIC_Node | BIC_CoreCnt | BIC_PkgCnt | BIC_Core | BIC_CPU | BIC_Die )
271273
#define BIC_THERMAL_PWR ( BIC_CoreTmp | BIC_PkgTmp | BIC_PkgWatt | BIC_CorWatt | BIC_GFXWatt | BIC_RAMWatt | BIC_PKG__ | BIC_RAM__)
272274
#define BIC_FREQUENCY (BIC_Avg_MHz | BIC_Busy | BIC_Bzy_MHz | BIC_TSC_MHz | BIC_GFXMHz | BIC_GFXACTMHz | BIC_SAMMHz | BIC_SAMACTMHz | BIC_UNCORE_MHZ)
273275
#define BIC_IDLE (BIC_Busy | BIC_sysfs | BIC_CPU_c1 | BIC_CPU_c3 | BIC_CPU_c6 | BIC_CPU_c7 | BIC_GFX_rc6 | BIC_Pkgpc2 | BIC_Pkgpc3 | BIC_Pkgpc6 | BIC_Pkgpc7 | BIC_Pkgpc8 | BIC_Pkgpc9 | BIC_Pkgpc10 | BIC_CPU_LPI | BIC_SYS_LPI | BIC_Mod_c6 | BIC_Totl_c0 | BIC_Any_c0 | BIC_GFX_c0 | BIC_CPUGFX | BIC_SAM_mc6 | BIC_Diec6)
274-
#define BIC_OTHER ( BIC_IRQ | BIC_SMI | BIC_ThreadC | BIC_CoreTmp | BIC_IPC)
276+
#define BIC_OTHER ( BIC_IRQ | BIC_NMI | BIC_SMI | BIC_ThreadC | BIC_CoreTmp | BIC_IPC)
275277

276278
#define BIC_DISABLED_BY_DEFAULT (BIC_USEC | BIC_TOD | BIC_APIC | BIC_X2APIC | BIC_SysWatt | BIC_Sys_J)
277279

@@ -1628,6 +1630,7 @@ struct thread_data {
16281630
unsigned long long c1;
16291631
unsigned long long instr_count;
16301632
unsigned long long irq_count;
1633+
unsigned long long nmi_count;
16311634
unsigned int smi_count;
16321635
unsigned int cpu_id;
16331636
unsigned int apic_id;
@@ -1934,6 +1937,7 @@ struct timeval tv_even, tv_odd, tv_delta;
19341937

19351938
int *irq_column_2_cpu; /* /proc/interrupts column numbers */
19361939
int *irqs_per_cpu; /* indexed by cpu_num */
1940+
int *nmi_per_cpu; /* indexed by cpu_num */
19371941

19381942
void setup_all_buffers(bool startup);
19391943

@@ -2319,6 +2323,12 @@ void print_header(char *delim)
23192323
else
23202324
outp += sprintf(outp, "%sIRQ", (printed++ ? delim : ""));
23212325
}
2326+
if (DO_BIC(BIC_NMI)) {
2327+
if (sums_need_wide_columns)
2328+
outp += sprintf(outp, "%s NMI", (printed++ ? delim : ""));
2329+
else
2330+
outp += sprintf(outp, "%sNMI", (printed++ ? delim : ""));
2331+
}
23222332

23232333
if (DO_BIC(BIC_SMI))
23242334
outp += sprintf(outp, "%sSMI", (printed++ ? delim : ""));
@@ -2605,6 +2615,8 @@ int dump_counters(struct thread_data *t, struct core_data *c, struct pkg_data *p
26052615

26062616
if (DO_BIC(BIC_IRQ))
26072617
outp += sprintf(outp, "IRQ: %lld\n", t->irq_count);
2618+
if (DO_BIC(BIC_NMI))
2619+
outp += sprintf(outp, "IRQ: %lld\n", t->nmi_count);
26082620
if (DO_BIC(BIC_SMI))
26092621
outp += sprintf(outp, "SMI: %d\n", t->smi_count);
26102622

@@ -2824,6 +2836,14 @@ int format_counters(struct thread_data *t, struct core_data *c, struct pkg_data
28242836
outp += sprintf(outp, "%s%lld", (printed++ ? delim : ""), t->irq_count);
28252837
}
28262838

2839+
/* NMI */
2840+
if (DO_BIC(BIC_NMI)) {
2841+
if (sums_need_wide_columns)
2842+
outp += sprintf(outp, "%s%8lld", (printed++ ? delim : ""), t->nmi_count);
2843+
else
2844+
outp += sprintf(outp, "%s%lld", (printed++ ? delim : ""), t->nmi_count);
2845+
}
2846+
28272847
/* SMI */
28282848
if (DO_BIC(BIC_SMI))
28292849
outp += sprintf(outp, "%s%d", (printed++ ? delim : ""), t->smi_count);
@@ -3439,6 +3459,9 @@ int delta_thread(struct thread_data *new, struct thread_data *old, struct core_d
34393459
if (DO_BIC(BIC_IRQ))
34403460
old->irq_count = new->irq_count - old->irq_count;
34413461

3462+
if (DO_BIC(BIC_NMI))
3463+
old->nmi_count = new->nmi_count - old->nmi_count;
3464+
34423465
if (DO_BIC(BIC_SMI))
34433466
old->smi_count = new->smi_count - old->smi_count;
34443467

@@ -3519,6 +3542,7 @@ void clear_counters(struct thread_data *t, struct core_data *c, struct pkg_data
35193542
t->instr_count = 0;
35203543

35213544
t->irq_count = 0;
3545+
t->nmi_count = 0;
35223546
t->smi_count = 0;
35233547

35243548
c->c3 = 0;
@@ -3623,6 +3647,7 @@ int sum_counters(struct thread_data *t, struct core_data *c, struct pkg_data *p)
36233647
average.threads.instr_count += t->instr_count;
36243648

36253649
average.threads.irq_count += t->irq_count;
3650+
average.threads.nmi_count += t->nmi_count;
36263651
average.threads.smi_count += t->smi_count;
36273652

36283653
for (i = 0, mp = sys.tp; mp; i++, mp = mp->next) {
@@ -3764,6 +3789,9 @@ void compute_average(struct thread_data *t, struct core_data *c, struct pkg_data
37643789

37653790
if (average.threads.irq_count > 9999999)
37663791
sums_need_wide_columns = 1;
3792+
if (average.threads.nmi_count > 9999999)
3793+
sums_need_wide_columns = 1;
3794+
37673795

37683796
average.cores.c3 /= topo.allowed_cores;
37693797
average.cores.c6 /= topo.allowed_cores;
@@ -4620,6 +4648,8 @@ int get_counters(struct thread_data *t, struct core_data *c, struct pkg_data *p)
46204648

46214649
if (DO_BIC(BIC_IRQ))
46224650
t->irq_count = irqs_per_cpu[cpu];
4651+
if (DO_BIC(BIC_NMI))
4652+
t->nmi_count = nmi_per_cpu[cpu];
46234653

46244654
get_cstate_counters(cpu, t, c, p);
46254655

@@ -5365,6 +5395,7 @@ void free_all_buffers(void)
53655395

53665396
free(irq_column_2_cpu);
53675397
free(irqs_per_cpu);
5398+
free(nmi_per_cpu);
53685399

53695400
for (i = 0; i <= topo.max_cpu_num; ++i) {
53705401
if (cpus[i].put_ids)
@@ -5821,31 +5852,37 @@ int snapshot_proc_interrupts(void)
58215852

58225853
irq_column_2_cpu[column] = cpu_number;
58235854
irqs_per_cpu[cpu_number] = 0;
5855+
nmi_per_cpu[cpu_number] = 0;
58245856
}
58255857

58265858
/* read /proc/interrupt count lines and sum up irqs per cpu */
58275859
while (1) {
58285860
int column;
58295861
char buf[64];
5862+
int this_row_is_nmi = 0;
58305863

5831-
retval = fscanf(fp, " %s:", buf); /* flush irq# "N:" */
5864+
retval = fscanf(fp, " %s:", buf); /* irq# "N:" */
58325865
if (retval != 1)
58335866
break;
58345867

5868+
if (strncmp(buf, "NMI", strlen("NMI")) == 0)
5869+
this_row_is_nmi = 1;
5870+
58355871
/* read the count per cpu */
58365872
for (column = 0; column < topo.num_cpus; ++column) {
58375873

58385874
int cpu_number, irq_count;
58395875

58405876
retval = fscanf(fp, " %d", &irq_count);
5877+
58415878
if (retval != 1)
58425879
break;
58435880

58445881
cpu_number = irq_column_2_cpu[column];
58455882
irqs_per_cpu[cpu_number] += irq_count;
5846-
5883+
if (this_row_is_nmi)
5884+
nmi_per_cpu[cpu_number] += irq_count;
58475885
}
5848-
58495886
while (getc(fp) != '\n') ; /* flush interrupt description */
58505887

58515888
}
@@ -5942,7 +5979,7 @@ int snapshot_sys_lpi_us(void)
59425979
*/
59435980
int snapshot_proc_sysfs_files(void)
59445981
{
5945-
if (DO_BIC(BIC_IRQ))
5982+
if (DO_BIC(BIC_IRQ) || DO_BIC(BIC_NMI))
59465983
if (snapshot_proc_interrupts())
59475984
return 1;
59485985

@@ -8263,6 +8300,7 @@ void process_cpuid()
82638300
aperf_mperf_multiplier = platform->need_perf_multiplier ? 1024 : 1;
82648301

82658302
BIC_PRESENT(BIC_IRQ);
8303+
BIC_PRESENT(BIC_NMI);
82668304
BIC_PRESENT(BIC_TSC_MHz);
82678305
}
82688306

@@ -8613,7 +8651,11 @@ void allocate_irq_buffers(void)
86138651

86148652
irqs_per_cpu = calloc(topo.max_cpu_num + 1, sizeof(int));
86158653
if (irqs_per_cpu == NULL)
8616-
err(-1, "calloc %d", topo.max_cpu_num + 1);
8654+
err(-1, "calloc %d IRQ", topo.max_cpu_num + 1);
8655+
8656+
nmi_per_cpu = calloc(topo.max_cpu_num + 1, sizeof(int));
8657+
if (nmi_per_cpu == NULL)
8658+
err(-1, "calloc %d NMI", topo.max_cpu_num + 1);
86178659
}
86188660

86198661
int update_topo(struct thread_data *t, struct core_data *c, struct pkg_data *p)

0 commit comments

Comments
 (0)