@@ -134,7 +134,7 @@ static void desc_set_defaults(unsigned int irq, struct irq_desc *desc, int node,
134
134
desc -> name = NULL ;
135
135
desc -> owner = owner ;
136
136
for_each_possible_cpu (cpu )
137
- * per_cpu_ptr (desc -> kstat_irqs , cpu ) = 0 ;
137
+ * per_cpu_ptr (desc -> kstat_irqs , cpu ) = ( struct irqstat ) { } ;
138
138
desc_smp_init (desc , node , affinity );
139
139
}
140
140
@@ -186,7 +186,7 @@ static int init_desc(struct irq_desc *desc, int irq, int node,
186
186
const struct cpumask * affinity ,
187
187
struct module * owner )
188
188
{
189
- desc -> kstat_irqs = alloc_percpu (unsigned int );
189
+ desc -> kstat_irqs = alloc_percpu (struct irqstat );
190
190
if (!desc -> kstat_irqs )
191
191
return - ENOMEM ;
192
192
@@ -968,33 +968,63 @@ unsigned int kstat_irqs_cpu(unsigned int irq, int cpu)
968
968
{
969
969
struct irq_desc * desc = irq_to_desc (irq );
970
970
971
- return desc && desc -> kstat_irqs ?
972
- * per_cpu_ptr (desc -> kstat_irqs , cpu ) : 0 ;
971
+ return desc && desc -> kstat_irqs ? per_cpu (desc -> kstat_irqs -> cnt , cpu ) : 0 ;
973
972
}
974
973
975
974
static bool irq_is_nmi (struct irq_desc * desc )
976
975
{
977
976
return desc -> istate & IRQS_NMI ;
978
977
}
979
978
980
- static unsigned int kstat_irqs ( unsigned int irq )
979
+ unsigned int kstat_irqs_desc ( struct irq_desc * desc , const struct cpumask * cpumask )
981
980
{
982
- struct irq_desc * desc = irq_to_desc (irq );
983
981
unsigned int sum = 0 ;
984
982
int cpu ;
985
983
986
- if (!desc || !desc -> kstat_irqs )
987
- return 0 ;
988
984
if (!irq_settings_is_per_cpu_devid (desc ) &&
989
985
!irq_settings_is_per_cpu (desc ) &&
990
986
!irq_is_nmi (desc ))
991
987
return data_race (desc -> tot_count );
992
988
993
- for_each_possible_cpu (cpu )
994
- sum += data_race (* per_cpu_ptr (desc -> kstat_irqs , cpu ));
989
+ for_each_cpu (cpu , cpumask )
990
+ sum += data_race (per_cpu (desc -> kstat_irqs -> cnt , cpu ));
995
991
return sum ;
996
992
}
997
993
994
+ static unsigned int kstat_irqs (unsigned int irq )
995
+ {
996
+ struct irq_desc * desc = irq_to_desc (irq );
997
+
998
+ if (!desc || !desc -> kstat_irqs )
999
+ return 0 ;
1000
+ return kstat_irqs_desc (desc , cpu_possible_mask );
1001
+ }
1002
+
1003
+ #ifdef CONFIG_GENERIC_IRQ_STAT_SNAPSHOT
1004
+
1005
+ void kstat_snapshot_irqs (void )
1006
+ {
1007
+ struct irq_desc * desc ;
1008
+ unsigned int irq ;
1009
+
1010
+ for_each_irq_desc (irq , desc ) {
1011
+ if (!desc -> kstat_irqs )
1012
+ continue ;
1013
+ this_cpu_write (desc -> kstat_irqs -> ref , this_cpu_read (desc -> kstat_irqs -> cnt ));
1014
+ }
1015
+ }
1016
+
1017
+ unsigned int kstat_get_irq_since_snapshot (unsigned int irq )
1018
+ {
1019
+ struct irq_desc * desc = irq_to_desc (irq );
1020
+
1021
+ if (!desc || !desc -> kstat_irqs )
1022
+ return 0 ;
1023
+ return this_cpu_read (desc -> kstat_irqs -> cnt ) - this_cpu_read (desc -> kstat_irqs -> ref );
1024
+ }
1025
+
1026
+ #endif
1027
+
998
1028
/**
999
1029
* kstat_irqs_usr - Get the statistics for an interrupt from thread context
1000
1030
* @irq: The interrupt number
0 commit comments