[PATCH v2 4/5] mshv: Allocate vp state page for HVCALL_MAP_VP_STATE_PAGE on L1VH

Nuno Das Neves posted 5 patches 3 weeks ago
There is a newer version of this series
[PATCH v2 4/5] mshv: Allocate vp state page for HVCALL_MAP_VP_STATE_PAGE on L1VH
Posted by Nuno Das Neves 3 weeks ago
From: Jinank Jain <jinankjain@linux.microsoft.com>

Introduce mshv_use_overlay_gpfn() to check if a page needs to be
allocated and passed to the hypervisor to map VP state pages. This is
only needed on L1VH, and only on some (newer) versions of the
hypervisor, hence the need to check vmm_capabilities.

Introduce functions hv_map/unmap_vp_state_page() to handle the
allocation and freeing.

Signed-off-by: Jinank Jain <jinankjain@linux.microsoft.com>
Signed-off-by: Nuno Das Neves <nunodasneves@linux.microsoft.com>
Reviewed-by: Praveen K Paladugu <prapal@linux.microsoft.com>
Reviewed-by: Easwar Hariharan <easwar.hariharan@linux.microsoft.com>
---
 drivers/hv/mshv_root.h         | 11 +++---
 drivers/hv/mshv_root_hv_call.c | 61 +++++++++++++++++++++++++---
 drivers/hv/mshv_root_main.c    | 72 +++++++++++++++++-----------------
 3 files changed, 96 insertions(+), 48 deletions(-)

diff --git a/drivers/hv/mshv_root.h b/drivers/hv/mshv_root.h
index 0cb1e2589fe1..d7c9520ef788 100644
--- a/drivers/hv/mshv_root.h
+++ b/drivers/hv/mshv_root.h
@@ -279,11 +279,12 @@ int hv_call_set_vp_state(u32 vp_index, u64 partition_id,
 			 /* Choose between pages and bytes */
 			 struct hv_vp_state_data state_data, u64 page_count,
 			 struct page **pages, u32 num_bytes, u8 *bytes);
-int hv_call_map_vp_state_page(u64 partition_id, u32 vp_index, u32 type,
-			      union hv_input_vtl input_vtl,
-			      struct page **state_page);
-int hv_call_unmap_vp_state_page(u64 partition_id, u32 vp_index, u32 type,
-				union hv_input_vtl input_vtl);
+int hv_map_vp_state_page(u64 partition_id, u32 vp_index, u32 type,
+			 union hv_input_vtl input_vtl,
+			 struct page **state_page);
+int hv_unmap_vp_state_page(u64 partition_id, u32 vp_index, u32 type,
+			   void *page_addr,
+			   union hv_input_vtl input_vtl);
 int hv_call_create_port(u64 port_partition_id, union hv_port_id port_id,
 			u64 connection_partition_id, struct hv_port_info *port_info,
 			u8 port_vtl, u8 min_connection_vtl, int node);
diff --git a/drivers/hv/mshv_root_hv_call.c b/drivers/hv/mshv_root_hv_call.c
index 3fd3cce23f69..1132ba7b2399 100644
--- a/drivers/hv/mshv_root_hv_call.c
+++ b/drivers/hv/mshv_root_hv_call.c
@@ -526,9 +526,9 @@ int hv_call_set_vp_state(u32 vp_index, u64 partition_id,
 	return ret;
 }
 
