[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-ID: <e75faa74-4d49-4b17-8e16-4f05b56c1f32@linux.microsoft.com>
Date: Fri, 16 Jan 2026 10:33:56 -0800
From: Nuno Das Neves <nunodasneves@...ux.microsoft.com>
To: Michael Kelley <mhklinux@...look.com>,
Stanislav Kinsburskii <skinsburskii@...ux.microsoft.com>
Cc: "linux-hyperv@...r.kernel.org" <linux-hyperv@...r.kernel.org>,
"linux-kernel@...r.kernel.org" <linux-kernel@...r.kernel.org>,
"kys@...rosoft.com" <kys@...rosoft.com>,
"haiyangz@...rosoft.com" <haiyangz@...rosoft.com>,
"wei.liu@...nel.org" <wei.liu@...nel.org>,
"decui@...rosoft.com" <decui@...rosoft.com>,
"longli@...rosoft.com" <longli@...rosoft.com>,
"prapal@...ux.microsoft.com" <prapal@...ux.microsoft.com>,
"mrathor@...ux.microsoft.com" <mrathor@...ux.microsoft.com>,
"paekkaladevi@...ux.microsoft.com" <paekkaladevi@...ux.microsoft.com>
Subject: Re: [PATCH v3 5/6] mshv: Add definitions for stats pages
On 1/16/2026 9:01 AM, Michael Kelley wrote:
> From: Nuno Das Neves <nunodasneves@...ux.microsoft.com> Sent: Thursday, January 15, 2026 11:35 AM
>>
>> On 1/15/2026 8:19 AM, Stanislav Kinsburskii wrote:
>>> On Wed, Jan 14, 2026 at 01:38:02PM -0800, Nuno Das Neves wrote:
>>>> Add the definitions for hypervisor, logical processor, and partition
>>>> stats pages.
>>>>
>>>
>>> The definitions in for partition and virtual processor are outdated.
>>> Now is the good time to sync the new values in.
>>>
>>> Thanks,
>>> Stanislav
>>>
>>
>> Good point, thanks, I will update it for v4.
>>
>> I'm finally noticing that these counters are not really from hvhdk.h, in
>> the windows code, but their own file. Since I'm still iterating on this,
>> what do you think about creating a file just for the counters?
>> e.g. drivers/hv/hvcounters.h, which combines hvcountersarm64 and amd64.
>>
>> That would have a couple of advantages:
>> 1. Not putting things in hvhdk.h which aren't actually there in the
>> Windows source
>> 2. Less visibility of CamelCase naming outside our driver
>> 3. I could define the enums using "X macro"s to generate the show() code
>> more cleanly in mshv_debugfs.c, which is something Michael suggested
>> here:
>> https://lore.kernel.org/linux-hyperv/SN6PR02MB4157938404BC0D12978ACD9BD4A2A@SN6PR02MB4157.namprd02.prod.outlook.com/
>>
>> It would look something like this:
>>
>> In hvcounters.h:
>>
>> #if is_enabled(CONFIG_X86_64)
>>
>> #define HV_COUNTER_VP_LIST(X) \
>> X(VpTotalRunTime, 1), \
>> X(VpHypervisorRunTime, 2), \
>> X(VpRemoteNodeRunTime, 3), \
>> /* <snip> */
>>
>> #elif is_enabled(CONFIG_ARM64)
>>
>> /* <snip> */
>>
>> #endif
>>
>> Just like now, it's a copy/paste from Windows + simple pattern
>> replacement. Note with this approach we need separate lists for arm64
>> and x86, but that matches how the enums are defined in Windows.
>>
>> Then, in mshv_debugfs.c:
>>
>> /*
>> * We need the strings paired with their enum values.
>> * This structure can be used for all the different stat types.
>> */
>> struct hv_counter_entry {
>> char *name;
>> int idx;
>> };
>>
>> /* Define an array entry (again, reusable) */
>> #define HV_COUNTER_LIST(name, idx) \
>> { __stringify(name), idx },
>
> Couldn't this also go in hvcounters.h, so it doesn't need to be
> passed as a parameter to HV_COUNTER_VP_LIST() and friends?
> Or is the goal to keep hvcounters.h as bare minimum as possible?
>
Oh, yes certainly the struct and macros could all be hv_counters.h.
>>
>> /* Create our static array */
>> static struct hv_counter_entry hv_counter_vp_array[] = {
>> HV_ST_COUNTER_VP(HV_COUNTER_VP)
>> };
>
> Shouldn't the above be HV_COUNTER_VP_LIST(HV_COUNTER_LIST)
> to match the #define in hvcounters.h, and the macro that does the
> __stringify()? Assuming so, I think I understand the overall idea you
> are proposing. It's pretty clever. :-)
>
Oh, yes it should be HV_COUNTER_VP_LIST(HV_COUNTER_LIST)
> The #define of HV_COUNTER_VP_LIST() in hvcounters.h gets large
> for VP stats -- the #define will be about 200 lines. I have no sense
> of whether being that large is problematic for the tooling. And that
> question needs to be considered beyond just the C preprocessor and
> compiler, to include things like sparse, cscope, and other tools that
> parse source code. I had originally suggested building the static array
> directly in a .c file, which would avoid the need for the big #define.
> And maybe you could still do that with a separate .c source file just
> for the static arrays -- i.e., hvcounters.h becomes hvcounters.c. It
> seems like the " it's a copy/paste from Windows + simple pattern
> replacement" could be done to generate a .c file as easily as a .h file
> while still keeping the file contents to a bare minimum.
>
Good point... I usually reach for this "X macros" technique when I have
a list of things that needs to be repeated in multiple places (e.g.
defining a big enum AND also using the enum values in a big switch
statement).
Since we don't need the enum after all, apparently (it's not in hvhdk.h),
your original suggestion is probably the most straightforward thing; just
putting the values into a static array directly.
Putting it in it's own .c file and including that might be the easiest
thing, I'll give that a go and see how it looks.
> Either way (.h or .c file), I like the idea.
>
> Michael
>
>>
>> static int vp_stats_show(struct seq_file *m, void *v)
>> {
>> const struct hv_stats_page **pstats = m->private;
>> int i;
>>
>> for (i = 0; i < ARRAY_SIZE(hv_counter_vp_array); ++i) {
>> struct hv_counter_entry entry = hv_counter_vp_array[i];
>> u64 parent_val = pstats[HV_STATS_AREA_PARENT]->vp_cntrs[entry.idx];
>> u64 self_val = pstats[HV_STATS_AREA_SELF]->vp_cntrs[entry.idx];
>>
>> /* Prioritize the PARENT area value */
>> seq_printf(m, "%-30s: %llu\n", entry.name,
>> parent_val ? parent_val : self_val);
>> }
>> }
>>
>> Any thoughts? I was originally going to just go with the pattern we had,
>> but since these definitions aren't from the hv*dk.h files, we can maybe
>> get more creative and make the resulting code look a bit better.
>>
>> Thanks
>> Nuno
>>
>>>> Move the definition for the VP stats page to its rightful place in
>>>> hvhdk.h, and add the missing members.
>>>>
>>>> While at it, correct the ARM64 value of VpRootDispatchThreadBlocked,
>>>> (which is not yet used, so there is no impact).
>>>>
>>>> These enum members retain their CamelCase style, since they are imported
>>>> directly from the hypervisor code. They will be stringified when
>>>> printing the stats out, and retain more readability in this form.
>>>>
>>>> Signed-off-by: Nuno Das Neves <nunodasneves@...ux.microsoft.com>
>>>> ---
>>>> 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 fbfc9e7d9fa4..724bbaa0b08c 100644
>>>> --- a/drivers/hv/mshv_root_main.c
>>>> +++ b/drivers/hv/mshv_root_main.c
>>>> @@ -39,23 +39,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..8bddd11feeba 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,
>>>> + VpLoadAvg = 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,
>>>> +#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 statistics page format
>>>> + */
>>>> +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
Powered by blists - more mailing lists