]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
mshv: Always map child vp stats pages regardless of scheduler type
authorStanislav Kinsburskii <skinsburskii@linux.microsoft.com>
Wed, 28 Jan 2026 18:11:43 +0000 (10:11 -0800)
committerWei Liu <wei.liu@kernel.org>
Wed, 4 Feb 2026 06:17:05 +0000 (06:17 +0000)
Currently vp->vp_stats_pages is only used by the root scheduler for fast
interrupt injection.

Soon, vp_stats_pages will also be needed for exposing child VP stats to
userspace via debugfs. Mapping the pages a second time to a different
address causes an error on L1VH.

Remove the scheduler requirement and always map the vp stats pages.

Signed-off-by: Stanislav Kinsburskii <skinsburskii@linux.microsoft.com>
Signed-off-by: Nuno Das Neves <nunodasneves@linux.microsoft.com>
Acked-by: Stanislav Kinsburskii <skinsburskii@linux.microsoft.com>
Reviewed-by: Michael Kelley <mhklinux@outlook.com>
Signed-off-by: Wei Liu <wei.liu@kernel.org>
drivers/hv/mshv_root_main.c

index 781e497215392ed890ef3a3f1216861403c82296..e679cebadfd0949db72f8c61177f4f271efabb31 100644 (file)
@@ -1078,16 +1078,10 @@ mshv_partition_ioctl_create_vp(struct mshv_partition *partition,
                        goto unmap_register_page;
        }
 
-       /*
-        * This mapping of the stats page is for detecting if dispatch thread
-        * is blocked - only relevant for root scheduler
-        */
-       if (hv_scheduler_type == HV_SCHEDULER_TYPE_ROOT) {
-               ret = mshv_vp_stats_map(partition->pt_id, args.vp_index,
-                                       stats_pages);
-               if (ret)
-                       goto unmap_ghcb_page;
-       }
+       ret = mshv_vp_stats_map(partition->pt_id, args.vp_index,
+                               stats_pages);
+       if (ret)
+               goto unmap_ghcb_page;
 
        vp = kzalloc(sizeof(*vp), GFP_KERNEL);
        if (!vp)
@@ -1111,8 +1105,7 @@ mshv_partition_ioctl_create_vp(struct mshv_partition *partition,
        if (mshv_partition_encrypted(partition) && is_ghcb_mapping_available())
                vp->vp_ghcb_page = page_to_virt(ghcb_page);
 
-       if (hv_scheduler_type == HV_SCHEDULER_TYPE_ROOT)
-               memcpy(vp->vp_stats_pages, stats_pages, sizeof(stats_pages));
+       memcpy(vp->vp_stats_pages, stats_pages, sizeof(stats_pages));
 
        /*
         * Keep anon_inode_getfd last: it installs fd in the file struct and
@@ -1134,8 +1127,7 @@ put_partition:
 free_vp:
        kfree(vp);
 unmap_stats_pages:
-       if (hv_scheduler_type == HV_SCHEDULER_TYPE_ROOT)
-               mshv_vp_stats_unmap(partition->pt_id, args.vp_index, stats_pages);
+       mshv_vp_stats_unmap(partition->pt_id, args.vp_index, stats_pages);
 unmap_ghcb_page:
        if (mshv_partition_encrypted(partition) && is_ghcb_mapping_available())
                hv_unmap_vp_state_page(partition->pt_id, args.vp_index,
@@ -1755,9 +1747,8 @@ static void destroy_partition(struct mshv_partition *partition)
                        if (!vp)
                                continue;
 
-                       if (hv_scheduler_type == HV_SCHEDULER_TYPE_ROOT)
-                               mshv_vp_stats_unmap(partition->pt_id, vp->vp_index,
-                                                   vp->vp_stats_pages);
+                       mshv_vp_stats_unmap(partition->pt_id, vp->vp_index,
+                                           vp->vp_stats_pages);
 
                        if (vp->vp_register_page) {
                                (void)hv_unmap_vp_state_page(partition->pt_id,