@@ -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
19351938int * irq_column_2_cpu ; /* /proc/interrupts column numbers */
19361939int * irqs_per_cpu ; /* indexed by cpu_num */
1940+ int * nmi_per_cpu ; /* indexed by cpu_num */
19371941
19381942void 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 */
59435980int 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
86198661int update_topo (struct thread_data * t , struct core_data * c , struct pkg_data * p )
0 commit comments