@@ -180,39 +180,27 @@ static int sf_buffer_available(struct cpu_hw_sf *cpuhw)
180180 */
181181static void free_sampling_buffer (struct sf_buffer * sfb )
182182{
183- unsigned long * sdbt , * curr ;
184-
185- if (!sfb -> sdbt )
186- return ;
183+ unsigned long * sdbt , * curr , * head ;
187184
188185 sdbt = sfb -> sdbt ;
189- curr = sdbt ;
190-
186+ if (!sdbt )
187+ return ;
188+ sfb -> sdbt = NULL ;
191189 /* Free the SDBT after all SDBs are processed... */
192- while (1 ) {
193- if (!* curr || !sdbt )
194- break ;
195-
196- /* Process table-link entries */
190+ head = sdbt ;
191+ curr = sdbt ;
192+ do {
197193 if (is_link_entry (curr )) {
194+ /* Process table-link entries */
198195 curr = get_next_sdbt (curr );
199- if (sdbt )
200- free_page ((unsigned long )sdbt );
201-
202- /* If the origin is reached, sampling buffer is freed */
203- if (curr == sfb -> sdbt )
204- break ;
205- else
206- sdbt = curr ;
196+ free_page ((unsigned long )sdbt );
197+ sdbt = curr ;
207198 } else {
208199 /* Process SDB pointer */
209- if (* curr ) {
210- free_page ((unsigned long )phys_to_virt (* curr ));
211- curr ++ ;
212- }
200+ free_page ((unsigned long )phys_to_virt (* curr ));
201+ curr ++ ;
213202 }
214- }
215-
203+ } while (curr != head );
216204 memset (sfb , 0 , sizeof (* sfb ));
217205}
218206
@@ -404,7 +392,7 @@ static void sfb_init_allocs(unsigned long num, struct hw_perf_event *hwc)
404392
405393static void deallocate_buffers (struct cpu_hw_sf * cpuhw )
406394{
407- if (cpuhw -> sfb . sdbt )
395+ if (sf_buffer_available ( cpuhw ) )
408396 free_sampling_buffer (& cpuhw -> sfb );
409397}
410398
@@ -559,16 +547,15 @@ static void setup_pmc_cpu(void *flags)
559547{
560548 struct cpu_hw_sf * cpuhw = this_cpu_ptr (& cpu_hw_sf );
561549
550+ sf_disable ();
562551 switch (* ((int * )flags )) {
563552 case PMC_INIT :
564553 memset (cpuhw , 0 , sizeof (* cpuhw ));
565554 qsi (& cpuhw -> qsi );
566555 cpuhw -> flags |= PMU_F_RESERVED ;
567- sf_disable ();
568556 break ;
569557 case PMC_RELEASE :
570558 cpuhw -> flags &= ~PMU_F_RESERVED ;
571- sf_disable ();
572559 deallocate_buffers (cpuhw );
573560 break ;
574561 }
@@ -759,7 +746,6 @@ static int __hw_perf_event_init(struct perf_event *event)
759746 reserve_pmc_hardware ();
760747 refcount_set (& num_events , 1 );
761748 }
762- mutex_unlock (& pmc_reserve_mutex );
763749 event -> destroy = hw_perf_event_destroy ;
764750
765751 /* Access per-CPU sampling information (query sampling info) */
@@ -818,7 +804,7 @@ static int __hw_perf_event_init(struct perf_event *event)
818804
819805 /* Use AUX buffer. No need to allocate it by ourself */
820806 if (attr -> config == PERF_EVENT_CPUM_SF_DIAG )
821- return 0 ;
807+ goto out ;
822808
823809 /* Allocate the per-CPU sampling buffer using the CPU information
824810 * from the event. If the event is not pinned to a particular
@@ -848,6 +834,7 @@ static int __hw_perf_event_init(struct perf_event *event)
848834 if (is_default_overflow_handler (event ))
849835 event -> overflow_handler = cpumsf_output_event_pid ;
850836out :
837+ mutex_unlock (& pmc_reserve_mutex );
851838 return err ;
852839}
853840
@@ -898,9 +885,6 @@ static int cpumsf_pmu_event_init(struct perf_event *event)
898885 event -> attr .exclude_idle = 0 ;
899886
900887 err = __hw_perf_event_init (event );
901- if (unlikely (err ))
902- if (event -> destroy )
903- event -> destroy (event );
904888 return err ;
905889}
906890
@@ -910,10 +894,14 @@ static void cpumsf_pmu_enable(struct pmu *pmu)
910894 struct hw_perf_event * hwc ;
911895 int err ;
912896
913- if (cpuhw -> flags & PMU_F_ENABLED )
914- return ;
915-
916- if (cpuhw -> flags & PMU_F_ERR_MASK )
897+ /*
898+ * Event must be
899+ * - added/started on this CPU (PMU_F_IN_USE set)
900+ * - and CPU must be available (PMU_F_RESERVED set)
901+ * - and not already enabled (PMU_F_ENABLED not set)
902+ * - and not in error condition (PMU_F_ERR_MASK not set)
903+ */
904+ if (cpuhw -> flags != (PMU_F_IN_USE | PMU_F_RESERVED ))
917905 return ;
918906
919907 /* Check whether to extent the sampling buffer.
@@ -927,33 +915,27 @@ static void cpumsf_pmu_enable(struct pmu *pmu)
927915 * facility, but it can be fully re-enabled using sampling controls that
928916 * have been saved in cpumsf_pmu_disable().
929917 */
930- if (cpuhw -> event ) {
931- hwc = & cpuhw -> event -> hw ;
932- if (!(SAMPL_DIAG_MODE (hwc ))) {
933- /*
934- * Account number of overflow-designated
935- * buffer extents
936- */
937- sfb_account_overflows (cpuhw , hwc );
938- extend_sampling_buffer (& cpuhw -> sfb , hwc );
939- }
940- /* Rate may be adjusted with ioctl() */
941- cpuhw -> lsctl .interval = SAMPL_RATE (hwc );
918+ hwc = & cpuhw -> event -> hw ;
919+ if (!(SAMPL_DIAG_MODE (hwc ))) {
920+ /*
921+ * Account number of overflow-designated buffer extents
922+ */
923+ sfb_account_overflows (cpuhw , hwc );
924+ extend_sampling_buffer (& cpuhw -> sfb , hwc );
942925 }
926+ /* Rate may be adjusted with ioctl() */
927+ cpuhw -> lsctl .interval = SAMPL_RATE (hwc );
943928
944929 /* (Re)enable the PMU and sampling facility */
945- cpuhw -> flags |= PMU_F_ENABLED ;
946- barrier ();
947-
948930 err = lsctl (& cpuhw -> lsctl );
949931 if (err ) {
950- cpuhw -> flags &= ~PMU_F_ENABLED ;
951932 pr_err ("Loading sampling controls failed: op 1 err %i\n" , err );
952933 return ;
953934 }
954935
955936 /* Load current program parameter */
956937 lpp (& get_lowcore ()-> lpp );
938+ cpuhw -> flags |= PMU_F_ENABLED ;
957939}
958940
959941static void cpumsf_pmu_disable (struct pmu * pmu )
@@ -1774,7 +1756,9 @@ static void cpumsf_pmu_stop(struct perf_event *event, int flags)
17741756 event -> hw .state |= PERF_HES_STOPPED ;
17751757
17761758 if ((flags & PERF_EF_UPDATE ) && !(event -> hw .state & PERF_HES_UPTODATE )) {
1777- hw_perf_event_update (event , 1 );
1759+ /* CPU hotplug off removes SDBs. No samples to extract. */
1760+ if (cpuhw -> flags & PMU_F_RESERVED )
1761+ hw_perf_event_update (event , 1 );
17781762 event -> hw .state |= PERF_HES_UPTODATE ;
17791763 }
17801764 perf_pmu_enable (event -> pmu );
@@ -1789,7 +1773,7 @@ static int cpumsf_pmu_add(struct perf_event *event, int flags)
17891773 if (cpuhw -> flags & PMU_F_IN_USE )
17901774 return - EAGAIN ;
17911775
1792- if (!SAMPL_DIAG_MODE (& event -> hw ) && !cpuhw -> sfb . sdbt )
1776+ if (!SAMPL_DIAG_MODE (& event -> hw ) && !sf_buffer_available ( cpuhw ) )
17931777 return - EINVAL ;
17941778
17951779 perf_pmu_disable (event -> pmu );
@@ -1951,13 +1935,12 @@ static void cpumf_measurement_alert(struct ext_code ext_code,
19511935
19521936 /* Program alert request */
19531937 if (alert & CPU_MF_INT_SF_PRA ) {
1954- if (cpuhw -> flags & PMU_F_IN_USE )
1938+ if (cpuhw -> flags & PMU_F_IN_USE ) {
19551939 if (SAMPL_DIAG_MODE (& cpuhw -> event -> hw ))
19561940 hw_collect_aux (cpuhw );
19571941 else
19581942 hw_perf_event_update (cpuhw -> event , 0 );
1959- else
1960- WARN_ON_ONCE (!(cpuhw -> flags & PMU_F_IN_USE ));
1943+ }
19611944 }
19621945
19631946 /* Report measurement alerts only for non-PRA codes */
@@ -1978,7 +1961,7 @@ static void cpumf_measurement_alert(struct ext_code ext_code,
19781961
19791962 /* Invalid sampling buffer entry */
19801963 if (alert & (CPU_MF_INT_SF_IAE |CPU_MF_INT_SF_ISE )) {
1981- pr_err ("A sampling buffer entry is incorrect (alert=0x% x)\n" ,
1964+ pr_err ("A sampling buffer entry is incorrect (alert=%# x)\n" ,
19821965 alert );
19831966 cpuhw -> flags |= PMU_F_ERR_IBE ;
19841967 sf_disable ();
0 commit comments