@@ -2076,7 +2076,6 @@ PCM::PCM() :
2076
2076
pkgMinimumPower (-1 ),
2077
2077
pkgMaximumPower (-1 ),
2078
2078
systemTopology (new SystemRoot(this )),
2079
- programmed_pmu (false ),
2080
2079
joulesPerEnergyUnit (0 ),
2081
2080
#ifdef __linux__
2082
2081
resctrl (*this ),
@@ -2413,6 +2412,7 @@ PCM::ErrorCode PCM::program(const PCM::ProgramMode mode_, const void * parameter
2413
2412
ExtendedCustomCoreEventDescription * pExtDesc = (ExtendedCustomCoreEventDescription *)parameter_;
2414
2413
2415
2414
#ifdef PCM_USE_PERF
2415
+ closePerfHandles (silent);
2416
2416
if (!silent) std::cerr << " Trying to use Linux perf events...\n " ;
2417
2417
const char * no_perf_env = std::getenv (" PCM_NO_PERF" );
2418
2418
if (no_perf_env != NULL && std::string (no_perf_env) == std::string (" 1" ))
@@ -2463,7 +2463,7 @@ PCM::ErrorCode PCM::program(const PCM::ProgramMode mode_, const void * parameter
2463
2463
}
2464
2464
#endif
2465
2465
2466
- if (true )
2466
+ if (programmed_core_pmu == false )
2467
2467
{
2468
2468
if ((canUsePerf == false ) && PMUinUse ())
2469
2469
{
@@ -2742,8 +2742,6 @@ PCM::ErrorCode PCM::program(const PCM::ProgramMode mode_, const void * parameter
2742
2742
}
2743
2743
#endif
2744
2744
2745
- programmed_pmu = true ;
2746
-
2747
2745
lastProgrammedCustomCounters.clear ();
2748
2746
lastProgrammedCustomCounters.resize (num_cores);
2749
2747
core_global_ctrl_value = 0ULL ;
@@ -2776,6 +2774,8 @@ PCM::ErrorCode PCM::program(const PCM::ProgramMode mode_, const void * parameter
2776
2774
}
2777
2775
}
2778
2776
2777
+ programmed_core_pmu = true ;
2778
+
2779
2779
if (canUsePerf && !silent)
2780
2780
{
2781
2781
std::cerr << " Successfully programmed on-core PMU using Linux perf\n " ;
@@ -3808,9 +3808,9 @@ const char * PCM::getUArchCodename(const int32 cpu_model_param) const
3808
3808
return " unknown" ;
3809
3809
}
3810
3810
3811
- void PCM::cleanupPMU (const bool silent)
3812
- {
3813
3811
#ifdef PCM_USE_PERF
3812
+ void PCM::closePerfHandles (const bool silent)
3813
+ {
3814
3814
if (canUsePerf)
3815
3815
{
3816
3816
auto cleanOne = [this ](PerfEventHandleContainer & cont)
@@ -3833,6 +3833,17 @@ void PCM::cleanupPMU(const bool silent)
3833
3833
perfEventTaskHandle.clear ();
3834
3834
3835
3835
if (!silent) std::cerr << " Closed perf event handles\n " ;
3836
+ }
3837
+ }
3838
+ #endif
3839
+
3840
+ void PCM::cleanupPMU (const bool silent)
3841
+ {
3842
+ programmed_core_pmu = false ;
3843
+ #ifdef PCM_USE_PERF
3844
+ closePerfHandles (silent);
3845
+ if (canUsePerf)
3846
+ {
3836
3847
return ;
3837
3848
}
3838
3849
#endif
0 commit comments