-int hv_call_map_vp_state_page(u64 partition_id, u32 vp_index, u32 type,
-			      union hv_input_vtl input_vtl,
-			      struct page **state_page)
+static int hv_call_map_vp_state_page(u64 partition_id, u32 vp_index, u32 type,
+				     union hv_input_vtl input_vtl,
+				     struct page **state_page)
 {
 	struct hv_input_map_vp_state_page *input;
 	struct hv_output_map_vp_state_page *output;
@@ -547,7 +547,14 @@ int hv_call_map_vp_state_page(u64 partition_id, u32 vp_index, u32 type,
 		input->type = type;
 		input->input_vtl = input_vtl;
 
-		status = hv_do_hypercall(HVCALL_MAP_VP_STATE_PAGE, input, output);
+		if (*state_page) {
+			input->flags.map_location_provided = 1;
+			input->requested_map_location =
+				page_to_pfn(*state_page);
+		}
+
+		status = hv_do_hypercall(HVCALL_MAP_VP_STATE_PAGE, input,
+					 output);
 
 		if (hv_result(status) != HV_STATUS_INSUFFICIENT_MEMORY) {
 			if (hv_result_success(status))
@@ -565,8 +572,39 @@ int hv_call_map_vp_state_page(u64 partition_id, u32 vp_index, u32 type,
 	return ret;
 }
 
-int hv_call_unmap_vp_state_page(u64 partition_id, u32 vp_index, u32 type,
-				union hv_input_vtl input_vtl)
+static bool mshv_use_overlay_gpfn(void)
+{
+	return hv_l1vh_partition() &&
+	       mshv_root.vmm_caps.vmm_can_provide_overlay_gpfn;
+}
+
+int hv_map_vp_state_page(u64 partition_id, u32 vp_index, u32 type,
+			 union hv_input_vtl input_vtl,
+			 struct page **state_page)
+{
+	int ret = 0;
+	struct page *allocated_page = NULL;
+
+	if (mshv_use_overlay_gpfn()) {
+		allocated_page = alloc_page(GFP_KERNEL);
+		if (!allocated_page)
+			return -ENOMEM;
+		*state_page = allocated_page;
+	} else {
+		*state_page = NULL;
+	}
+
+	ret = hv_call_map_vp_state_page(partition_id, vp_index, type, input_vtl,
+					state_page);
+
+	if (ret && allocated_page)
+		__free_page(allocated_page);
+
+	return ret;
+}
+
+static int hv_call_unmap_vp_state_page(u64 partition_id, u32 vp_index, u32 type,
+				       union hv_input_vtl input_vtl)
 {
 	unsigned long flags;
 	u64 status;
@@ -590,6 +628,17 @@ int hv_call_unmap_vp_state_page(u64 partition_id, u32 vp_index, u32 type,
 	return hv_result_to_errno(status);
 }
 
+int hv_unmap_vp_state_page(u64 partition_id, u32 vp_index, u32 type,
+			   void *page_addr, union hv_input_vtl input_vtl)
+{
+	int ret = hv_call_unmap_vp_state_page(partition_id, vp_index, type, input_vtl);
+
+	if (mshv_use_overlay_gpfn() && page_addr)
+		__free_page(virt_to_page(page_addr));
+
+	return ret;
+}
+
 int hv_call_get_partition_property_ex(u64 partition_id, u64 property_code,
 				      u64 arg, void *property_value,
 				      size_t property_value_sz)
diff --git a/drivers/hv/mshv_root_main.c b/drivers/hv/mshv_root_main.c
index f7738cefbdf3..7352c4f9652e 100644
--- a/drivers/hv/mshv_root_main.c
+++ b/drivers/hv/mshv_root_main.c
@@ -908,28 +908,25 @@ mshv_partition_ioctl_create_vp(struct mshv_partition *partition,
 	if (ret)
 		return ret;
 
-	ret = hv_call_map_vp_state_page(partition->pt_id, args.vp_index,
-					HV_VP_STATE_PAGE_INTERCEPT_MESSAGE,
-					input_vtl_zero,
-					&intercept_message_page);
+	ret = hv_map_vp_state_page(partition->pt_id, args.vp_index,
+				   HV_VP_STATE_PAGE_INTERCEPT_MESSAGE,
+				   input_vtl_zero, &intercept_message_page);
 	if (ret)
 		goto destroy_vp;
 
 	if (!mshv_partition_encrypted(partition)) {
-		ret = hv_call_map_vp_state_page(partition->pt_id, args.vp_index,
-						HV_VP_STATE_PAGE_REGISTERS,
-						input_vtl_zero,
-						&register_page);
+		ret = hv_map_vp_state_page(partition->pt_id, args.vp_index,
+					   HV_VP_STATE_PAGE_REGISTERS,
+					   input_vtl_zero, &register_page);
 		if (ret)
 			goto unmap_intercept_message_page;
 	}
 
 	if (mshv_partition_encrypted(partition) &&
 	    is_ghcb_mapping_available()) {
-		ret = hv_call_map_vp_state_page(partition->pt_id, args.vp_index,
-						HV_VP_STATE_PAGE_GHCB,
-						input_vtl_normal,
-						&ghcb_page);
+		ret = hv_map_vp_state_page(partition->pt_id, args.vp_index,
+					   HV_VP_STATE_PAGE_GHCB,
+					   input_vtl_normal, &ghcb_page);
 		if (ret)
 			goto unmap_register_page;
 	}
@@ -993,21 +990,19 @@ mshv_partition_ioctl_create_vp(struct mshv_partition *partition,
 	if (hv_scheduler_type == HV_SCHEDULER_TYPE_ROOT)
 		mshv_vp_stats_unmap(partition->pt_id, args.vp_index);
 unmap_ghcb_page:
-	if (mshv_partition_encrypted(partition) && is_ghcb_mapping_available()) {
-		hv_call_unmap_vp_state_page(partition->pt_id, args.vp_index,
-					    HV_VP_STATE_PAGE_GHCB,
-					    input_vtl_normal);
-	}
+	if (mshv_partition_encrypted(partition) && is_ghcb_mapping_available())
+		hv_unmap_vp_state_page(partition->pt_id, args.vp_index,
+				       HV_VP_STATE_PAGE_GHCB, vp->vp_ghcb_page,
+				       input_vtl_normal);
 unmap_register_page:
-	if (!mshv_partition_encrypted(partition)) {
-		hv_call_unmap_vp_state_page(partition->pt_id, args.vp_index,
-					    HV_VP_STATE_PAGE_REGISTERS,
-					    input_vtl_zero);
-	}
+	if (!mshv_partition_encrypted(partition))
+		hv_unmap_vp_state_page(partition->pt_id, args.vp_index,
+				       HV_VP_STATE_PAGE_REGISTERS,
+				       vp->vp_register_page, input_vtl_zero);
 unmap_intercept_message_page:
-	hv_call_unmap_vp_state_page(partition->pt_id, args.vp_index,
-				    HV_VP_STATE_PAGE_INTERCEPT_MESSAGE,
-				    input_vtl_zero);
+	hv_unmap_vp_state_page(partition->pt_id, args.vp_index,
+			       HV_VP_STATE_PAGE_INTERCEPT_MESSAGE,
+			       vp->vp_intercept_msg_page, input_vtl_zero);
 destroy_vp:
 	hv_call_delete_vp(partition->pt_id, args.vp_index);
 	return ret;
@@ -1748,24 +1743,27 @@ static void destroy_partition(struct mshv_partition *partition)
 				mshv_vp_stats_unmap(partition->pt_id, vp->vp_index);
 
 			if (vp->vp_register_page) {
-				(void)hv_call_unmap_vp_state_page(partition->pt_id,
-								  vp->vp_index,
-								  HV_VP_STATE_PAGE_REGISTERS,
-								  input_vtl_zero);
+				(void)hv_unmap_vp_state_page(partition->pt_id,
+							     vp->vp_index,
+							     HV_VP_STATE_PAGE_REGISTERS,
+							     vp->vp_register_page,
+							     input_vtl_zero);
 				vp->vp_register_page = NULL;
 			}
 
-			(void)hv_call_unmap_vp_state_page(partition->pt_id,
-							  vp->vp_index,
-							  HV_VP_STATE_PAGE_INTERCEPT_MESSAGE,
-							  input_vtl_zero);
+			(void)hv_unmap_vp_state_page(partition->pt_id,
+						     vp->vp_index,
+						     HV_VP_STATE_PAGE_INTERCEPT_MESSAGE,
+						     vp->vp_intercept_msg_page,
+						     input_vtl_zero);
 			vp->vp_intercept_msg_page = NULL;
 
 			if (vp->vp_ghcb_page) {
-				(void)hv_call_unmap_vp_state_page(partition->pt_id,
-								  vp->vp_index,
-								  HV_VP_STATE_PAGE_GHCB,
-								  input_vtl_normal);
+				(void)hv_unmap_vp_state_page(partition->pt_id,
+							     vp->vp_index,
+							     HV_VP_STATE_PAGE_GHCB,
+							     vp->vp_ghcb_page,
+							     input_vtl_normal);
 				vp->vp_ghcb_page = NULL;
 			}
 
-- 
2.34.1
Re: [PATCH v2 4/5] mshv: Allocate vp state page for HVCALL_MAP_VP_STATE_PAGE on L1VH
Posted by kernel test robot 3 weeks ago
Hi Nuno,

kernel test robot noticed the following build warnings:

[auto build test WARNING on linus/master]
[also build test WARNING on v6.17-rc5 next-20250911]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/Nuno-Das-Neves/mshv-Only-map-vp-vp_stats_pages-if-on-root-scheduler/20250911-071732
base:   linus/master
patch link:    https://lore.kernel.org/r/1757546089-2002-5-git-send-email-nunodasneves%40linux.microsoft.com
patch subject: [PATCH v2 4/5] mshv: Allocate vp state page for HVCALL_MAP_VP_STATE_PAGE on L1VH
config: x86_64-randconfig-072-20250911 (https://download.01.org/0day-ci/archive/20250912/202509120214.YMomVkdP-lkp@intel.com/config)
compiler: clang version 20.1.8 (https://github.com/llvm/llvm-project 87f0227cb60147a26a1eeb4fb06e3b505e9c7261)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20250912/202509120214.YMomVkdP-lkp@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202509120214.YMomVkdP-lkp@intel.com/

All warnings (new ones prefixed by >>):

>> drivers/hv/mshv_root_main.c:966:7: warning: variable 'vp' is used uninitialized whenever 'if' condition is true [-Wsometimes-uninitialized]
     966 |                 if (ret)
         |                     ^~~
   drivers/hv/mshv_root_main.c:1030:11: note: uninitialized use occurs here
    1030 |                                vp->vp_intercept_msg_page, input_vtl_zero);
         |                                ^~
   drivers/hv/mshv_root_main.c:966:3: note: remove the 'if' if its condition is always false
     966 |                 if (ret)
         |                 ^~~~~~~~
     967 |                         goto unmap_ghcb_page;
         |                         ~~~~~~~~~~~~~~~~~~~~
   drivers/hv/mshv_root_main.c:955:7: warning: variable 'vp' is used uninitialized whenever 'if' condition is true [-Wsometimes-uninitialized]
     955 |                 if (ret)
         |                     ^~~
   drivers/hv/mshv_root_main.c:1030:11: note: uninitialized use occurs here
    1030 |                                vp->vp_intercept_msg_page, input_vtl_zero);
         |                                ^~
   drivers/hv/mshv_root_main.c:955:3: note: remove the 'if' if its condition is always false
     955 |                 if (ret)
         |                 ^~~~~~~~
     956 |                         goto unmap_register_page;
         |                         ~~~~~~~~~~~~~~~~~~~~~~~~
   drivers/hv/mshv_root_main.c:946:7: warning: variable 'vp' is used uninitialized whenever 'if' condition is true [-Wsometimes-uninitialized]
     946 |                 if (ret)
         |                     ^~~
   drivers/hv/mshv_root_main.c:1030:11: note: uninitialized use occurs here
    1030 |                                vp->vp_intercept_msg_page, input_vtl_zero);
         |                                ^~
   drivers/hv/mshv_root_main.c:946:3: note: remove the 'if' if its condition is always false
     946 |                 if (ret)
         |                 ^~~~~~~~
     947 |                         goto unmap_intercept_message_page;
         |                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   drivers/hv/mshv_root_main.c:917:20: note: initialize the variable 'vp' to silence this warning
     917 |         struct mshv_vp *vp;
         |                           ^
         |                            = NULL
   drivers/hv/mshv_root_main.c:41:20: warning: unused function 'hv_parent_partition' [-Wunused-function]
      41 | static inline bool hv_parent_partition(void)
         |                    ^~~~~~~~~~~~~~~~~~~
   4 warnings generated.


vim +966 drivers/hv/mshv_root_main.c

621191d709b1488 Nuno Das Neves 2025-03-14   911  
621191d709b1488 Nuno Das Neves 2025-03-14   912  static long
621191d709b1488 Nuno Das Neves 2025-03-14   913  mshv_partition_ioctl_create_vp(struct mshv_partition *partition,
621191d709b1488 Nuno Das Neves 2025-03-14   914  			       void __user *arg)
621191d709b1488 Nuno Das Neves 2025-03-14   915  {
621191d709b1488 Nuno Das Neves 2025-03-14   916  	struct mshv_create_vp args;
621191d709b1488 Nuno Das Neves 2025-03-14   917  	struct mshv_vp *vp;
621191d709b1488 Nuno Das Neves 2025-03-14   918  	struct page *intercept_message_page, *register_page, *ghcb_page;
621191d709b1488 Nuno Das Neves 2025-03-14   919  	void *stats_pages[2];
621191d709b1488 Nuno Das Neves 2025-03-14   920  	long ret;
621191d709b1488 Nuno Das Neves 2025-03-14   921  
621191d709b1488 Nuno Das Neves 2025-03-14   922  	if (copy_from_user(&args, arg, sizeof(args)))
621191d709b1488 Nuno Das Neves 2025-03-14   923  		return -EFAULT;
621191d709b1488 Nuno Das Neves 2025-03-14   924  
621191d709b1488 Nuno Das Neves 2025-03-14   925  	if (args.vp_index >= MSHV_MAX_VPS)
621191d709b1488 Nuno Das Neves 2025-03-14   926  		return -EINVAL;
621191d709b1488 Nuno Das Neves 2025-03-14   927  
621191d709b1488 Nuno Das Neves 2025-03-14   928  	if (partition->pt_vp_array[args.vp_index])
621191d709b1488 Nuno Das Neves 2025-03-14   929  		return -EEXIST;
621191d709b1488 Nuno Das Neves 2025-03-14   930  
621191d709b1488 Nuno Das Neves 2025-03-14   931  	ret = hv_call_create_vp(NUMA_NO_NODE, partition->pt_id, args.vp_index,
621191d709b1488 Nuno Das Neves 2025-03-14   932  				0 /* Only valid for root partition VPs */);
621191d709b1488 Nuno Das Neves 2025-03-14   933  	if (ret)
621191d709b1488 Nuno Das Neves 2025-03-14   934  		return ret;
621191d709b1488 Nuno Das Neves 2025-03-14   935  
debba2f23756254 Jinank Jain    2025-09-10   936  	ret = hv_map_vp_state_page(partition->pt_id, args.vp_index,
621191d709b1488 Nuno Das Neves 2025-03-14   937  				   HV_VP_STATE_PAGE_INTERCEPT_MESSAGE,
debba2f23756254 Jinank Jain    2025-09-10   938  				   input_vtl_zero, &intercept_message_page);
621191d709b1488 Nuno Das Neves 2025-03-14   939  	if (ret)
621191d709b1488 Nuno Das Neves 2025-03-14   940  		goto destroy_vp;
621191d709b1488 Nuno Das Neves 2025-03-14   941  
621191d709b1488 Nuno Das Neves 2025-03-14   942  	if (!mshv_partition_encrypted(partition)) {
debba2f23756254 Jinank Jain    2025-09-10   943  		ret = hv_map_vp_state_page(partition->pt_id, args.vp_index,
621191d709b1488 Nuno Das Neves 2025-03-14   944  					   HV_VP_STATE_PAGE_REGISTERS,
debba2f23756254 Jinank Jain    2025-09-10   945  					   input_vtl_zero, &register_page);
621191d709b1488 Nuno Das Neves 2025-03-14   946  		if (ret)
621191d709b1488 Nuno Das Neves 2025-03-14   947  			goto unmap_intercept_message_page;
621191d709b1488 Nuno Das Neves 2025-03-14   948  	}
621191d709b1488 Nuno Das Neves 2025-03-14   949  
621191d709b1488 Nuno Das Neves 2025-03-14   950  	if (mshv_partition_encrypted(partition) &&
621191d709b1488 Nuno Das Neves 2025-03-14   951  	    is_ghcb_mapping_available()) {
debba2f23756254 Jinank Jain    2025-09-10   952  		ret = hv_map_vp_state_page(partition->pt_id, args.vp_index,
621191d709b1488 Nuno Das Neves 2025-03-14   953  					   HV_VP_STATE_PAGE_GHCB,
debba2f23756254 Jinank Jain    2025-09-10   954  					   input_vtl_normal, &ghcb_page);
621191d709b1488 Nuno Das Neves 2025-03-14   955  		if (ret)
621191d709b1488 Nuno Das Neves 2025-03-14   956  			goto unmap_register_page;
621191d709b1488 Nuno Das Neves 2025-03-14   957  	}
621191d709b1488 Nuno Das Neves 2025-03-14   958  
1af6cc3b10421f1 Nuno Das Neves 2025-09-10   959  	/*
1af6cc3b10421f1 Nuno Das Neves 2025-09-10   960  	 * This mapping of the stats page is for detecting if dispatch thread
1af6cc3b10421f1 Nuno Das Neves 2025-09-10   961  	 * is blocked - only relevant for root scheduler
1af6cc3b10421f1 Nuno Das Neves 2025-09-10   962  	 */
1af6cc3b10421f1 Nuno Das Neves 2025-09-10   963  	if (hv_scheduler_type == HV_SCHEDULER_TYPE_ROOT) {
621191d709b1488 Nuno Das Neves 2025-03-14   964  		ret = mshv_vp_stats_map(partition->pt_id, args.vp_index,
621191d709b1488 Nuno Das Neves 2025-03-14   965  					stats_pages);
621191d709b1488 Nuno Das Neves 2025-03-14  @966  		if (ret)
621191d709b1488 Nuno Das Neves 2025-03-14   967  			goto unmap_ghcb_page;
621191d709b1488 Nuno Das Neves 2025-03-14   968  	}
621191d709b1488 Nuno Das Neves 2025-03-14   969  
621191d709b1488 Nuno Das Neves 2025-03-14   970  	vp = kzalloc(sizeof(*vp), GFP_KERNEL);
621191d709b1488 Nuno Das Neves 2025-03-14   971  	if (!vp)
621191d709b1488 Nuno Das Neves 2025-03-14   972  		goto unmap_stats_pages;
621191d709b1488 Nuno Das Neves 2025-03-14   973  
621191d709b1488 Nuno Das Neves 2025-03-14   974  	vp->vp_partition = mshv_partition_get(partition);
621191d709b1488 Nuno Das Neves 2025-03-14   975  	if (!vp->vp_partition) {
621191d709b1488 Nuno Das Neves 2025-03-14   976  		ret = -EBADF;
621191d709b1488 Nuno Das Neves 2025-03-14   977  		goto free_vp;
621191d709b1488 Nuno Das Neves 2025-03-14   978  	}
621191d709b1488 Nuno Das Neves 2025-03-14   979  
621191d709b1488 Nuno Das Neves 2025-03-14   980  	mutex_init(&vp->vp_mutex);
621191d709b1488 Nuno Das Neves 2025-03-14   981  	init_waitqueue_head(&vp->run.vp_suspend_queue);
621191d709b1488 Nuno Das Neves 2025-03-14   982  	atomic64_set(&vp->run.vp_signaled_count, 0);
621191d709b1488 Nuno Das Neves 2025-03-14   983  
621191d709b1488 Nuno Das Neves 2025-03-14   984  	vp->vp_index = args.vp_index;
621191d709b1488 Nuno Das Neves 2025-03-14   985  	vp->vp_intercept_msg_page = page_to_virt(intercept_message_page);
621191d709b1488 Nuno Das Neves 2025-03-14   986  	if (!mshv_partition_encrypted(partition))
621191d709b1488 Nuno Das Neves 2025-03-14   987  		vp->vp_register_page = page_to_virt(register_page);
621191d709b1488 Nuno Das Neves 2025-03-14   988  
621191d709b1488 Nuno Das Neves 2025-03-14   989  	if (mshv_partition_encrypted(partition) && is_ghcb_mapping_available())
621191d709b1488 Nuno Das Neves 2025-03-14   990  		vp->vp_ghcb_page = page_to_virt(ghcb_page);
621191d709b1488 Nuno Das Neves 2025-03-14   991  
1af6cc3b10421f1 Nuno Das Neves 2025-09-10   992  	if (hv_scheduler_type == HV_SCHEDULER_TYPE_ROOT)
621191d709b1488 Nuno Das Neves 2025-03-14   993  		memcpy(vp->vp_stats_pages, stats_pages, sizeof(stats_pages));
621191d709b1488 Nuno Das Neves 2025-03-14   994  
621191d709b1488 Nuno Das Neves 2025-03-14   995  	/*
621191d709b1488 Nuno Das Neves 2025-03-14   996  	 * Keep anon_inode_getfd last: it installs fd in the file struct and
621191d709b1488 Nuno Das Neves 2025-03-14   997  	 * thus makes the state accessible in user space.
621191d709b1488 Nuno Das Neves 2025-03-14   998  	 */
621191d709b1488 Nuno Das Neves 2025-03-14   999  	ret = anon_inode_getfd("mshv_vp", &mshv_vp_fops, vp,
621191d709b1488 Nuno Das Neves 2025-03-14  1000  			       O_RDWR | O_CLOEXEC);
621191d709b1488 Nuno Das Neves 2025-03-14  1001  	if (ret < 0)
621191d709b1488 Nuno Das Neves 2025-03-14  1002  		goto put_partition;
621191d709b1488 Nuno Das Neves 2025-03-14  1003  
621191d709b1488 Nuno Das Neves 2025-03-14  1004  	/* already exclusive with the partition mutex for all ioctls */
621191d709b1488 Nuno Das Neves 2025-03-14  1005  	partition->pt_vp_count++;
621191d709b1488 Nuno Das Neves 2025-03-14  1006  	partition->pt_vp_array[args.vp_index] = vp;
621191d709b1488 Nuno Das Neves 2025-03-14  1007  
621191d709b1488 Nuno Das Neves 2025-03-14  1008  	return ret;
621191d709b1488 Nuno Das Neves 2025-03-14  1009  
621191d709b1488 Nuno Das Neves 2025-03-14  1010  put_partition:
621191d709b1488 Nuno Das Neves 2025-03-14  1011  	mshv_partition_put(partition);
621191d709b1488 Nuno Das Neves 2025-03-14  1012  free_vp:
621191d709b1488 Nuno Das Neves 2025-03-14  1013  	kfree(vp);
621191d709b1488 Nuno Das Neves 2025-03-14  1014  unmap_stats_pages:
1af6cc3b10421f1 Nuno Das Neves 2025-09-10  1015  	if (hv_scheduler_type == HV_SCHEDULER_TYPE_ROOT)
621191d709b1488 Nuno Das Neves 2025-03-14  1016  		mshv_vp_stats_unmap(partition->pt_id, args.vp_index);
621191d709b1488 Nuno Das Neves 2025-03-14  1017  unmap_ghcb_page:
debba2f23756254 Jinank Jain    2025-09-10  1018  	if (mshv_partition_encrypted(partition) && is_ghcb_mapping_available())
debba2f23756254 Jinank Jain    2025-09-10  1019  		hv_unmap_vp_state_page(partition->pt_id, args.vp_index,
debba2f23756254 Jinank Jain    2025-09-10  1020  				       HV_VP_STATE_PAGE_GHCB, vp->vp_ghcb_page,
621191d709b1488 Nuno Das Neves 2025-03-14  1021  				       input_vtl_normal);
621191d709b1488 Nuno Das Neves 2025-03-14  1022  unmap_register_page:
debba2f23756254 Jinank Jain    2025-09-10  1023  	if (!mshv_partition_encrypted(partition))
debba2f23756254 Jinank Jain    2025-09-10  1024  		hv_unmap_vp_state_page(partition->pt_id, args.vp_index,
621191d709b1488 Nuno Das Neves 2025-03-14  1025  				       HV_VP_STATE_PAGE_REGISTERS,
debba2f23756254 Jinank Jain    2025-09-10  1026  				       vp->vp_register_page, input_vtl_zero);
621191d709b1488 Nuno Das Neves 2025-03-14  1027  unmap_intercept_message_page:
debba2f23756254 Jinank Jain    2025-09-10  1028  	hv_unmap_vp_state_page(partition->pt_id, args.vp_index,
621191d709b1488 Nuno Das Neves 2025-03-14  1029  			       HV_VP_STATE_PAGE_INTERCEPT_MESSAGE,
debba2f23756254 Jinank Jain    2025-09-10  1030  			       vp->vp_intercept_msg_page, input_vtl_zero);
621191d709b1488 Nuno Das Neves 2025-03-14  1031  destroy_vp:
621191d709b1488 Nuno Das Neves 2025-03-14  1032  	hv_call_delete_vp(partition->pt_id, args.vp_index);
621191d709b1488 Nuno Das Neves 2025-03-14  1033  	return ret;
621191d709b1488 Nuno Das Neves 2025-03-14  1034  }
621191d709b1488 Nuno Das Neves 2025-03-14  1035  

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki