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,
+/* HV_THREAD_COUNTER */
+#if defined(CONFIG_X86_64)
+#define HV_VP_COUNTER_ROOT_DISPATCH_THREAD_BLOCKED 202
#elif defined(CONFIG_ARM64)
- VpRootDispatchThreadBlocked = 94,
+#define HV_VP_COUNTER_ROOT_DISPATCH_THREAD_BLOCKED 95
#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;
static bool mshv_vp_dispatch_thread_blocked(struct mshv_vp *vp)
{
struct hv_stats_page **stats = vp->vp_stats_pages;
- u64 *self_vp_cntrs = stats[HV_STATS_AREA_SELF]->vp_cntrs;
- u64 *parent_vp_cntrs = stats[HV_STATS_AREA_PARENT]->vp_cntrs;
+ u64 *self_vp_cntrs = stats[HV_STATS_AREA_SELF]->data;
+ u64 *parent_vp_cntrs = stats[HV_STATS_AREA_PARENT]->data;
- if (self_vp_cntrs[VpRootDispatchThreadBlocked])
- return self_vp_cntrs[VpRootDispatchThreadBlocked];
- return parent_vp_cntrs[VpRootDispatchThreadBlocked];
+ return parent_vp_cntrs[HV_VP_COUNTER_ROOT_DISPATCH_THREAD_BLOCKED] ||
+ self_vp_cntrs[HV_VP_COUNTER_ROOT_DISPATCH_THREAD_BLOCKED];
}
static int
#include "hvhdk_mini.h"
#include "hvgdk.h"
+/*
+ * Hypervisor statistics page format
+ */
+struct hv_stats_page {
+ u64 data[HV_HYP_PAGE_SIZE / sizeof(u64)];
+} __packed;
+
/* Bits for dirty mask of hv_vp_register_page */
#define HV_X64_REGISTER_CLASS_GENERAL 0
#define HV_X64_REGISTER_CLASS_IP 1