@@ -104,8 +104,6 @@ struct arm_ni_cd {
104
104
u16 id ;
105
105
int num_units ;
106
106
int irq ;
107
- int cpu ;
108
- struct hlist_node cpuhp_node ;
109
107
struct pmu pmu ;
110
108
struct arm_ni_unit * units ;
111
109
struct perf_event * evcnt [NI_NUM_COUNTERS ];
@@ -117,13 +115,18 @@ struct arm_ni {
117
115
void __iomem * base ;
118
116
enum ni_part part ;
119
117
int id ;
118
+ int cpu ;
120
119
int num_cds ;
120
+ struct hlist_node cpuhp_node ;
121
121
struct arm_ni_cd cds [] __counted_by (num_cds );
122
122
};
123
123
124
124
#define cd_to_ni (cd ) container_of((cd), struct arm_ni, cds[(cd)->id])
125
125
#define pmu_to_cd (p ) container_of((p), struct arm_ni_cd, pmu)
126
126
127
+ #define ni_for_each_cd (n , c ) \
128
+ for (struct arm_ni_cd *c = n->cds; c < n->cds + n->num_cds; c++) if (c->pmu_base)
129
+
127
130
#define cd_for_each_unit (cd , u ) \
128
131
for (struct arm_ni_unit *u = cd->units; u < cd->units + cd->num_units; u++)
129
132
@@ -218,9 +221,9 @@ static const struct attribute_group arm_ni_format_attrs_group = {
218
221
static ssize_t arm_ni_cpumask_show (struct device * dev ,
219
222
struct device_attribute * attr , char * buf )
220
223
{
221
- struct arm_ni_cd * cd = pmu_to_cd (dev_get_drvdata (dev ));
224
+ struct arm_ni * ni = cd_to_ni ( pmu_to_cd (dev_get_drvdata (dev ) ));
222
225
223
- return cpumap_print_to_pagebuf (true, buf , cpumask_of (cd -> cpu ));
226
+ return cpumap_print_to_pagebuf (true, buf , cpumask_of (ni -> cpu ));
224
227
}
225
228
226
229
static struct device_attribute arm_ni_cpumask_attr =
@@ -314,7 +317,7 @@ static int arm_ni_event_init(struct perf_event *event)
314
317
if (is_sampling_event (event ))
315
318
return - EINVAL ;
316
319
317
- event -> cpu = cd -> cpu ;
320
+ event -> cpu = cd_to_ni ( cd ) -> cpu ;
318
321
if (NI_EVENT_TYPE (event ) == NI_PMU )
319
322
return arm_ni_validate_group (event );
320
323
@@ -543,8 +546,7 @@ static int arm_ni_init_cd(struct arm_ni *ni, struct arm_ni_node *node, u64 res_s
543
546
if (err )
544
547
return err ;
545
548
546
- cd -> cpu = cpumask_local_spread (0 , dev_to_node (ni -> dev ));
547
- irq_set_affinity (cd -> irq , cpumask_of (cd -> cpu ));
549
+ irq_set_affinity (cd -> irq , cpumask_of (ni -> cpu ));
548
550
549
551
cd -> pmu = (struct pmu ) {
550
552
.module = THIS_MODULE ,
@@ -566,32 +568,19 @@ static int arm_ni_init_cd(struct arm_ni *ni, struct arm_ni_node *node, u64 res_s
566
568
if (!name )
567
569
return - ENOMEM ;
568
570
569
- err = cpuhp_state_add_instance_nocalls (arm_ni_hp_state , & cd -> cpuhp_node );
570
- if (err )
571
- return err ;
572
-
573
- err = perf_pmu_register (& cd -> pmu , name , -1 );
574
- if (err )
575
- cpuhp_state_remove_instance_nocalls (arm_ni_hp_state , & cd -> cpuhp_node );
576
-
577
- return err ;
571
+ return perf_pmu_register (& cd -> pmu , name , -1 );
578
572
}
579
573
580
574
static void arm_ni_remove (struct platform_device * pdev )
581
575
{
582
576
struct arm_ni * ni = platform_get_drvdata (pdev );
583
577
584
- for (int i = 0 ; i < ni -> num_cds ; i ++ ) {
585
- struct arm_ni_cd * cd = ni -> cds + i ;
586
-
587
- if (!cd -> pmu_base )
588
- continue ;
589
-
578
+ ni_for_each_cd (ni , cd ) {
590
579
writel_relaxed (0 , cd -> pmu_base + NI_PMCR );
591
580
writel_relaxed (U32_MAX , cd -> pmu_base + NI_PMINTENCLR );
592
581
perf_pmu_unregister (& cd -> pmu );
593
- cpuhp_state_remove_instance_nocalls (arm_ni_hp_state , & cd -> cpuhp_node );
594
582
}
583
+ cpuhp_state_remove_instance_nocalls (arm_ni_hp_state , & ni -> cpuhp_node );
595
584
}
596
585
597
586
static void arm_ni_probe_domain (void __iomem * base , struct arm_ni_node * node )
@@ -611,7 +600,7 @@ static int arm_ni_probe(struct platform_device *pdev)
611
600
struct resource * res ;
612
601
void __iomem * base ;
613
602
static atomic_t id ;
614
- int num_cds ;
603
+ int ret , num_cds ;
615
604
u32 reg , part ;
616
605
617
606
/*
@@ -662,17 +651,20 @@ static int arm_ni_probe(struct platform_device *pdev)
662
651
ni -> num_cds = num_cds ;
663
652
ni -> part = part ;
664
653
ni -> id = atomic_fetch_inc (& id );
654
+ ni -> cpu = cpumask_local_spread (0 , dev_to_node (ni -> dev ));
665
655
platform_set_drvdata (pdev , ni );
666
656
657
+ ret = cpuhp_state_add_instance_nocalls (arm_ni_hp_state , & ni -> cpuhp_node );
658
+ if (ret )
659
+ return ret ;
660
+
667
661
for (int v = 0 ; v < cfg .num_components ; v ++ ) {
668
662
reg = readl_relaxed (cfg .base + NI_CHILD_PTR (v ));
669
663
arm_ni_probe_domain (base + reg , & vd );
670
664
for (int p = 0 ; p < vd .num_components ; p ++ ) {
671
665
reg = readl_relaxed (vd .base + NI_CHILD_PTR (p ));
672
666
arm_ni_probe_domain (base + reg , & pd );
673
667
for (int c = 0 ; c < pd .num_components ; c ++ ) {
674
- int ret ;
675
-
676
668
reg = readl_relaxed (pd .base + NI_CHILD_PTR (c ));
677
669
arm_ni_probe_domain (base + reg , & cd );
678
670
ret = arm_ni_init_cd (ni , & cd , res -> start );
@@ -715,42 +707,44 @@ static struct platform_driver arm_ni_driver = {
715
707
.remove = arm_ni_remove ,
716
708
};
717
709
718
- static void arm_ni_pmu_migrate (struct arm_ni_cd * cd , unsigned int cpu )
710
+ static void arm_ni_pmu_migrate (struct arm_ni * ni , unsigned int cpu )
719
711
{
720
- perf_pmu_migrate_context (& cd -> pmu , cd -> cpu , cpu );
721
- irq_set_affinity (cd -> irq , cpumask_of (cpu ));
722
- cd -> cpu = cpu ;
712
+ ni_for_each_cd (ni , cd ) {
713
+ perf_pmu_migrate_context (& cd -> pmu , ni -> cpu , cpu );
714
+ irq_set_affinity (cd -> irq , cpumask_of (cpu ));
715
+ }
716
+ ni -> cpu = cpu ;
723
717
}
724
718
725
719
static int arm_ni_pmu_online_cpu (unsigned int cpu , struct hlist_node * cpuhp_node )
726
720
{
727
- struct arm_ni_cd * cd ;
721
+ struct arm_ni * ni ;
728
722
int node ;
729
723
730
- cd = hlist_entry_safe (cpuhp_node , struct arm_ni_cd , cpuhp_node );
731
- node = dev_to_node (cd_to_ni ( cd ) -> dev );
732
- if (cpu_to_node (cd -> cpu ) != node && cpu_to_node (cpu ) == node )
733
- arm_ni_pmu_migrate (cd , cpu );
724
+ ni = hlist_entry_safe (cpuhp_node , struct arm_ni , cpuhp_node );
725
+ node = dev_to_node (ni -> dev );
726
+ if (cpu_to_node (ni -> cpu ) != node && cpu_to_node (cpu ) == node )
727
+ arm_ni_pmu_migrate (ni , cpu );
734
728
return 0 ;
735
729
}
736
730
737
731
static int arm_ni_pmu_offline_cpu (unsigned int cpu , struct hlist_node * cpuhp_node )
738
732
{
739
- struct arm_ni_cd * cd ;
733
+ struct arm_ni * ni ;
740
734
unsigned int target ;
741
735
int node ;
742
736
743
- cd = hlist_entry_safe (cpuhp_node , struct arm_ni_cd , cpuhp_node );
744
- if (cpu != cd -> cpu )
737
+ ni = hlist_entry_safe (cpuhp_node , struct arm_ni , cpuhp_node );
738
+ if (cpu != ni -> cpu )
745
739
return 0 ;
746
740
747
- node = dev_to_node (cd_to_ni ( cd ) -> dev );
741
+ node = dev_to_node (ni -> dev );
748
742
target = cpumask_any_and_but (cpumask_of_node (node ), cpu_online_mask , cpu );
749
743
if (target >= nr_cpu_ids )
750
744
target = cpumask_any_but (cpu_online_mask , cpu );
751
745
752
746
if (target < nr_cpu_ids )
753
- arm_ni_pmu_migrate (cd , target );
747
+ arm_ni_pmu_migrate (ni , target );
754
748
return 0 ;
755
749
}
756
750
0 commit comments