From d2f13e126836faecfe03a21ee1e9cf0537beda96 Mon Sep 17 00:00:00 2001 From: Otto Bruggeman Date: Sat, 27 Nov 2021 14:58:33 +0100 Subject: [PATCH 1/6] Change type of the c-state counters and remove the now unnecessary cast --- PCM-Service_Win/PCMService.h | 88 ++++++++++++++++++------------------ 1 file changed, 44 insertions(+), 44 deletions(-) mode change 100644 => 100755 PCM-Service_Win/PCMService.h diff --git a/PCM-Service_Win/PCMService.h b/PCM-Service_Win/PCMService.h old mode 100644 new mode 100755 index 2d7dc9aa..9640fe30 --- a/PCM-Service_Win/PCMService.h +++ b/PCM-Service_Win/PCMService.h @@ -122,15 +122,15 @@ namespace PCMServiceNS { counterCollection->Add( counter ); counter = gcnew CounterCreationData(MetricCoreHeadroom, "Displays temperature reading in 1 degree Celsius relative to the TjMax temperature. 0 corresponds to the max temperature.", PerformanceCounterType::NumberOfItems64); counterCollection->Add( counter ); - counter = gcnew CounterCreationData(MetricCoreResC0, "Displays the residency of core or socket in core C0-state in percent.", PerformanceCounterType::NumberOfItems64); + counter = gcnew CounterCreationData(MetricCoreResC0, "Displays the residency of core or socket in core C0-state in percent.", PerformanceCounterType::RawFraction); counterCollection->Add( counter ); - counter = gcnew CounterCreationData(MetricCoreResC1, "Displays the residency of core or socket in core C1-state in percent.", PerformanceCounterType::NumberOfItems64); + counter = gcnew CounterCreationData(MetricCoreResC1, "Displays the residency of core or socket in core C1-state in percent.", PerformanceCounterType::RawFraction); counterCollection->Add( counter ); - counter = gcnew CounterCreationData(MetricCoreResC3, "Displays the residency of core or socket in core C3-state in percent.", PerformanceCounterType::NumberOfItems64); + counter = gcnew CounterCreationData(MetricCoreResC3, "Displays the residency of core or socket in core C3-state in percent.", PerformanceCounterType::RawFraction); counterCollection->Add( counter ); - counter = gcnew CounterCreationData(MetricCoreResC6, "Displays the residency of core or socket in core C6-state in percent.", PerformanceCounterType::NumberOfItems64); + counter = gcnew CounterCreationData(MetricCoreResC6, "Displays the residency of core or socket in core C6-state in percent.", PerformanceCounterType::RawFraction); counterCollection->Add( counter ); - counter = gcnew CounterCreationData(MetricCoreResC7, "Displays the residency of core or socket in core C7-state in percent.", PerformanceCounterType::NumberOfItems64); + counter = gcnew CounterCreationData(MetricCoreResC7, "Displays the residency of core or socket in core C7-state in percent.", PerformanceCounterType::RawFraction); counterCollection->Add( counter ); PerformanceCounterCategory::Create(CountersCore, "Processor Counter Monitor", PerformanceCounterCategoryType::MultiInstance, counterCollection); } @@ -146,21 +146,21 @@ namespace PCMServiceNS { counterCollection->Add( counter ); counter = gcnew CounterCreationData(MetricSocketEnergyDram, "Displays the energy in Joules consumed by DRAM memory attached to the memory controller of this socket.", PerformanceCounterType::NumberOfItems64); counterCollection->Add( counter ); - counter = gcnew CounterCreationData(MetricSocketResC0, "Displays the residency of socket in package C0-state in percent.", PerformanceCounterType::NumberOfItems64); + counter = gcnew CounterCreationData(MetricSocketResC0, "Displays the residency of socket in package C0-state in percent.", PerformanceCounterType::RawFraction); counterCollection->Add( counter ); - counter = gcnew CounterCreationData(MetricSocketResC2, "Displays the residency of socket in package C2-state in percent.", PerformanceCounterType::NumberOfItems64); + counter = gcnew CounterCreationData(MetricSocketResC2, "Displays the residency of socket in package C2-state in percent.", PerformanceCounterType::RawFraction); counterCollection->Add( counter ); - counter = gcnew CounterCreationData(MetricSocketResC3, "Displays the residency of socket in package C3-state in percent.", PerformanceCounterType::NumberOfItems64); + counter = gcnew CounterCreationData(MetricSocketResC3, "Displays the residency of socket in package C3-state in percent.", PerformanceCounterType::RawFraction); counterCollection->Add( counter ); - counter = gcnew CounterCreationData(MetricSocketResC6, "Displays the residency of socket in package C6-state in percent.", PerformanceCounterType::NumberOfItems64); + counter = gcnew CounterCreationData(MetricSocketResC6, "Displays the residency of socket in package C6-state in percent.", PerformanceCounterType::RawFraction); counterCollection->Add( counter ); - counter = gcnew CounterCreationData(MetricSocketResC7, "Displays the residency of socket in package C7-state in percent.", PerformanceCounterType::NumberOfItems64); + counter = gcnew CounterCreationData(MetricSocketResC7, "Displays the residency of socket in package C7-state in percent.", PerformanceCounterType::RawFraction); counterCollection->Add( counter ); - counter = gcnew CounterCreationData(MetricSocketResC8, "Displays the residency of socket in package C8-state in percent.", PerformanceCounterType::NumberOfItems64); + counter = gcnew CounterCreationData(MetricSocketResC8, "Displays the residency of socket in package C8-state in percent.", PerformanceCounterType::RawFraction); counterCollection->Add( counter ); - counter = gcnew CounterCreationData(MetricSocketResC9, "Displays the residency of socket in package C9-state in percent.", PerformanceCounterType::NumberOfItems64); + counter = gcnew CounterCreationData(MetricSocketResC9, "Displays the residency of socket in package C9-state in percent.", PerformanceCounterType::RawFraction); counterCollection->Add( counter ); - counter = gcnew CounterCreationData(MetricSocketResC10, "Displays the residency of socket in package C10-state in percent.", PerformanceCounterType::NumberOfItems64); + counter = gcnew CounterCreationData(MetricSocketResC10, "Displays the residency of socket in package C10-state in percent.", PerformanceCounterType::RawFraction); counterCollection->Add( counter ); PerformanceCounterCategory::Create(CountersSocket, "Processor Counter Monitor", PerformanceCounterCategoryType::MultiInstance, counterCollection); } @@ -345,11 +345,11 @@ namespace PCMServiceNS { ((PerformanceCounter^)relFreqHash_[s])->RawValue = totalTicks >> 17; ((PerformanceCounter^)baseTicksForRelFreqHash_[s])->IncrementBy(totalRefTicks >> 17); ((PerformanceCounter^)thermalHeadroomHash_[s])->RawValue = systemState.getThermalHeadroom(); - ((PerformanceCounter^)CoreC0StateResidencyHash_[s])->RawValue = __int64(100.*getCoreCStateResidency(0,oldSystemState, systemState)); - ((PerformanceCounter^)CoreC1StateResidencyHash_[s])->RawValue = __int64(100.*getCoreCStateResidency(1,oldSystemState, systemState)); - ((PerformanceCounter^)CoreC3StateResidencyHash_[s])->RawValue = __int64(100.*getCoreCStateResidency(3,oldSystemState, systemState)); - ((PerformanceCounter^)CoreC6StateResidencyHash_[s])->RawValue = __int64(100.*getCoreCStateResidency(6,oldSystemState, systemState)); - ((PerformanceCounter^)CoreC7StateResidencyHash_[s])->RawValue = __int64(100.*getCoreCStateResidency(7,oldSystemState, systemState)); + ((PerformanceCounter^)CoreC0StateResidencyHash_[s])->RawValue = 100.*getCoreCStateResidency(0,oldSystemState, systemState); + ((PerformanceCounter^)CoreC1StateResidencyHash_[s])->RawValue = 100.*getCoreCStateResidency(1,oldSystemState, systemState); + ((PerformanceCounter^)CoreC3StateResidencyHash_[s])->RawValue = 100.*getCoreCStateResidency(3,oldSystemState, systemState); + ((PerformanceCounter^)CoreC6StateResidencyHash_[s])->RawValue = 100.*getCoreCStateResidency(6,oldSystemState, systemState); + ((PerformanceCounter^)CoreC7StateResidencyHash_[s])->RawValue = 100.*getCoreCStateResidency(7,oldSystemState, systemState); //log_->WriteEntry(Globals::ServiceName, "Std: " + UInt64(totalTicks).ToString()); //log_->WriteEntry(Globals::ServiceName, "Ref: " + UInt64(totalRefTicks).ToString()); } @@ -360,14 +360,14 @@ namespace PCMServiceNS { ((PerformanceCounter^)mwbHash_[s])->RawValue = toBW(getBytesWrittenToMC(oldSystemState, systemState)); ((PerformanceCounter^)packageEnergyHash_[s])->RawValue = (__int64)getConsumedJoules(oldSystemState, systemState); ((PerformanceCounter^)DRAMEnergyHash_[s])->RawValue = (__int64)getDRAMConsumedJoules(oldSystemState, systemState); - ((PerformanceCounter^)PackageC0StateResidencyHash_[s])->RawValue = __int64(100.*getPackageCStateResidency(0, oldSystemState, systemState)); - ((PerformanceCounter^)PackageC2StateResidencyHash_[s])->RawValue = __int64(100.*getPackageCStateResidency(2, oldSystemState, systemState)); - ((PerformanceCounter^)PackageC3StateResidencyHash_[s])->RawValue = __int64(100.*getPackageCStateResidency(3, oldSystemState, systemState)); - ((PerformanceCounter^)PackageC6StateResidencyHash_[s])->RawValue = __int64(100.*getPackageCStateResidency(6, oldSystemState, systemState)); - ((PerformanceCounter^)PackageC7StateResidencyHash_[s])->RawValue = __int64(100.*getPackageCStateResidency(7, oldSystemState, systemState)); - ((PerformanceCounter^)PackageC8StateResidencyHash_[s])->RawValue = __int64(100.*getPackageCStateResidency(8, oldSystemState, systemState)); - ((PerformanceCounter^)PackageC9StateResidencyHash_[s])->RawValue = __int64(100.*getPackageCStateResidency(9, oldSystemState, systemState)); - ((PerformanceCounter^)PackageC10StateResidencyHash_[s])->RawValue = __int64(100.*getPackageCStateResidency(10, oldSystemState, systemState)); + ((PerformanceCounter^)PackageC0StateResidencyHash_[s])->RawValue = 100.*getPackageCStateResidency( 0, oldSystemState, systemState); + ((PerformanceCounter^)PackageC2StateResidencyHash_[s])->RawValue = 100.*getPackageCStateResidency( 2, oldSystemState, systemState); + ((PerformanceCounter^)PackageC3StateResidencyHash_[s])->RawValue = 100.*getPackageCStateResidency( 3, oldSystemState, systemState); + ((PerformanceCounter^)PackageC6StateResidencyHash_[s])->RawValue = 100.*getPackageCStateResidency( 6, oldSystemState, systemState); + ((PerformanceCounter^)PackageC7StateResidencyHash_[s])->RawValue = 100.*getPackageCStateResidency( 7, oldSystemState, systemState); + ((PerformanceCounter^)PackageC8StateResidencyHash_[s])->RawValue = 100.*getPackageCStateResidency( 8, oldSystemState, systemState); + ((PerformanceCounter^)PackageC9StateResidencyHash_[s])->RawValue = 100.*getPackageCStateResidency( 9, oldSystemState, systemState); + ((PerformanceCounter^)PackageC10StateResidencyHash_[s])->RawValue = 100.*getPackageCStateResidency(10, oldSystemState, systemState); } if (collectionInformation_->qpi) @@ -394,11 +394,11 @@ namespace PCMServiceNS { ((PerformanceCounter^)relFreqHash_[s])->RawValue = socketTicks >> 17; ((PerformanceCounter^)baseTicksForRelFreqHash_[s])->IncrementBy(socketRefTicks >> 17); ((PerformanceCounter^)thermalHeadroomHash_[s])->RawValue = socketState.getThermalHeadroom(); - ((PerformanceCounter^)CoreC0StateResidencyHash_[s])->RawValue = __int64(100.*getCoreCStateResidency(0, oldSocketStates[i], socketState)); - ((PerformanceCounter^)CoreC1StateResidencyHash_[s])->RawValue = __int64(100.*getCoreCStateResidency(1, oldSocketStates[i], socketState)); - ((PerformanceCounter^)CoreC3StateResidencyHash_[s])->RawValue = __int64(100.*getCoreCStateResidency(3, oldSocketStates[i], socketState)); - ((PerformanceCounter^)CoreC6StateResidencyHash_[s])->RawValue = __int64(100.*getCoreCStateResidency(6, oldSocketStates[i], socketState)); - ((PerformanceCounter^)CoreC7StateResidencyHash_[s])->RawValue = __int64(100.*getCoreCStateResidency(7, oldSocketStates[i], socketState)); + ((PerformanceCounter^)CoreC0StateResidencyHash_[s])->RawValue = 100.*getCoreCStateResidency(0, oldSocketStates[i], socketState); + ((PerformanceCounter^)CoreC1StateResidencyHash_[s])->RawValue = 100.*getCoreCStateResidency(1, oldSocketStates[i], socketState); + ((PerformanceCounter^)CoreC3StateResidencyHash_[s])->RawValue = 100.*getCoreCStateResidency(3, oldSocketStates[i], socketState); + ((PerformanceCounter^)CoreC6StateResidencyHash_[s])->RawValue = 100.*getCoreCStateResidency(6, oldSocketStates[i], socketState); + ((PerformanceCounter^)CoreC7StateResidencyHash_[s])->RawValue = 100.*getCoreCStateResidency(7, oldSocketStates[i], socketState); } if (collectionInformation_->socket) @@ -407,14 +407,14 @@ namespace PCMServiceNS { ((PerformanceCounter^)mwbHash_[s])->RawValue = toBW(getBytesWrittenToMC(oldSocketStates[i], socketState)); ((PerformanceCounter^)packageEnergyHash_[s])->RawValue = (__int64)getConsumedJoules(oldSocketStates[i], socketState); ((PerformanceCounter^)DRAMEnergyHash_[s])->RawValue = (__int64)getDRAMConsumedJoules(oldSocketStates[i], socketState); - ((PerformanceCounter^)PackageC0StateResidencyHash_[s])->RawValue = __int64(100.*getPackageCStateResidency(0,oldSocketStates[i], socketState)); - ((PerformanceCounter^)PackageC2StateResidencyHash_[s])->RawValue = __int64(100.*getPackageCStateResidency(2,oldSocketStates[i], socketState)); - ((PerformanceCounter^)PackageC3StateResidencyHash_[s])->RawValue = __int64(100.*getPackageCStateResidency(3,oldSocketStates[i], socketState)); - ((PerformanceCounter^)PackageC6StateResidencyHash_[s])->RawValue = __int64(100.*getPackageCStateResidency(6,oldSocketStates[i], socketState)); - ((PerformanceCounter^)PackageC7StateResidencyHash_[s])->RawValue = __int64(100.*getPackageCStateResidency(7,oldSocketStates[i], socketState)); - ((PerformanceCounter^)PackageC8StateResidencyHash_[s])->RawValue = __int64(100.*getPackageCStateResidency(8,oldSocketStates[i], socketState)); - ((PerformanceCounter^)PackageC9StateResidencyHash_[s])->RawValue = __int64(100.*getPackageCStateResidency(9,oldSocketStates[i], socketState)); - ((PerformanceCounter^)PackageC10StateResidencyHash_[s])->RawValue = __int64(100.*getPackageCStateResidency(10,oldSocketStates[i], socketState)); + ((PerformanceCounter^)PackageC0StateResidencyHash_[s])->RawValue = 100.*getPackageCStateResidency( 0,oldSocketStates[i], socketState); + ((PerformanceCounter^)PackageC2StateResidencyHash_[s])->RawValue = 100.*getPackageCStateResidency( 2,oldSocketStates[i], socketState); + ((PerformanceCounter^)PackageC3StateResidencyHash_[s])->RawValue = 100.*getPackageCStateResidency( 3,oldSocketStates[i], socketState); + ((PerformanceCounter^)PackageC6StateResidencyHash_[s])->RawValue = 100.*getPackageCStateResidency( 6,oldSocketStates[i], socketState); + ((PerformanceCounter^)PackageC7StateResidencyHash_[s])->RawValue = 100.*getPackageCStateResidency( 7,oldSocketStates[i], socketState); + ((PerformanceCounter^)PackageC8StateResidencyHash_[s])->RawValue = 100.*getPackageCStateResidency( 8,oldSocketStates[i], socketState); + ((PerformanceCounter^)PackageC9StateResidencyHash_[s])->RawValue = 100.*getPackageCStateResidency( 9,oldSocketStates[i], socketState); + ((PerformanceCounter^)PackageC10StateResidencyHash_[s])->RawValue = 100.*getPackageCStateResidency(10,oldSocketStates[i], socketState); } if (collectionInformation_->qpi) @@ -449,11 +449,11 @@ namespace PCMServiceNS { ((PerformanceCounter^)relFreqHash_[s])->RawValue = ticks >> 17; ((PerformanceCounter^)baseTicksForRelFreqHash_[s])->IncrementBy(refTicks >> 17); ((PerformanceCounter^)thermalHeadroomHash_[s])->RawValue = coreState.getThermalHeadroom(); - ((PerformanceCounter^)CoreC0StateResidencyHash_[s])->RawValue = __int64(100.*getCoreCStateResidency(0,oldCoreStates[i], coreState)); - ((PerformanceCounter^)CoreC1StateResidencyHash_[s])->RawValue = __int64(100.*getCoreCStateResidency(1,oldCoreStates[i], coreState)); - ((PerformanceCounter^)CoreC3StateResidencyHash_[s])->RawValue = __int64(100.*getCoreCStateResidency(3,oldCoreStates[i], coreState)); - ((PerformanceCounter^)CoreC6StateResidencyHash_[s])->RawValue = __int64(100.*getCoreCStateResidency(6,oldCoreStates[i], coreState)); - ((PerformanceCounter^)CoreC7StateResidencyHash_[s])->RawValue = __int64(100.*getCoreCStateResidency(7,oldCoreStates[i], coreState)); + ((PerformanceCounter^)CoreC0StateResidencyHash_[s])->RawValue = 100.*getCoreCStateResidency(0,oldCoreStates[i], coreState); + ((PerformanceCounter^)CoreC1StateResidencyHash_[s])->RawValue = 100.*getCoreCStateResidency(1,oldCoreStates[i], coreState); + ((PerformanceCounter^)CoreC3StateResidencyHash_[s])->RawValue = 100.*getCoreCStateResidency(3,oldCoreStates[i], coreState); + ((PerformanceCounter^)CoreC6StateResidencyHash_[s])->RawValue = 100.*getCoreCStateResidency(6,oldCoreStates[i], coreState); + ((PerformanceCounter^)CoreC7StateResidencyHash_[s])->RawValue = 100.*getCoreCStateResidency(7,oldCoreStates[i], coreState); } } From e3ac975241bcaa1be785b167b4d7ee78cd7132a8 Mon Sep 17 00:00:00 2001 From: Otto Bruggeman Date: Wed, 1 Dec 2021 16:44:28 +0100 Subject: [PATCH 2/6] Fix braindamage, RawFraction requires a RawBase Counter right after the creation of RawFraction. This RawBase counter contains the denominator. --- PCM-Service_Win/PCMService.h | 213 ++++++++++++++++++++++++++++------- 1 file changed, 174 insertions(+), 39 deletions(-) diff --git a/PCM-Service_Win/PCMService.h b/PCM-Service_Win/PCMService.h index 9640fe30..6f117997 100755 --- a/PCM-Service_Win/PCMService.h +++ b/PCM-Service_Win/PCMService.h @@ -124,14 +124,24 @@ namespace PCMServiceNS { counterCollection->Add( counter ); counter = gcnew CounterCreationData(MetricCoreResC0, "Displays the residency of core or socket in core C0-state in percent.", PerformanceCounterType::RawFraction); counterCollection->Add( counter ); + counter = gcnew CounterCreationData(MetricCoreResC0Base, "", PerformanceCounterType::RawBase); + counterCollection->Add( counter ); counter = gcnew CounterCreationData(MetricCoreResC1, "Displays the residency of core or socket in core C1-state in percent.", PerformanceCounterType::RawFraction); counterCollection->Add( counter ); + counter = gcnew CounterCreationData(MetricCoreResC1Base, "", PerformanceCounterType::RawBase); + counterCollection->Add(counter); counter = gcnew CounterCreationData(MetricCoreResC3, "Displays the residency of core or socket in core C3-state in percent.", PerformanceCounterType::RawFraction); counterCollection->Add( counter ); + counter = gcnew CounterCreationData(MetricCoreResC3Base, "", PerformanceCounterType::RawBase); + counterCollection->Add(counter); counter = gcnew CounterCreationData(MetricCoreResC6, "Displays the residency of core or socket in core C6-state in percent.", PerformanceCounterType::RawFraction); counterCollection->Add( counter ); + counter = gcnew CounterCreationData(MetricCoreResC6Base, "", PerformanceCounterType::RawBase); + counterCollection->Add(counter); counter = gcnew CounterCreationData(MetricCoreResC7, "Displays the residency of core or socket in core C7-state in percent.", PerformanceCounterType::RawFraction); counterCollection->Add( counter ); + counter = gcnew CounterCreationData(MetricCoreResC7Base, "", PerformanceCounterType::RawBase); + counterCollection->Add(counter); PerformanceCounterCategory::Create(CountersCore, "Processor Counter Monitor", PerformanceCounterCategoryType::MultiInstance, counterCollection); } @@ -148,20 +158,36 @@ namespace PCMServiceNS { counterCollection->Add( counter ); counter = gcnew CounterCreationData(MetricSocketResC0, "Displays the residency of socket in package C0-state in percent.", PerformanceCounterType::RawFraction); counterCollection->Add( counter ); + counter = gcnew CounterCreationData(MetricSocketResC0Base, "", PerformanceCounterType::RawBase); + counterCollection->Add(counter); counter = gcnew CounterCreationData(MetricSocketResC2, "Displays the residency of socket in package C2-state in percent.", PerformanceCounterType::RawFraction); counterCollection->Add( counter ); + counter = gcnew CounterCreationData(MetricSocketResC2Base, "", PerformanceCounterType::RawBase); + counterCollection->Add(counter); counter = gcnew CounterCreationData(MetricSocketResC3, "Displays the residency of socket in package C3-state in percent.", PerformanceCounterType::RawFraction); counterCollection->Add( counter ); + counter = gcnew CounterCreationData(MetricSocketResC3Base, "", PerformanceCounterType::RawBase); + counterCollection->Add(counter); counter = gcnew CounterCreationData(MetricSocketResC6, "Displays the residency of socket in package C6-state in percent.", PerformanceCounterType::RawFraction); counterCollection->Add( counter ); + counter = gcnew CounterCreationData(MetricSocketResC6Base, "", PerformanceCounterType::RawBase); + counterCollection->Add(counter); counter = gcnew CounterCreationData(MetricSocketResC7, "Displays the residency of socket in package C7-state in percent.", PerformanceCounterType::RawFraction); counterCollection->Add( counter ); + counter = gcnew CounterCreationData(MetricSocketResC7Base, "", PerformanceCounterType::RawBase); + counterCollection->Add(counter); counter = gcnew CounterCreationData(MetricSocketResC8, "Displays the residency of socket in package C8-state in percent.", PerformanceCounterType::RawFraction); counterCollection->Add( counter ); + counter = gcnew CounterCreationData(MetricSocketResC8Base, "", PerformanceCounterType::RawBase); + counterCollection->Add(counter); counter = gcnew CounterCreationData(MetricSocketResC9, "Displays the residency of socket in package C9-state in percent.", PerformanceCounterType::RawFraction); counterCollection->Add( counter ); + counter = gcnew CounterCreationData(MetricSocketResC9Base, "", PerformanceCounterType::RawBase); + counterCollection->Add(counter); counter = gcnew CounterCreationData(MetricSocketResC10, "Displays the residency of socket in package C10-state in percent.", PerformanceCounterType::RawFraction); counterCollection->Add( counter ); + counter = gcnew CounterCreationData(MetricSocketResC10Base, "", PerformanceCounterType::RawBase); + counterCollection->Add(counter); PerformanceCounterCategory::Create(CountersSocket, "Processor Counter Monitor", PerformanceCounterCategoryType::MultiInstance, counterCollection); } @@ -180,6 +206,7 @@ namespace PCMServiceNS { // Create #processors instances of the core specific performance counters String^ s; // Used for creating the instance name and the string to search for in the hashtable + PerformanceCounter^ pc; for ( unsigned int i = 0; i < m_->getNumCores(); ++i ) { s = UInt32(i).ToString(); // For core counters we use just the number of the core @@ -195,10 +222,25 @@ namespace PCMServiceNS { baseTicksForRelFreqHash_.Add(s, gcnew PerformanceCounter(CountersCore, MetricCoreFreqNom, s, false)); thermalHeadroomHash_.Add(s, gcnew PerformanceCounter(CountersCore, MetricCoreHeadroom, s, false)); CoreC0StateResidencyHash_.Add(s, gcnew PerformanceCounter(CountersCore, MetricCoreResC0, s, false)); + pc = gcnew PerformanceCounter(CountersCore, MetricCoreResC0Base, s, false); + pc->RawValue = 1000; + baseArrayList_.Add(pc); CoreC1StateResidencyHash_.Add(s, gcnew PerformanceCounter(CountersCore, MetricCoreResC1, s, false)); + pc = gcnew PerformanceCounter(CountersCore, MetricCoreResC1Base, s, false); + pc->RawValue = 1000; + baseArrayList_.Add(pc); CoreC3StateResidencyHash_.Add(s, gcnew PerformanceCounter(CountersCore, MetricCoreResC3, s, false)); + pc = gcnew PerformanceCounter(CountersCore, MetricCoreResC3Base, s, false); + pc->RawValue = 1000; + baseArrayList_.Add(pc); CoreC6StateResidencyHash_.Add(s, gcnew PerformanceCounter(CountersCore, MetricCoreResC6, s, false)); + pc = gcnew PerformanceCounter(CountersCore, MetricCoreResC6Base, s, false); + pc->RawValue = 1000; + baseArrayList_.Add(pc); CoreC7StateResidencyHash_.Add(s, gcnew PerformanceCounter(CountersCore, MetricCoreResC7, s, false)); + pc = gcnew PerformanceCounter(CountersCore, MetricCoreResC7Base, s, false); + pc->RawValue = 1000; + baseArrayList_.Add(pc); } } @@ -218,10 +260,25 @@ namespace PCMServiceNS { baseTicksForRelFreqHash_.Add(s, gcnew PerformanceCounter(CountersCore, MetricCoreFreqNom, s, false)); thermalHeadroomHash_.Add(s, gcnew PerformanceCounter(CountersCore, MetricCoreHeadroom, s, false)); CoreC0StateResidencyHash_.Add(s, gcnew PerformanceCounter(CountersCore, MetricCoreResC0, s, false)); + pc = gcnew PerformanceCounter(CountersCore, MetricCoreResC0Base, s, false); + pc->RawValue = 1000; + baseArrayList_.Add(pc); CoreC1StateResidencyHash_.Add(s, gcnew PerformanceCounter(CountersCore, MetricCoreResC1, s, false)); + pc = gcnew PerformanceCounter(CountersCore, MetricCoreResC1Base, s, false); + pc->RawValue = 1000; + baseArrayList_.Add(pc); CoreC3StateResidencyHash_.Add(s, gcnew PerformanceCounter(CountersCore, MetricCoreResC3, s, false)); + pc = gcnew PerformanceCounter(CountersCore, MetricCoreResC3Base, s, false); + pc->RawValue = 1000; + baseArrayList_.Add(pc); CoreC6StateResidencyHash_.Add(s, gcnew PerformanceCounter(CountersCore, MetricCoreResC6, s, false)); + pc = gcnew PerformanceCounter(CountersCore, MetricCoreResC6Base, s, false); + pc->RawValue = 1000; + baseArrayList_.Add(pc); CoreC7StateResidencyHash_.Add(s, gcnew PerformanceCounter(CountersCore, MetricCoreResC7, s, false)); + pc = gcnew PerformanceCounter(CountersCore, MetricCoreResC7Base, s, false); + pc->RawValue = 1000; + baseArrayList_.Add(pc); } if (collectionInformation_->socket) @@ -231,13 +288,37 @@ namespace PCMServiceNS { packageEnergyHash_.Add(s, gcnew PerformanceCounter(CountersSocket, MetricSocketEnergyPack, s, false)); DRAMEnergyHash_.Add(s, gcnew PerformanceCounter(CountersSocket, MetricSocketEnergyDram, s, false)); PackageC0StateResidencyHash_.Add(s, gcnew PerformanceCounter(CountersSocket, MetricSocketResC0, s, false)); + pc = gcnew PerformanceCounter(CountersCore, MetricSocketResC0Base, s, false); + pc->RawValue = 1000; + baseArrayList_.Add(pc); PackageC2StateResidencyHash_.Add(s, gcnew PerformanceCounter(CountersSocket, MetricSocketResC2, s, false)); + pc = gcnew PerformanceCounter(CountersCore, MetricSocketResC2Base, s, false); + pc->RawValue = 1000; + baseArrayList_.Add(pc); PackageC3StateResidencyHash_.Add(s, gcnew PerformanceCounter(CountersSocket, MetricSocketResC3, s, false)); + pc = gcnew PerformanceCounter(CountersCore, MetricSocketResC3Base, s, false); + pc->RawValue = 1000; + baseArrayList_.Add(pc); PackageC6StateResidencyHash_.Add(s, gcnew PerformanceCounter(CountersSocket, MetricSocketResC6, s, false)); + pc = gcnew PerformanceCounter(CountersCore, MetricSocketResC6Base, s, false); + pc->RawValue = 1000; + baseArrayList_.Add(pc); PackageC7StateResidencyHash_.Add(s, gcnew PerformanceCounter(CountersSocket, MetricSocketResC7, s, false)); + pc = gcnew PerformanceCounter(CountersCore, MetricSocketResC7Base, s, false); + pc->RawValue = 1000; + baseArrayList_.Add(pc); PackageC8StateResidencyHash_.Add(s, gcnew PerformanceCounter(CountersSocket, MetricSocketResC8, s, false)); + pc = gcnew PerformanceCounter(CountersCore, MetricSocketResC8Base, s, false); + pc->RawValue = 1000; + baseArrayList_.Add(pc); PackageC9StateResidencyHash_.Add(s, gcnew PerformanceCounter(CountersSocket, MetricSocketResC9, s, false)); + pc = gcnew PerformanceCounter(CountersCore, MetricSocketResC9Base, s, false); + pc->RawValue = 1000; + baseArrayList_.Add(pc); PackageC10StateResidencyHash_.Add(s, gcnew PerformanceCounter(CountersSocket, MetricSocketResC10, s, false)); + pc = gcnew PerformanceCounter(CountersCore, MetricSocketResC10Base, s, false); + pc->RawValue = 1000; + baseArrayList_.Add(pc); } if (collectionInformation_->qpi) @@ -266,10 +347,25 @@ namespace PCMServiceNS { baseTicksForRelFreqHash_.Add(s, gcnew PerformanceCounter(CountersCore, MetricCoreFreqNom, s, false)); thermalHeadroomHash_.Add(s, gcnew PerformanceCounter(CountersCore, MetricCoreHeadroom, s, false)); CoreC0StateResidencyHash_.Add(s, gcnew PerformanceCounter(CountersCore, MetricCoreResC0, s, false)); + pc = gcnew PerformanceCounter(CountersCore, MetricCoreResC0Base, s, false); + pc->RawValue = 1000; + baseArrayList_.Add(pc); CoreC1StateResidencyHash_.Add(s, gcnew PerformanceCounter(CountersCore, MetricCoreResC1, s, false)); + pc = gcnew PerformanceCounter(CountersCore, MetricCoreResC1Base, s, false); + pc->RawValue = 1000; + baseArrayList_.Add(pc); CoreC3StateResidencyHash_.Add(s, gcnew PerformanceCounter(CountersCore, MetricCoreResC3, s, false)); + pc = gcnew PerformanceCounter(CountersCore, MetricCoreResC3Base, s, false); + pc->RawValue = 1000; + baseArrayList_.Add(pc); CoreC6StateResidencyHash_.Add(s, gcnew PerformanceCounter(CountersCore, MetricCoreResC6, s, false)); + pc = gcnew PerformanceCounter(CountersCore, MetricCoreResC6Base, s, false); + pc->RawValue = 1000; + baseArrayList_.Add(pc); CoreC7StateResidencyHash_.Add(s, gcnew PerformanceCounter(CountersCore, MetricCoreResC7, s, false)); + pc = gcnew PerformanceCounter(CountersCore, MetricCoreResC7Base, s, false); + pc->RawValue = 1000; + baseArrayList_.Add(pc); } if (collectionInformation_->socket) @@ -279,13 +375,37 @@ namespace PCMServiceNS { packageEnergyHash_.Add(s, gcnew PerformanceCounter(CountersSocket, MetricSocketEnergyPack, s, false)); DRAMEnergyHash_.Add(s, gcnew PerformanceCounter(CountersSocket, MetricSocketEnergyDram, s, false)); PackageC0StateResidencyHash_.Add(s, gcnew PerformanceCounter(CountersSocket, MetricSocketResC0, s, false)); + pc = gcnew PerformanceCounter(CountersCore, MetricSocketResC0Base, s, false); + pc->RawValue = 1000; + baseArrayList_.Add(pc); PackageC2StateResidencyHash_.Add(s, gcnew PerformanceCounter(CountersSocket, MetricSocketResC2, s, false)); + pc = gcnew PerformanceCounter(CountersCore, MetricSocketResC2Base, s, false); + pc->RawValue = 1000; + baseArrayList_.Add(pc); PackageC3StateResidencyHash_.Add(s, gcnew PerformanceCounter(CountersSocket, MetricSocketResC3, s, false)); + pc = gcnew PerformanceCounter(CountersCore, MetricSocketResC3Base, s, false); + pc->RawValue = 1000; + baseArrayList_.Add(pc); PackageC6StateResidencyHash_.Add(s, gcnew PerformanceCounter(CountersSocket, MetricSocketResC6, s, false)); + pc = gcnew PerformanceCounter(CountersCore, MetricSocketResC6Base, s, false); + pc->RawValue = 1000; + baseArrayList_.Add(pc); PackageC7StateResidencyHash_.Add(s, gcnew PerformanceCounter(CountersSocket, MetricSocketResC7, s, false)); + pc = gcnew PerformanceCounter(CountersCore, MetricSocketResC7Base, s, false); + pc->RawValue = 1000; + baseArrayList_.Add(pc); PackageC8StateResidencyHash_.Add(s, gcnew PerformanceCounter(CountersSocket, MetricSocketResC8, s, false)); + pc = gcnew PerformanceCounter(CountersCore, MetricSocketResC8Base, s, false); + pc->RawValue = 1000; + baseArrayList_.Add(pc); PackageC9StateResidencyHash_.Add(s, gcnew PerformanceCounter(CountersSocket, MetricSocketResC9, s, false)); + pc = gcnew PerformanceCounter(CountersCore, MetricSocketResC9Base, s, false); + pc->RawValue = 1000; + baseArrayList_.Add(pc); PackageC10StateResidencyHash_.Add(s, gcnew PerformanceCounter(CountersSocket, MetricSocketResC10, s, false)); + pc = gcnew PerformanceCounter(CountersCore, MetricSocketResC10Base, s, false); + pc->RawValue = 1000; + baseArrayList_.Add(pc); } if (collectionInformation_->qpi) @@ -345,11 +465,11 @@ namespace PCMServiceNS { ((PerformanceCounter^)relFreqHash_[s])->RawValue = totalTicks >> 17; ((PerformanceCounter^)baseTicksForRelFreqHash_[s])->IncrementBy(totalRefTicks >> 17); ((PerformanceCounter^)thermalHeadroomHash_[s])->RawValue = systemState.getThermalHeadroom(); - ((PerformanceCounter^)CoreC0StateResidencyHash_[s])->RawValue = 100.*getCoreCStateResidency(0,oldSystemState, systemState); - ((PerformanceCounter^)CoreC1StateResidencyHash_[s])->RawValue = 100.*getCoreCStateResidency(1,oldSystemState, systemState); - ((PerformanceCounter^)CoreC3StateResidencyHash_[s])->RawValue = 100.*getCoreCStateResidency(3,oldSystemState, systemState); - ((PerformanceCounter^)CoreC6StateResidencyHash_[s])->RawValue = 100.*getCoreCStateResidency(6,oldSystemState, systemState); - ((PerformanceCounter^)CoreC7StateResidencyHash_[s])->RawValue = 100.*getCoreCStateResidency(7,oldSystemState, systemState); + ((PerformanceCounter^)CoreC0StateResidencyHash_[s])->RawValue = __int64(1000. * getCoreCStateResidency(0,oldSystemState, systemState)); + ((PerformanceCounter^)CoreC1StateResidencyHash_[s])->RawValue = __int64(1000. * getCoreCStateResidency(1,oldSystemState, systemState)); + ((PerformanceCounter^)CoreC3StateResidencyHash_[s])->RawValue = __int64(1000. * getCoreCStateResidency(3,oldSystemState, systemState)); + ((PerformanceCounter^)CoreC6StateResidencyHash_[s])->RawValue = __int64(1000. * getCoreCStateResidency(6,oldSystemState, systemState)); + ((PerformanceCounter^)CoreC7StateResidencyHash_[s])->RawValue = __int64(1000. * getCoreCStateResidency(7,oldSystemState, systemState)); //log_->WriteEntry(Globals::ServiceName, "Std: " + UInt64(totalTicks).ToString()); //log_->WriteEntry(Globals::ServiceName, "Ref: " + UInt64(totalRefTicks).ToString()); } @@ -360,14 +480,14 @@ namespace PCMServiceNS { ((PerformanceCounter^)mwbHash_[s])->RawValue = toBW(getBytesWrittenToMC(oldSystemState, systemState)); ((PerformanceCounter^)packageEnergyHash_[s])->RawValue = (__int64)getConsumedJoules(oldSystemState, systemState); ((PerformanceCounter^)DRAMEnergyHash_[s])->RawValue = (__int64)getDRAMConsumedJoules(oldSystemState, systemState); - ((PerformanceCounter^)PackageC0StateResidencyHash_[s])->RawValue = 100.*getPackageCStateResidency( 0, oldSystemState, systemState); - ((PerformanceCounter^)PackageC2StateResidencyHash_[s])->RawValue = 100.*getPackageCStateResidency( 2, oldSystemState, systemState); - ((PerformanceCounter^)PackageC3StateResidencyHash_[s])->RawValue = 100.*getPackageCStateResidency( 3, oldSystemState, systemState); - ((PerformanceCounter^)PackageC6StateResidencyHash_[s])->RawValue = 100.*getPackageCStateResidency( 6, oldSystemState, systemState); - ((PerformanceCounter^)PackageC7StateResidencyHash_[s])->RawValue = 100.*getPackageCStateResidency( 7, oldSystemState, systemState); - ((PerformanceCounter^)PackageC8StateResidencyHash_[s])->RawValue = 100.*getPackageCStateResidency( 8, oldSystemState, systemState); - ((PerformanceCounter^)PackageC9StateResidencyHash_[s])->RawValue = 100.*getPackageCStateResidency( 9, oldSystemState, systemState); - ((PerformanceCounter^)PackageC10StateResidencyHash_[s])->RawValue = 100.*getPackageCStateResidency(10, oldSystemState, systemState); + ((PerformanceCounter^)PackageC0StateResidencyHash_[s])->RawValue = __int64(1000. * getPackageCStateResidency( 0, oldSystemState, systemState)); + ((PerformanceCounter^)PackageC2StateResidencyHash_[s])->RawValue = __int64(1000. * getPackageCStateResidency( 2, oldSystemState, systemState)); + ((PerformanceCounter^)PackageC3StateResidencyHash_[s])->RawValue = __int64(1000. * getPackageCStateResidency( 3, oldSystemState, systemState)); + ((PerformanceCounter^)PackageC6StateResidencyHash_[s])->RawValue = __int64(1000. * getPackageCStateResidency( 6, oldSystemState, systemState)); + ((PerformanceCounter^)PackageC7StateResidencyHash_[s])->RawValue = __int64(1000. * getPackageCStateResidency( 7, oldSystemState, systemState)); + ((PerformanceCounter^)PackageC8StateResidencyHash_[s])->RawValue = __int64(1000. * getPackageCStateResidency( 8, oldSystemState, systemState)); + ((PerformanceCounter^)PackageC9StateResidencyHash_[s])->RawValue = __int64(1000. * getPackageCStateResidency( 9, oldSystemState, systemState)); + ((PerformanceCounter^)PackageC10StateResidencyHash_[s])->RawValue = __int64(1000. * getPackageCStateResidency(10, oldSystemState, systemState)); } if (collectionInformation_->qpi) @@ -394,11 +514,11 @@ namespace PCMServiceNS { ((PerformanceCounter^)relFreqHash_[s])->RawValue = socketTicks >> 17; ((PerformanceCounter^)baseTicksForRelFreqHash_[s])->IncrementBy(socketRefTicks >> 17); ((PerformanceCounter^)thermalHeadroomHash_[s])->RawValue = socketState.getThermalHeadroom(); - ((PerformanceCounter^)CoreC0StateResidencyHash_[s])->RawValue = 100.*getCoreCStateResidency(0, oldSocketStates[i], socketState); - ((PerformanceCounter^)CoreC1StateResidencyHash_[s])->RawValue = 100.*getCoreCStateResidency(1, oldSocketStates[i], socketState); - ((PerformanceCounter^)CoreC3StateResidencyHash_[s])->RawValue = 100.*getCoreCStateResidency(3, oldSocketStates[i], socketState); - ((PerformanceCounter^)CoreC6StateResidencyHash_[s])->RawValue = 100.*getCoreCStateResidency(6, oldSocketStates[i], socketState); - ((PerformanceCounter^)CoreC7StateResidencyHash_[s])->RawValue = 100.*getCoreCStateResidency(7, oldSocketStates[i], socketState); + ((PerformanceCounter^)CoreC0StateResidencyHash_[s])->RawValue = __int64(1000. * getCoreCStateResidency(0, oldSocketStates[i], socketState)); + ((PerformanceCounter^)CoreC1StateResidencyHash_[s])->RawValue = __int64(1000. * getCoreCStateResidency(1, oldSocketStates[i], socketState)); + ((PerformanceCounter^)CoreC3StateResidencyHash_[s])->RawValue = __int64(1000. * getCoreCStateResidency(3, oldSocketStates[i], socketState)); + ((PerformanceCounter^)CoreC6StateResidencyHash_[s])->RawValue = __int64(1000. * getCoreCStateResidency(6, oldSocketStates[i], socketState)); + ((PerformanceCounter^)CoreC7StateResidencyHash_[s])->RawValue = __int64(1000. * getCoreCStateResidency(7, oldSocketStates[i], socketState)); } if (collectionInformation_->socket) @@ -407,14 +527,14 @@ namespace PCMServiceNS { ((PerformanceCounter^)mwbHash_[s])->RawValue = toBW(getBytesWrittenToMC(oldSocketStates[i], socketState)); ((PerformanceCounter^)packageEnergyHash_[s])->RawValue = (__int64)getConsumedJoules(oldSocketStates[i], socketState); ((PerformanceCounter^)DRAMEnergyHash_[s])->RawValue = (__int64)getDRAMConsumedJoules(oldSocketStates[i], socketState); - ((PerformanceCounter^)PackageC0StateResidencyHash_[s])->RawValue = 100.*getPackageCStateResidency( 0,oldSocketStates[i], socketState); - ((PerformanceCounter^)PackageC2StateResidencyHash_[s])->RawValue = 100.*getPackageCStateResidency( 2,oldSocketStates[i], socketState); - ((PerformanceCounter^)PackageC3StateResidencyHash_[s])->RawValue = 100.*getPackageCStateResidency( 3,oldSocketStates[i], socketState); - ((PerformanceCounter^)PackageC6StateResidencyHash_[s])->RawValue = 100.*getPackageCStateResidency( 6,oldSocketStates[i], socketState); - ((PerformanceCounter^)PackageC7StateResidencyHash_[s])->RawValue = 100.*getPackageCStateResidency( 7,oldSocketStates[i], socketState); - ((PerformanceCounter^)PackageC8StateResidencyHash_[s])->RawValue = 100.*getPackageCStateResidency( 8,oldSocketStates[i], socketState); - ((PerformanceCounter^)PackageC9StateResidencyHash_[s])->RawValue = 100.*getPackageCStateResidency( 9,oldSocketStates[i], socketState); - ((PerformanceCounter^)PackageC10StateResidencyHash_[s])->RawValue = 100.*getPackageCStateResidency(10,oldSocketStates[i], socketState); + ((PerformanceCounter^)PackageC0StateResidencyHash_[s])->RawValue = __int64(1000. * getPackageCStateResidency( 0,oldSocketStates[i], socketState)); + ((PerformanceCounter^)PackageC2StateResidencyHash_[s])->RawValue = __int64(1000. * getPackageCStateResidency( 2,oldSocketStates[i], socketState)); + ((PerformanceCounter^)PackageC3StateResidencyHash_[s])->RawValue = __int64(1000. * getPackageCStateResidency( 3,oldSocketStates[i], socketState)); + ((PerformanceCounter^)PackageC6StateResidencyHash_[s])->RawValue = __int64(1000. * getPackageCStateResidency( 6,oldSocketStates[i], socketState)); + ((PerformanceCounter^)PackageC7StateResidencyHash_[s])->RawValue = __int64(1000. * getPackageCStateResidency( 7,oldSocketStates[i], socketState)); + ((PerformanceCounter^)PackageC8StateResidencyHash_[s])->RawValue = __int64(1000. * getPackageCStateResidency( 8,oldSocketStates[i], socketState)); + ((PerformanceCounter^)PackageC9StateResidencyHash_[s])->RawValue = __int64(1000. * getPackageCStateResidency( 9,oldSocketStates[i], socketState)); + ((PerformanceCounter^)PackageC10StateResidencyHash_[s])->RawValue = __int64(1000. * getPackageCStateResidency(10,oldSocketStates[i], socketState)); } if (collectionInformation_->qpi) @@ -449,11 +569,11 @@ namespace PCMServiceNS { ((PerformanceCounter^)relFreqHash_[s])->RawValue = ticks >> 17; ((PerformanceCounter^)baseTicksForRelFreqHash_[s])->IncrementBy(refTicks >> 17); ((PerformanceCounter^)thermalHeadroomHash_[s])->RawValue = coreState.getThermalHeadroom(); - ((PerformanceCounter^)CoreC0StateResidencyHash_[s])->RawValue = 100.*getCoreCStateResidency(0,oldCoreStates[i], coreState); - ((PerformanceCounter^)CoreC1StateResidencyHash_[s])->RawValue = 100.*getCoreCStateResidency(1,oldCoreStates[i], coreState); - ((PerformanceCounter^)CoreC3StateResidencyHash_[s])->RawValue = 100.*getCoreCStateResidency(3,oldCoreStates[i], coreState); - ((PerformanceCounter^)CoreC6StateResidencyHash_[s])->RawValue = 100.*getCoreCStateResidency(6,oldCoreStates[i], coreState); - ((PerformanceCounter^)CoreC7StateResidencyHash_[s])->RawValue = 100.*getCoreCStateResidency(7,oldCoreStates[i], coreState); + ((PerformanceCounter^)CoreC0StateResidencyHash_[s])->RawValue = __int64(1000. * getCoreCStateResidency(0,oldCoreStates[i], coreState)); + ((PerformanceCounter^)CoreC1StateResidencyHash_[s])->RawValue = __int64(1000. * getCoreCStateResidency(1,oldCoreStates[i], coreState)); + ((PerformanceCounter^)CoreC3StateResidencyHash_[s])->RawValue = __int64(1000. * getCoreCStateResidency(3,oldCoreStates[i], coreState)); + ((PerformanceCounter^)CoreC6StateResidencyHash_[s])->RawValue = __int64(1000. * getCoreCStateResidency(6,oldCoreStates[i], coreState)); + ((PerformanceCounter^)CoreC7StateResidencyHash_[s])->RawValue = __int64(1000. * getCoreCStateResidency(7,oldCoreStates[i], coreState)); } } @@ -508,6 +628,7 @@ namespace PCMServiceNS { System::Collections::Hashtable PackageC8StateResidencyHash_; System::Collections::Hashtable PackageC9StateResidencyHash_; System::Collections::Hashtable PackageC10StateResidencyHash_; + System::Collections::ArrayList baseArrayList_; System::Diagnostics::EventLog^ log_; @@ -532,19 +653,32 @@ namespace PCMServiceNS { initonly String^ MetricCoreResC3 = gcnew String(L"core C3-state residency (%)"); initonly String^ MetricCoreResC6 = gcnew String(L"core C6-state residency (%)"); initonly String^ MetricCoreResC7 = gcnew String(L"core C7-state residency (%)"); + initonly String^ MetricCoreResC0Base = gcnew String(L"core C0-state base"); + initonly String^ MetricCoreResC1Base = gcnew String(L"core C1-state base"); + initonly String^ MetricCoreResC3Base = gcnew String(L"core C3-state base"); + initonly String^ MetricCoreResC6Base = gcnew String(L"core C6-state base"); + initonly String^ MetricCoreResC7Base = gcnew String(L"core C7-state base"); - initonly String^ MetricSocketBandRead = gcnew String(L"Memory Read Bandwidth"); + initonly String^ MetricSocketBandRead = gcnew String(L"Memory Read Bandwidth"); initonly String^ MetricSocketBandWrite = gcnew String(L"Memory Write Bandwidth"); initonly String^ MetricSocketEnergyPack = gcnew String(L"Package/Socket Consumed Energy"); initonly String^ MetricSocketEnergyDram = gcnew String(L"DRAM/Memory Consumed Energy"); - initonly String^ MetricSocketResC0 = gcnew String(L"package C0-state residency (%)"); - initonly String^ MetricSocketResC2 = gcnew String(L"package C2-state residency (%)"); - initonly String^ MetricSocketResC3 = gcnew String(L"package C3-state residency (%)"); - initonly String^ MetricSocketResC6 = gcnew String(L"package C6-state residency (%)"); - initonly String^ MetricSocketResC7 = gcnew String(L"package C7-state residency (%)"); - initonly String^ MetricSocketResC8 = gcnew String(L"package C8-state residency (%)"); - initonly String^ MetricSocketResC9 = gcnew String(L"package C9-state residency (%)"); + initonly String^ MetricSocketResC0 = gcnew String(L"package C0-state residency (%)"); + initonly String^ MetricSocketResC2 = gcnew String(L"package C2-state residency (%)"); + initonly String^ MetricSocketResC3 = gcnew String(L"package C3-state residency (%)"); + initonly String^ MetricSocketResC6 = gcnew String(L"package C6-state residency (%)"); + initonly String^ MetricSocketResC7 = gcnew String(L"package C7-state residency (%)"); + initonly String^ MetricSocketResC8 = gcnew String(L"package C8-state residency (%)"); + initonly String^ MetricSocketResC9 = gcnew String(L"package C9-state residency (%)"); initonly String^ MetricSocketResC10 = gcnew String(L"package C10-state residency (%)"); + initonly String^ MetricSocketResC0Base = gcnew String(L"package C0-state base"); + initonly String^ MetricSocketResC2Base = gcnew String(L"package C2-state base"); + initonly String^ MetricSocketResC3Base = gcnew String(L"package C3-state base"); + initonly String^ MetricSocketResC6Base = gcnew String(L"package C6-state base"); + initonly String^ MetricSocketResC7Base = gcnew String(L"package C7-state base"); + initonly String^ MetricSocketResC8Base = gcnew String(L"package C8-state base"); + initonly String^ MetricSocketResC9Base = gcnew String(L"package C9-state base"); + initonly String^ MetricSocketResC10Base = gcnew String(L"package C10-state base"); initonly String^ MetricQpiBand = gcnew String(L"QPI Link Bandwidth"); @@ -669,6 +803,7 @@ namespace PCMServiceNS { } catch (Exception^ e) { + EventLog->WriteEntry(Globals::ServiceName, "Could not create MeasureThread, aborting", EventLogEntryType::Error); EventLog->WriteEntry(Globals::ServiceName, e->Message, EventLogEntryType::Error); SetServiceFail(0x80886); throw e; From 6840c74bc1405eab0d1f406de94a6a6986fae47e Mon Sep 17 00:00:00 2001 From: "Dementiev, Roman" Date: Wed, 1 Dec 2021 19:13:45 +0100 Subject: [PATCH 3/6] address new LGTM alert https://lgtm.com/projects/g/opcm/pcm/rev/pr-4f5b88344939fd03455a23246071bc054e0b118a Change-Id: Ie260a8918d6f5f6392d7d76231d69e8e969368ca --- pcm-raw.cpp | 96 ++++++++++++++++++++++++++--------------------------- 1 file changed, 48 insertions(+), 48 deletions(-) diff --git a/pcm-raw.cpp b/pcm-raw.cpp index d24b0ccc..6354970e 100644 --- a/pcm-raw.cpp +++ b/pcm-raw.cpp @@ -736,12 +736,12 @@ bool show_partial_core_output = false; bitset ycores; bool flushLine = false; bool transpose = false; -std::string sep = ","; +std::string separator = ","; void printRowBegin(const std::string & EventName, const CoreCounterState & BeforeState, const CoreCounterState & AfterState, PCM* m) { printDateForCSV(CsvOutputType::Data); - cout << EventName << sep << (1000ULL * getInvariantTSC(BeforeState, AfterState)) / m->getNominalFrequency() << sep << getInvariantTSC(BeforeState, AfterState); + cout << EventName << separator << (1000ULL * getInvariantTSC(BeforeState, AfterState)) / m->getNominalFrequency() << separator << getInvariantTSC(BeforeState, AfterState); } @@ -753,7 +753,7 @@ void printRow(const std::string & EventName, MetricFunc metricFunc, const std::v { if (!(m->isCoreOnline(core) == false || (show_partial_core_output && ycores.test(core) == false))) { - cout << sep << metricFunc(BeforeState[core], AfterState[core]); + cout << separator << metricFunc(BeforeState[core], AfterState[core]); } } cout << "\n"; @@ -791,7 +791,7 @@ void printTransposed(const PCM::RawPMUConfigs& curPMUConfigs, PCM* m, vector 0 && AfterState.size() > 0) { choose(outputType, - []() { cout << sep; }, + []() { cout << separator; }, []() { cout << "ms,"; }, - [&]() { cout << (1000ULL * getInvariantTSC(BeforeState[0], AfterState[0])) / m->getNominalFrequency() << sep; }); + [&]() { cout << (1000ULL * getInvariantTSC(BeforeState[0], AfterState[0])) / m->getNominalFrequency() << separator; }); } for (auto typeEvents : curPMUConfigs) { @@ -944,9 +944,9 @@ void print(const PCM::RawPMUConfigs& curPMUConfigs, PCM* m, vectorgetSocketId(core) << "CORE" << core << sep; }, - [&metric]() { cout << metric << sep; }, - [&value]() { cout << value << sep; }); + [m, core]() { cout << "SKT" << m->getSocketId(core) << "CORE" << core << separator; }, + [&metric]() { cout << metric << separator; }, + [&value]() { cout << value << separator; }); }; for (uint32 cnt = 0; cnt < 4; ++cnt) { @@ -967,9 +967,9 @@ void print(const PCM::RawPMUConfigs& curPMUConfigs, PCM* m, vectorgetSocketId(core) << "CORE" << core << sep; }, - [&event, &i]() { if (event.second.empty()) cout << "COREEvent" << i << sep; else cout << event.second << sep; }, - [&]() { cout << getNumberOfCustomEvents(i, BeforeState[core], AfterState[core]) << sep; }); + [m, core]() { cout << "SKT" << m->getSocketId(core) << "CORE" << core << separator; }, + [&event, &i]() { if (event.second.empty()) cout << "COREEvent" << i << separator; else cout << event.second << separator; }, + [&]() { cout << getNumberOfCustomEvents(i, BeforeState[core], AfterState[core]) << separator; }); ++i; } } @@ -984,9 +984,9 @@ void print(const PCM::RawPMUConfigs& curPMUConfigs, PCM* m, vector Date: Wed, 1 Dec 2021 19:46:09 +0100 Subject: [PATCH 4/6] Remove some fixmes Add unitTest for URLs --- pcm-sensor-server.cpp | 98 +++++++++++++++++++++++++++++++++---------- unitTest/Makefile | 42 +++++++++++++++++++ unitTest/urltest.cpp | 29 +++++++++++++ 3 files changed, 148 insertions(+), 21 deletions(-) create mode 100644 unitTest/Makefile create mode 100644 unitTest/urltest.cpp diff --git a/pcm-sensor-server.cpp b/pcm-sensor-server.cpp index cc859735..a8206b39 100644 --- a/pcm-sensor-server.cpp +++ b/pcm-sensor-server.cpp @@ -853,7 +853,8 @@ class basic_socketbuf : public std::basic_streambuf { } else { while( 1 ) { - // FIXME: openSSL has no support for setting the MSG_NOSIGNAL during send + // openSSL has no support for setting the MSG_NOSIGNAL during send + // but we ignore sigpipe so we should be fine bytesSent = SSL_write( ssl_, (void*)outputBuffer_, bytesToSend ); if ( 0 >= bytesSent ) { int sslError = SSL_get_error( ssl_, bytesSent ); @@ -862,7 +863,7 @@ class basic_socketbuf : public std::basic_streambuf { case SSL_ERROR_WANT_WRITE: // retry continue; // Should continue in the while loop and attempt to write again - break; +// break; case SSL_ERROR_ZERO_RETURN: case SSL_ERROR_SYSCALL: case SSL_ERROR_SSL: @@ -1371,16 +1372,18 @@ class HTTPHeaderProperties { } private: - // FIXME: Incomplete, needs adding to + // Contains most if not all headers from RFC2616 RFC7230 and RFC7231 + // This is a mix of request and response headers! + // Please add if you find that headers are missing std::vector const httpHeaderProperties = { - { "Accept", HeaderType::String, true, true, ',' }, - { "Accept-Charset", HeaderType::String, true, true, ',' }, - { "Accept-Encoding", HeaderType::String, true, true, ',' }, - { "Accept-Language", HeaderType::String, true, true, ',' }, + { "Accept", HeaderType::String, true, true }, + { "Accept-Charset", HeaderType::String, true, true }, + { "Accept-Encoding", HeaderType::String, true, true }, + { "Accept-Language", HeaderType::String, true, true }, { "Accept-Ranges", HeaderType::String, false, false }, { "Access-Control-Allow-Credentials", HeaderType::True, false, false }, - { "Access-Control-Allow-Headers", HeaderType::String, false, true, ',' }, - { "Access-Control-Allow-Methods", HeaderType::String, false, true, ',' }, + { "Access-Control-Allow-Headers", HeaderType::String, false, true }, + { "Access-Control-Allow-Methods", HeaderType::String, false, true }, { "Access-Control-Allow-Origin", HeaderType::StarOrFQURL, false, false }, { "Access-Control-Expose-Headers", HeaderType::String, false, true }, { "Access-Control-Max-Age", HeaderType::Integer, false, false }, @@ -1436,7 +1439,7 @@ class HTTPHeaderProperties { { "Strict-Transport-Security", HeaderType::Parameters, false, false }, { "TE", HeaderType::String, true, true }, { "Tk", HeaderType::Character, false, false }, - { "Trailer", HeaderType::ContainsOtherHeaders, false, false, ',' }, + { "Trailer", HeaderType::ContainsOtherHeaders, false, false }, { "Transfer-Encoding", HeaderType::String, false, true }, { "Upgrade-Insecure-Requests", HeaderType::Integer }, { "User-Agent", HeaderType::String, false, false }, @@ -1451,10 +1454,12 @@ class HTTPHeaderProperties { { "X-Forwarded-Proto", HeaderType::String, false, false }, { "X-Frame-Options", HeaderType::String, false, false }, { "X-XSS-Protection", HeaderType::String, false, false } -// { "", HeaderType:: , , }, +// { "", HeaderType:: , , }, // Default LCS is ',', no need to add it }; }; +// This URL class tries to follow RFC 3986 +// the updates in 6874 and 8820 are not taken into account struct URL { public: URL() : scheme_( "" ), user_( "" ), passwd_( "" ), host_( "" ), path_( "" ), fragment_( "" ), port_( 0 ), @@ -1464,7 +1469,54 @@ struct URL { ~URL() = default; URL& operator=( URL const & ) = default; +private: + int charToNumber( std::string::value_type c ) const { + if ( 'A' <= c && 'F' >= c ) + return (int)(c - 'A') + 10; + if ( 'a' <= c && 'f' >= c ) + return (int)(c - 'a') + 10; + if ( '0' <= c && '9' >= c ) + return (int)(c - '0'); + std::stringstream s; + s << "'" << c << "' is not a hexadecimal digit!"; + throw std::runtime_error( s.str() ); + } public: + // Following https://en.wikipedia.org/wiki/Percent-encoding + std::string percentEncode( const std::string& s ) const { + std::stringstream r; + for ( std::string::value_type c : s ) { + // skip alpha and unreserved characters + if ( isalnum( c ) || '-' == c || '_' == c || '.' == c || '~' == c ) { + r << c; + continue; + } + r << '%' << std::setw(2) << std::uppercase << std::hex << int( (unsigned char)c ) << std::nouppercase; + } + return r.str(); + } + + std::string percentDecode( const std::string& s ) const { + std::stringstream r; + for ( std::string::const_iterator ci = s.begin(); ci != s.end(); ++ci ) { + std::string::value_type c = *ci; + int n = 0; + if ( '%' == c ) { + if ( ++ci == s.end() ) + throw std::runtime_error( "Malformed URL, percent found but no next char" ); + n += charToNumber(*ci); + n *= 16; + if ( ++ci == s.end() ) + throw std::runtime_error( "Malformed URL, percent found but no next next char" ); // better error message needed :-) + n += charToNumber(*ci); + r << (unsigned char)n; + continue; + } + r << c; + } + return r.str(); + } + static URL parse( std::string fullURL ) { DBG( 3, "fullURL: '", fullURL, "'" ); URL url; @@ -1530,7 +1582,7 @@ struct URL { userEndPos = passwdColonPos; DBG( 3, "2a userEndPos '", userEndPos, "'" ); // passwd is possibly percent encoded FIXME - url.passwd_ = passwd; + url.passwd_ = url.percentDecode( passwd ); url.hasPasswd_ = true; } else { userEndPos = atPos; @@ -1540,7 +1592,7 @@ struct URL { std::string user = authority.substr( 0, userEndPos ); DBG( 3, "user: '", user, "'" ); // user is possibly percent encoded FIXME - url.user_ = user; + url.user_ = url.percentDecode( user ); url.hasUser_ = true; // delete user/pass including the at authority.erase( 0, atPos+1 ); @@ -1556,7 +1608,7 @@ struct URL { angleBracketClosePos = authority.find( ']', 0 ); angleBracketCloseFound = (angleBracketClosePos != std::string::npos); if ( !angleBracketCloseFound ) - throw std::runtime_error( "No matching ']' found." ); + throw std::runtime_error( "No matching IPv6 ']' found." ); url.host_ = authority.substr( 0, angleBracketClosePos ); url.hasHost_ = true; DBG( 3, "angleBracketCloseFound: host: '", url.host_, "'" ); @@ -1616,6 +1668,7 @@ struct URL { if ( std::string::npos != questionMarkPos ) { url.hasQuery_ = true; + // Why am i not checking numberPos for validity? std::string queryString = fullURL.substr( questionMarkPos+1, numberPos-(questionMarkPos+1) ); DBG( 3, "queryString: '", queryString, "'" ); size_t ampPos = 0; @@ -1627,9 +1680,9 @@ struct URL { if ( std::string::npos == equalsPos ) throw std::runtime_error( "Did not find a '=' in the query" ); std::string one, two; - one = query.substr( 0, equalsPos ); + one = url.percentDecode( query.substr( 0, equalsPos ) ); DBG( 3, "one: '", one, "'" ); - two = query.substr( equalsPos+1 ); + two = url.percentDecode( query.substr( equalsPos+1 ) ); DBG( 3, "two: '", two, "'" ); url.arguments_.push_back( std::make_pair( one ,two ) ); // npos + 1 == 0... ouch @@ -1649,7 +1702,8 @@ struct URL { // Now make sure the URL does not contain %xx values size_t percentPos = url.path_.find( '%' ); if ( std::string::npos != percentPos ) { - // FIXME: implement conversion from percent encoded to ascii + // throwing an error mentioning a dev issue + throw std::runtime_error( std::string("DEV: Some URL component still contains percent encoded values, please report the URL: ") + url.path_ ); } // Done! @@ -1668,11 +1722,11 @@ struct URL { ss << "//"; DBG( 3, " hasUser_: ", hasUser_, ", user_: ", user_ ); if ( hasUser_ ) { - ss << user_; + ss << percentEncode( user_ ); } DBG( 3, " hasPasswd_: ", hasPasswd_, ", passwd_: ", passwd_ ); if ( hasPasswd_ ) { - ss << ':' << passwd_; + ss << ':' << percentEncode( passwd_ ); } DBG( 3, " hasUser_: ", hasUser_, ", user_: ", user_ ); if ( hasUser_ ) { @@ -1695,10 +1749,10 @@ struct URL { size_t i; for ( i = 0; i < (arguments_.size()-1); ++i ) { DBG( 3, " query[", i, "]: ", arguments_[i].first, " ==> ", arguments_[i].second ); - ss << arguments_[i].first << '=' << arguments_[i].second << "&"; + ss << percentEncode( arguments_[i].first ) << '=' << percentEncode( arguments_[i].second ) << "&"; } DBG( 3, " query[", i, "]: ", arguments_[i].first, " ==> ", arguments_[i].second ); - ss << arguments_[i].first << '=' << arguments_[i].second; + ss << percentEncode( arguments_[i].first ) << '=' << percentEncode( arguments_[i].second ); } if ( hasFragment_ ) { DBG( 3, " hasFragment_: ", hasFragment_, ", fragment_: ", fragment_ ); @@ -3047,6 +3101,7 @@ void printHelpText( std::string const & programName ) { std::cerr << " -h|--help : This information\n"; } +#if not defined( UNIT_TEST ) /* Main */ int main( int argc, char* argv[] ) { // Argument handling @@ -3250,3 +3305,4 @@ int main( int argc, char* argv[] ) { } } +#endif // UNIT_TEST diff --git a/unitTest/Makefile b/unitTest/Makefile new file mode 100644 index 00000000..4b4bc335 --- /dev/null +++ b/unitTest/Makefile @@ -0,0 +1,42 @@ + +UNAME:=$(shell uname) + +COMMON_FLAGS = -Wall -g -O3 -Wno-unknown-pragmas -fPIC +CFLAGS += $(COMMON_FLAGS) +CXXFLAGS += $(COMMON_FLAGS) -std=c++11 + +# uncomment if your Linux kernel supports access to /dev/mem from user space +# CXXFLAGS += -DPCM_USE_PCI_MM_LINUX + +# rely on Linux perf support (user needs CAP_SYS_ADMIN privileges), comment out to disable +ifneq ($(wildcard /usr/include/linux/perf_event.h),) +CXXFLAGS += -DPCM_USE_PERF +endif + +ifeq ($(UNAME), Linux) +CFLAGS += -pthread +LIB= -lpthread -lrt +EXE += pcm-sensor-server.x +CXXFLAGS += -Wextra -pthread +OPENSSL_LIB= +# Disabling until we can properly check for dependencies, enable +# yourself if you have the required headers and library installed +#CXXFLAGS += -DUSE_SSL +#OPENSSL_LIB=-lssl -lcrypto -lz -ldl +endif +ifeq ($(UNAME), DragonFly) +LIB= -pthread -lrt +endif +ifeq ($(UNAME), Darwin) +LIB= -lpthread MacMSRDriver/build/Release/libPcmMsr.dylib +CXXFLAGS += -I/usr/include -IMacMSRDriver +endif +ifeq ($(UNAME), FreeBSD) +CXX=c++ +LIB= -lpthread -lc++ +endif + +COMMON_OBJS = ../msr.o ../cpucounters.o ../pci.o ../mmio.o ../bw.o ../utils.o ../topology.o ../dashboard.o ../debug.o ../threadpool.o ../resctrl.o ../simdjson_wrapper.o + +urltest: urltest.cpp ../pcm-sensor-server.cpp + $(CXX) $(CXFLAGS) urltest.cpp $(COMMON_OBJS) $(LIB) -o urltest diff --git a/unitTest/urltest.cpp b/unitTest/urltest.cpp new file mode 100644 index 00000000..14e99d72 --- /dev/null +++ b/unitTest/urltest.cpp @@ -0,0 +1,29 @@ +#define UNIT_TEST 1 + +#include "../pcm-sensor-server.cpp" + +#undef UNIT_TEST + +std::vector urls{ + "http://otto:test@www.intel.com/~otto/file1.txt", + "file://localhost/c/mnt/cd/file2.txt", + "ftp://otto%40yahoo.com:abcd%3B1234@www.intel.com:30/xyz.php?a=1&t=3", + "gopher://otto@hostname1.intel.com:8080/file3.zyx", + "www.intel.com", +// "", + "http://www.blah.org/file.html#firstmark", + "http://www.blah.org/file.html#firstmark%21%23", + "localhost" +}; + +int main( int, char** ) { + for ( auto s : urls ) { + try { + std::cout << s << "\n"; + URL x = URL::parse( s ); + x.printURL(std::cout); + } catch ( std::runtime_error x ) { + std::cout << "\"" << s << "\": " << x.what() << "\n"; + } + } +} From 17de35979f223ec6476eed04ed8db1a6c4243c93 Mon Sep 17 00:00:00 2001 From: Otto Bruggeman Date: Thu, 2 Dec 2021 09:14:48 +0100 Subject: [PATCH 5/6] Fix return code for urltest Add urltest to test.sh Suppress bad cpp checks --- .gitignore | 1 + pcm-sensor-server.cpp | 2 ++ test.sh | 11 +++++++++++ unitTest/urltest.cpp | 3 +++ 4 files changed, 17 insertions(+) diff --git a/.gitignore b/.gitignore index a847bc2e..cd37d422 100644 --- a/.gitignore +++ b/.gitignore @@ -31,3 +31,4 @@ latex/ *.vcxproj.user .vs/ .idea/ +unitTest/urltest diff --git a/pcm-sensor-server.cpp b/pcm-sensor-server.cpp index a8206b39..dccf042d 100644 --- a/pcm-sensor-server.cpp +++ b/pcm-sensor-server.cpp @@ -1502,10 +1502,12 @@ struct URL { std::string::value_type c = *ci; int n = 0; if ( '%' == c ) { + // cppcheck-suppress StlMissingComparison if ( ++ci == s.end() ) throw std::runtime_error( "Malformed URL, percent found but no next char" ); n += charToNumber(*ci); n *= 16; + // cppcheck-suppress StlMissingComparison if ( ++ci == s.end() ) throw std::runtime_error( "Malformed URL, percent found but no next next char" ); // better error message needed :-) n += charToNumber(*ci); diff --git a/test.sh b/test.sh index 70657b5d..8f773779 100644 --- a/test.sh +++ b/test.sh @@ -98,3 +98,14 @@ fi # TODO add more tests # e.g for ./pcm-sensor-server.x, ./pcm-iio.x, ./pcm-sensor.x, ... + +pushd unitTest/ +make +./urltest +# We have 2 expected errors, anything else is a bug +if [ "$?" != 2 ]; then + echo "Error in urltest, 2 expected errors but found $?!" + exit 1 +fi +popd + diff --git a/unitTest/urltest.cpp b/unitTest/urltest.cpp index 14e99d72..0cfb0604 100644 --- a/unitTest/urltest.cpp +++ b/unitTest/urltest.cpp @@ -17,6 +17,7 @@ std::vector urls{ }; int main( int, char** ) { + int errors = 0; for ( auto s : urls ) { try { std::cout << s << "\n"; @@ -24,6 +25,8 @@ int main( int, char** ) { x.printURL(std::cout); } catch ( std::runtime_error x ) { std::cout << "\"" << s << "\": " << x.what() << "\n"; + ++errors; } } + return errors; } From 3b776df503d6d65ccecd8ee1783f83806e1b37d3 Mon Sep 17 00:00:00 2001 From: Otto Bruggeman Date: Thu, 2 Dec 2021 09:18:56 +0100 Subject: [PATCH 6/6] Fix location of cppcheck-suppress statement --- pcm-sensor-server.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/pcm-sensor-server.cpp b/pcm-sensor-server.cpp index dccf042d..295f3ee5 100644 --- a/pcm-sensor-server.cpp +++ b/pcm-sensor-server.cpp @@ -1498,16 +1498,15 @@ struct URL { std::string percentDecode( const std::string& s ) const { std::stringstream r; + // cppcheck-suppress StlMissingComparison for ( std::string::const_iterator ci = s.begin(); ci != s.end(); ++ci ) { std::string::value_type c = *ci; int n = 0; if ( '%' == c ) { - // cppcheck-suppress StlMissingComparison if ( ++ci == s.end() ) throw std::runtime_error( "Malformed URL, percent found but no next char" ); n += charToNumber(*ci); n *= 16; - // cppcheck-suppress StlMissingComparison if ( ++ci == s.end() ) throw std::runtime_error( "Malformed URL, percent found but no next next char" ); // better error message needed :-) n += charToNumber(*ci);