On 12/8/2025 7:13 AM, Michael Kelley wrote: > From: Nuno Das Neves <[email protected]> Sent: Friday, > December 5, 2025 10:59 AM >> >> Add the definitions for hypervisor, logical processor, and partition >> stats pages. >> >> Move the definition for the VP stats page to its rightful place in >> hvhdk.h, and add the missing members. >> >> These enum members retain their CamelCase style, since they are imported >> directly from the hypervisor code They will be stringified when printing > > Missing a '.' (period) after "hypervisor code". > Ack
>> the stats out, and retain more readability in this form. >> >> Signed-off-by: Nuno Das Neves <[email protected]> >> --- >> drivers/hv/mshv_root_main.c | 17 -- >> include/hyperv/hvhdk.h | 437 ++++++++++++++++++++++++++++++++++++ >> 2 files changed, 437 insertions(+), 17 deletions(-) >> >> diff --git a/drivers/hv/mshv_root_main.c b/drivers/hv/mshv_root_main.c >> index f59a4ab47685..19006b788e85 100644 >> --- a/drivers/hv/mshv_root_main.c >> +++ b/drivers/hv/mshv_root_main.c >> @@ -38,23 +38,6 @@ MODULE_AUTHOR("Microsoft"); >> MODULE_LICENSE("GPL"); >> MODULE_DESCRIPTION("Microsoft Hyper-V root partition VMM interface >> /dev/mshv"); >> >> -/* TODO move this to another file when debugfs code is added */ >> -enum hv_stats_vp_counters { /* HV_THREAD_COUNTER */ >> -#if defined(CONFIG_X86) >> - VpRootDispatchThreadBlocked = 202, >> -#elif defined(CONFIG_ARM64) >> - VpRootDispatchThreadBlocked = 94, >> -#endif >> - VpStatsMaxCounter >> -}; >> - >> -struct hv_stats_page { >> - union { >> - u64 vp_cntrs[VpStatsMaxCounter]; /* VP counters >> */ >> - u8 data[HV_HYP_PAGE_SIZE]; >> - }; >> -} __packed; >> - >> struct mshv_root mshv_root; >> >> enum hv_scheduler_type hv_scheduler_type; >> diff --git a/include/hyperv/hvhdk.h b/include/hyperv/hvhdk.h >> index 469186df7826..51abbcd0ec37 100644 >> --- a/include/hyperv/hvhdk.h >> +++ b/include/hyperv/hvhdk.h >> @@ -10,6 +10,443 @@ >> #include "hvhdk_mini.h" >> #include "hvgdk.h" >> >> +enum hv_stats_hypervisor_counters { /* HV_HYPERVISOR_COUNTER */ >> + HvLogicalProcessors = 1, >> + HvPartitions = 2, >> + HvTotalPages = 3, >> + HvVirtualProcessors = 4, >> + HvMonitoredNotifications = 5, >> + HvModernStandbyEntries = 6, >> + HvPlatformIdleTransitions = 7, >> + HvHypervisorStartupCost = 8, >> + HvIOSpacePages = 10, >> + HvNonEssentialPagesForDump = 11, >> + HvSubsumedPages = 12, >> + HvStatsMaxCounter >> +}; >> + >> +enum hv_stats_partition_counters { /* HV_PROCESS_COUNTER */ >> + PartitionVirtualProcessors = 1, >> + PartitionTlbSize = 3, >> + PartitionAddressSpaces = 4, >> + PartitionDepositedPages = 5, >> + PartitionGpaPages = 6, >> + PartitionGpaSpaceModifications = 7, >> + PartitionVirtualTlbFlushEntires = 8, >> + PartitionRecommendedTlbSize = 9, >> + PartitionGpaPages4K = 10, >> + PartitionGpaPages2M = 11, >> + PartitionGpaPages1G = 12, >> + PartitionGpaPages512G = 13, >> + PartitionDevicePages4K = 14, >> + PartitionDevicePages2M = 15, >> + PartitionDevicePages1G = 16, >> + PartitionDevicePages512G = 17, >> + PartitionAttachedDevices = 18, >> + PartitionDeviceInterruptMappings = 19, >> + PartitionIoTlbFlushes = 20, >> + PartitionIoTlbFlushCost = 21, >> + PartitionDeviceInterruptErrors = 22, >> + PartitionDeviceDmaErrors = 23, >> + PartitionDeviceInterruptThrottleEvents = 24, >> + PartitionSkippedTimerTicks = 25, >> + PartitionPartitionId = 26, >> +#if IS_ENABLED(CONFIG_X86_64) >> + PartitionNestedTlbSize = 27, >> + PartitionRecommendedNestedTlbSize = 28, >> + PartitionNestedTlbFreeListSize = 29, >> + PartitionNestedTlbTrimmedPages = 30, >> + PartitionPagesShattered = 31, >> + PartitionPagesRecombined = 32, >> + PartitionHwpRequestValue = 33, >> +#elif IS_ENABLED(CONFIG_ARM64) >> + PartitionHwpRequestValue = 27, >> +#endif >> + PartitionStatsMaxCounter >> +}; >> + >> +enum hv_stats_vp_counters { /* HV_THREAD_COUNTER */ >> + VpTotalRunTime = 1, >> + VpHypervisorRunTime = 2, >> + VpRemoteNodeRunTime = 3, >> + VpNormalizedRunTime = 4, >> + VpIdealCpu = 5, >> + VpHypercallsCount = 7, >> + VpHypercallsTime = 8, >> +#if IS_ENABLED(CONFIG_X86_64) >> + VpPageInvalidationsCount = 9, >> + VpPageInvalidationsTime = 10, >> + VpControlRegisterAccessesCount = 11, >> + VpControlRegisterAccessesTime = 12, >> + VpIoInstructionsCount = 13, >> + VpIoInstructionsTime = 14, >> + VpHltInstructionsCount = 15, >> + VpHltInstructionsTime = 16, >> + VpMwaitInstructionsCount = 17, >> + VpMwaitInstructionsTime = 18, >> + VpCpuidInstructionsCount = 19, >> + VpCpuidInstructionsTime = 20, >> + VpMsrAccessesCount = 21, >> + VpMsrAccessesTime = 22, >> + VpOtherInterceptsCount = 23, >> + VpOtherInterceptsTime = 24, >> + VpExternalInterruptsCount = 25, >> + VpExternalInterruptsTime = 26, >> + VpPendingInterruptsCount = 27, >> + VpPendingInterruptsTime = 28, >> + VpEmulatedInstructionsCount = 29, >> + VpEmulatedInstructionsTime = 30, >> + VpDebugRegisterAccessesCount = 31, >> + VpDebugRegisterAccessesTime = 32, >> + VpPageFaultInterceptsCount = 33, >> + VpPageFaultInterceptsTime = 34, >> + VpGuestPageTableMaps = 35, >> + VpLargePageTlbFills = 36, >> + VpSmallPageTlbFills = 37, >> + VpReflectedGuestPageFaults = 38, >> + VpApicMmioAccesses = 39, >> + VpIoInterceptMessages = 40, >> + VpMemoryInterceptMessages = 41, >> + VpApicEoiAccesses = 42, >> + VpOtherMessages = 43, >> + VpPageTableAllocations = 44, >> + VpLogicalProcessorMigrations = 45, >> + VpAddressSpaceEvictions = 46, >> + VpAddressSpaceSwitches = 47, >> + VpAddressDomainFlushes = 48, >> + VpAddressSpaceFlushes = 49, >> + VpGlobalGvaRangeFlushes = 50, >> + VpLocalGvaRangeFlushes = 51, >> + VpPageTableEvictions = 52, >> + VpPageTableReclamations = 53, >> + VpPageTableResets = 54, >> + VpPageTableValidations = 55, >> + VpApicTprAccesses = 56, >> + VpPageTableWriteIntercepts = 57, >> + VpSyntheticInterrupts = 58, >> + VpVirtualInterrupts = 59, >> + VpApicIpisSent = 60, >> + VpApicSelfIpisSent = 61, >> + VpGpaSpaceHypercalls = 62, >> + VpLogicalProcessorHypercalls = 63, >> + VpLongSpinWaitHypercalls = 64, >> + VpOtherHypercalls = 65, >> + VpSyntheticInterruptHypercalls = 66, >> + VpVirtualInterruptHypercalls = 67, >> + VpVirtualMmuHypercalls = 68, >> + VpVirtualProcessorHypercalls = 69, >> + VpHardwareInterrupts = 70, >> + VpNestedPageFaultInterceptsCount = 71, >> + VpNestedPageFaultInterceptsTime = 72, >> + VpPageScans = 73, >> + VpLogicalProcessorDispatches = 74, >> + VpWaitingForCpuTime = 75, >> + VpExtendedHypercalls = 76, >> + VpExtendedHypercallInterceptMessages = 77, >> + VpMbecNestedPageTableSwitches = 78, >> + VpOtherReflectedGuestExceptions = 79, >> + VpGlobalIoTlbFlushes = 80, >> + VpGlobalIoTlbFlushCost = 81, >> + VpLocalIoTlbFlushes = 82, >> + VpLocalIoTlbFlushCost = 83, >> + VpHypercallsForwardedCount = 84, >> + VpHypercallsForwardingTime = 85, >> + VpPageInvalidationsForwardedCount = 86, >> + VpPageInvalidationsForwardingTime = 87, >> + VpControlRegisterAccessesForwardedCount = 88, >> + VpControlRegisterAccessesForwardingTime = 89, >> + VpIoInstructionsForwardedCount = 90, >> + VpIoInstructionsForwardingTime = 91, >> + VpHltInstructionsForwardedCount = 92, >> + VpHltInstructionsForwardingTime = 93, >> + VpMwaitInstructionsForwardedCount = 94, >> + VpMwaitInstructionsForwardingTime = 95, >> + VpCpuidInstructionsForwardedCount = 96, >> + VpCpuidInstructionsForwardingTime = 97, >> + VpMsrAccessesForwardedCount = 98, >> + VpMsrAccessesForwardingTime = 99, >> + VpOtherInterceptsForwardedCount = 100, >> + VpOtherInterceptsForwardingTime = 101, >> + VpExternalInterruptsForwardedCount = 102, >> + VpExternalInterruptsForwardingTime = 103, >> + VpPendingInterruptsForwardedCount = 104, >> + VpPendingInterruptsForwardingTime = 105, >> + VpEmulatedInstructionsForwardedCount = 106, >> + VpEmulatedInstructionsForwardingTime = 107, >> + VpDebugRegisterAccessesForwardedCount = 108, >> + VpDebugRegisterAccessesForwardingTime = 109, >> + VpPageFaultInterceptsForwardedCount = 110, >> + VpPageFaultInterceptsForwardingTime = 111, >> + VpVmclearEmulationCount = 112, >> + VpVmclearEmulationTime = 113, >> + VpVmptrldEmulationCount = 114, >> + VpVmptrldEmulationTime = 115, >> + VpVmptrstEmulationCount = 116, >> + VpVmptrstEmulationTime = 117, >> + VpVmreadEmulationCount = 118, >> + VpVmreadEmulationTime = 119, >> + VpVmwriteEmulationCount = 120, >> + VpVmwriteEmulationTime = 121, >> + VpVmxoffEmulationCount = 122, >> + VpVmxoffEmulationTime = 123, >> + VpVmxonEmulationCount = 124, >> + VpVmxonEmulationTime = 125, >> + VpNestedVMEntriesCount = 126, >> + VpNestedVMEntriesTime = 127, >> + VpNestedSLATSoftPageFaultsCount = 128, >> + VpNestedSLATSoftPageFaultsTime = 129, >> + VpNestedSLATHardPageFaultsCount = 130, >> + VpNestedSLATHardPageFaultsTime = 131, >> + VpInvEptAllContextEmulationCount = 132, >> + VpInvEptAllContextEmulationTime = 133, >> + VpInvEptSingleContextEmulationCount = 134, >> + VpInvEptSingleContextEmulationTime = 135, >> + VpInvVpidAllContextEmulationCount = 136, >> + VpInvVpidAllContextEmulationTime = 137, >> + VpInvVpidSingleContextEmulationCount = 138, >> + VpInvVpidSingleContextEmulationTime = 139, >> + VpInvVpidSingleAddressEmulationCount = 140, >> + VpInvVpidSingleAddressEmulationTime = 141, >> + VpNestedTlbPageTableReclamations = 142, >> + VpNestedTlbPageTableEvictions = 143, >> + VpFlushGuestPhysicalAddressSpaceHypercalls = 144, >> + VpFlushGuestPhysicalAddressListHypercalls = 145, >> + VpPostedInterruptNotifications = 146, >> + VpPostedInterruptScans = 147, >> + VpTotalCoreRunTime = 148, >> + VpMaximumRunTime = 149, >> + VpHwpRequestContextSwitches = 150, >> + VpWaitingForCpuTimeBucket0 = 151, >> + VpWaitingForCpuTimeBucket1 = 152, >> + VpWaitingForCpuTimeBucket2 = 153, >> + VpWaitingForCpuTimeBucket3 = 154, >> + VpWaitingForCpuTimeBucket4 = 155, >> + VpWaitingForCpuTimeBucket5 = 156, >> + VpWaitingForCpuTimeBucket6 = 157, >> + VpVmloadEmulationCount = 158, >> + VpVmloadEmulationTime = 159, >> + VpVmsaveEmulationCount = 160, >> + VpVmsaveEmulationTime = 161, >> + VpGifInstructionEmulationCount = 162, >> + VpGifInstructionEmulationTime = 163, >> + VpEmulatedErrataSvmInstructions = 164, >> + VpPlaceholder1 = 165, >> + VpPlaceholder2 = 166, >> + VpPlaceholder3 = 167, >> + VpPlaceholder4 = 168, >> + VpPlaceholder5 = 169, >> + VpPlaceholder6 = 170, >> + VpPlaceholder7 = 171, >> + VpPlaceholder8 = 172, >> + VpPlaceholder9 = 173, >> + VpPlaceholder10 = 174, >> + VpSchedulingPriority = 175, >> + VpRdpmcInstructionsCount = 176, >> + VpRdpmcInstructionsTime = 177, >> + VpPerfmonPmuMsrAccessesCount = 178, >> + VpPerfmonLbrMsrAccessesCount = 179, >> + VpPerfmonIptMsrAccessesCount = 180, >> + VpPerfmonInterruptCount = 181, >> + VpVtl1DispatchCount = 182, >> + VpVtl2DispatchCount = 183, >> + VpVtl2DispatchBucket0 = 184, >> + VpVtl2DispatchBucket1 = 185, >> + VpVtl2DispatchBucket2 = 186, >> + VpVtl2DispatchBucket3 = 187, >> + VpVtl2DispatchBucket4 = 188, >> + VpVtl2DispatchBucket5 = 189, >> + VpVtl2DispatchBucket6 = 190, >> + VpVtl1RunTime = 191, >> + VpVtl2RunTime = 192, >> + VpIommuHypercalls = 193, >> + VpCpuGroupHypercalls = 194, >> + VpVsmHypercalls = 195, >> + VpEventLogHypercalls = 196, >> + VpDeviceDomainHypercalls = 197, >> + VpDepositHypercalls = 198, >> + VpSvmHypercalls = 199, >> + VpBusLockAcquisitionCount = 200, >> + VpUnused = 201, >> + VpRootDispatchThreadBlocked = 202, >> +#elif IS_ENABLED(CONFIG_ARM64) >> + VpSysRegAccessesCount = 9, >> + VpSysRegAccessesTime = 10, >> + VpSmcInstructionsCount = 11, >> + VpSmcInstructionsTime = 12, >> + VpOtherInterceptsCount = 13, >> + VpOtherInterceptsTime = 14, >> + VpExternalInterruptsCount = 15, >> + VpExternalInterruptsTime = 16, >> + VpPendingInterruptsCount = 17, >> + VpPendingInterruptsTime = 18, >> + VpGuestPageTableMaps = 19, >> + VpLargePageTlbFills = 20, >> + VpSmallPageTlbFills = 21, >> + VpReflectedGuestPageFaults = 22, >> + VpMemoryInterceptMessages = 23, >> + VpOtherMessages = 24, >> + VpLogicalProcessorMigrations = 25, >> + VpAddressDomainFlushes = 26, >> + VpAddressSpaceFlushes = 27, >> + VpSyntheticInterrupts = 28, >> + VpVirtualInterrupts = 29, >> + VpApicSelfIpisSent = 30, >> + VpGpaSpaceHypercalls = 31, >> + VpLogicalProcessorHypercalls = 32, >> + VpLongSpinWaitHypercalls = 33, >> + VpOtherHypercalls = 34, >> + VpSyntheticInterruptHypercalls = 35, >> + VpVirtualInterruptHypercalls = 36, >> + VpVirtualMmuHypercalls = 37, >> + VpVirtualProcessorHypercalls = 38, >> + VpHardwareInterrupts = 39, >> + VpNestedPageFaultInterceptsCount = 40, >> + VpNestedPageFaultInterceptsTime = 41, >> + VpLogicalProcessorDispatches = 42, >> + VpWaitingForCpuTime = 43, >> + VpExtendedHypercalls = 44, >> + VpExtendedHypercallInterceptMessages = 45, >> + VpMbecNestedPageTableSwitches = 46, >> + VpOtherReflectedGuestExceptions = 47, >> + VpGlobalIoTlbFlushes = 48, >> + VpGlobalIoTlbFlushCost = 49, >> + VpLocalIoTlbFlushes = 50, >> + VpLocalIoTlbFlushCost = 51, >> + VpFlushGuestPhysicalAddressSpaceHypercalls = 52, >> + VpFlushGuestPhysicalAddressListHypercalls = 53, >> + VpPostedInterruptNotifications = 54, >> + VpPostedInterruptScans = 55, >> + VpTotalCoreRunTime = 56, >> + VpMaximumRunTime = 57, >> + VpWaitingForCpuTimeBucket0 = 58, >> + VpWaitingForCpuTimeBucket1 = 59, >> + VpWaitingForCpuTimeBucket2 = 60, >> + VpWaitingForCpuTimeBucket3 = 61, >> + VpWaitingForCpuTimeBucket4 = 62, >> + VpWaitingForCpuTimeBucket5 = 63, >> + VpWaitingForCpuTimeBucket6 = 64, >> + VpHwpRequestContextSwitches = 65, >> + VpPlaceholder2 = 66, >> + VpPlaceholder3 = 67, >> + VpPlaceholder4 = 68, >> + VpPlaceholder5 = 69, >> + VpPlaceholder6 = 70, >> + VpPlaceholder7 = 71, >> + VpPlaceholder8 = 72, >> + VpContentionTime = 73, >> + VpWakeUpTime = 74, >> + VpSchedulingPriority = 75, >> + VpVtl1DispatchCount = 76, >> + VpVtl2DispatchCount = 77, >> + VpVtl2DispatchBucket0 = 78, >> + VpVtl2DispatchBucket1 = 79, >> + VpVtl2DispatchBucket2 = 80, >> + VpVtl2DispatchBucket3 = 81, >> + VpVtl2DispatchBucket4 = 82, >> + VpVtl2DispatchBucket5 = 83, >> + VpVtl2DispatchBucket6 = 84, >> + VpVtl1RunTime = 85, >> + VpVtl2RunTime = 86, >> + VpIommuHypercalls = 87, >> + VpCpuGroupHypercalls = 88, >> + VpVsmHypercalls = 89, >> + VpEventLogHypercalls = 90, >> + VpDeviceDomainHypercalls = 91, >> + VpDepositHypercalls = 92, >> + VpSvmHypercalls = 93, >> + VpLoadAvg = 94, >> + VpRootDispatchThreadBlocked = 95, > > In current code, VpRootDispatchThreadBlocked on ARM64 is 94. Is that an > error that is being corrected by this patch? > Hmm, I didn't realize this changed - 95 is the correct value. However, the mshv driver does not yet support on ARM64, so this fix doesn't have any impact right now. Do you suggest a separate patch to fix it? >> +#endif >> + VpStatsMaxCounter >> +}; >> + >> +enum hv_stats_lp_counters { /* HV_CPU_COUNTER */ >> + LpGlobalTime = 1, >> + LpTotalRunTime = 2, >> + LpHypervisorRunTime = 3, >> + LpHardwareInterrupts = 4, >> + LpContextSwitches = 5, >> + LpInterProcessorInterrupts = 6, >> + LpSchedulerInterrupts = 7, >> + LpTimerInterrupts = 8, >> + LpInterProcessorInterruptsSent = 9, >> + LpProcessorHalts = 10, >> + LpMonitorTransitionCost = 11, >> + LpContextSwitchTime = 12, >> + LpC1TransitionsCount = 13, >> + LpC1RunTime = 14, >> + LpC2TransitionsCount = 15, >> + LpC2RunTime = 16, >> + LpC3TransitionsCount = 17, >> + LpC3RunTime = 18, >> + LpRootVpIndex = 19, >> + LpIdleSequenceNumber = 20, >> + LpGlobalTscCount = 21, >> + LpActiveTscCount = 22, >> + LpIdleAccumulation = 23, >> + LpReferenceCycleCount0 = 24, >> + LpActualCycleCount0 = 25, >> + LpReferenceCycleCount1 = 26, >> + LpActualCycleCount1 = 27, >> + LpProximityDomainId = 28, >> + LpPostedInterruptNotifications = 29, >> + LpBranchPredictorFlushes = 30, >> +#if IS_ENABLED(CONFIG_X86_64) >> + LpL1DataCacheFlushes = 31, >> + LpImmediateL1DataCacheFlushes = 32, >> + LpMbFlushes = 33, >> + LpCounterRefreshSequenceNumber = 34, >> + LpCounterRefreshReferenceTime = 35, >> + LpIdleAccumulationSnapshot = 36, >> + LpActiveTscCountSnapshot = 37, >> + LpHwpRequestContextSwitches = 38, >> + LpPlaceholder1 = 39, >> + LpPlaceholder2 = 40, >> + LpPlaceholder3 = 41, >> + LpPlaceholder4 = 42, >> + LpPlaceholder5 = 43, >> + LpPlaceholder6 = 44, >> + LpPlaceholder7 = 45, >> + LpPlaceholder8 = 46, >> + LpPlaceholder9 = 47, >> + LpPlaceholder10 = 48, >> + LpReserveGroupId = 49, >> + LpRunningPriority = 50, >> + LpPerfmonInterruptCount = 51, >> +#elif IS_ENABLED(CONFIG_ARM64) >> + LpCounterRefreshSequenceNumber = 31, >> + LpCounterRefreshReferenceTime = 32, >> + LpIdleAccumulationSnapshot = 33, >> + LpActiveTscCountSnapshot = 34, >> + LpHwpRequestContextSwitches = 35, >> + LpPlaceholder2 = 36, >> + LpPlaceholder3 = 37, >> + LpPlaceholder4 = 38, >> + LpPlaceholder5 = 39, >> + LpPlaceholder6 = 40, >> + LpPlaceholder7 = 41, >> + LpPlaceholder8 = 42, >> + LpPlaceholder9 = 43, >> + LpSchLocalRunListSize = 44, >> + LpReserveGroupId = 45, >> + LpRunningPriority = 46, >> +#endif >> + LpStatsMaxCounter >> +}; >> + >> +/* >> + * Hypervisor statsitics page format > > s/statsitics/statistics/ > Ack, thanks >> + */ >> +struct hv_stats_page { >> + union { >> + u64 hv_cntrs[HvStatsMaxCounter]; /* Hypervisor >> counters >> */ >> + u64 pt_cntrs[PartitionStatsMaxCounter]; /* Partition >> counters */ >> + u64 vp_cntrs[VpStatsMaxCounter]; /* VP counters >> */ >> + u64 lp_cntrs[LpStatsMaxCounter]; /* LP counters >> */ >> + u8 data[HV_HYP_PAGE_SIZE]; >> + }; >> +} __packed; >> + >> /* Bits for dirty mask of hv_vp_register_page */ >> #define HV_X64_REGISTER_CLASS_GENERAL 0 >> #define HV_X64_REGISTER_CLASS_IP 1 >> -- >> 2.34.1
