Re: [PATCH] mshv: Add dedicated ioctl for GVA to GPA translation

2026-05-02 Thread kernel test robot
Hi Stanislav,

kernel test robot noticed the following build warnings:

[auto build test WARNING on linus/master]
[also build test WARNING on v7.1-rc1 next-20260430]
[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/Stanislav-Kinsburskii/mshv-Add-dedicated-ioctl-for-GVA-to-GPA-translation/20260429-094326
base:   linus/master
patch link:
https://lore.kernel.org/r/177741648871.626779.11067281081219290277.stgit%40skinsburskii-cloud-desktop.internal.cloudapp.net
patch subject: [PATCH] mshv: Add dedicated ioctl for GVA to GPA translation
config: x86_64-randconfig-123-20260430 
(https://download.01.org/0day-ci/archive/20260502/[email protected]/config)
compiler: gcc-14 (Debian 14.2.0-19) 14.2.0
sparse: v0.6.5-rc1
reproduce (this is a W=1 build): 
(https://download.01.org/0day-ci/archive/20260502/[email protected]/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 
| Closes: 
https://lore.kernel.org/oe-kbuild-all/[email protected]/

sparse warnings: (new ones prefixed by >>)
>> drivers/hv/mshv_root_main.c:958:30: sparse: sparse: incorrect type in 
>> argument 1 (different address spaces) @@ expected void [noderef] __user 
>> *to @@ got unsigned int enum hv_translate_gva_result_code *[addressable] 
>> result @@
   drivers/hv/mshv_root_main.c:958:30: sparse: expected void [noderef] 
__user *to
   drivers/hv/mshv_root_main.c:958:30: sparse: got unsigned int enum 
hv_translate_gva_result_code *[addressable] result
>> drivers/hv/mshv_root_main.c:961:30: sparse: sparse: incorrect type in 
>> argument 1 (different address spaces) @@ expected void [noderef] __user 
>> *to @@ got unsigned long long [usertype] *[addressable] gpa @@
   drivers/hv/mshv_root_main.c:961:30: sparse: expected void [noderef] 
__user *to
   drivers/hv/mshv_root_main.c:961:30: sparse: got unsigned long long 
[usertype] *[addressable] gpa

vim +958 drivers/hv/mshv_root_main.c

   913  
   914  static long
   915  mshv_vp_ioctl_translate_gva(struct mshv_vp *vp, void __user *user_args)
   916  {
   917  struct mshv_partition *partition = vp->vp_partition;
   918  struct mshv_translate_gva args;
   919  struct hv_translate_gva_result_ex result;
   920  u64 gfn, gpa;
   921  int ret;
   922  
   923  if (copy_from_user(&args, user_args, sizeof(args)))
   924  return -EFAULT;
   925  
   926  do {
   927  ret = hv_call_translate_virtual_address_ex(vp->vp_index,
   928 
partition->pt_id,
   929 args.flags, 
args.gva,
   930 &gfn, 
&result);
   931  if (ret)
   932  return ret;
   933  
   934  if (mshv_gpa_fault_retryable(result.result_code)) {
   935  struct mshv_mem_region *region;
   936  bool faulted;
   937  
   938  region = 
mshv_partition_region_by_gfn_get(partition,
   939gfn);
   940  if (!region)
   941  return -EFAULT;
   942  
   943  faulted = false;
   944  if (region->mreg_type == 
MSHV_REGION_TYPE_MEM_MOVABLE)
   945  faulted = 
mshv_region_handle_gfn_fault(region,
   946 
gfn);
   947  mshv_region_put(region);
   948  
   949  if (!faulted)
   950  return -EFAULT;
   951  
   952  cond_resched();
   953  }
   954  } while (mshv_gpa_fault_retryable(result.result_code));
   955  
   956  gpa = (gfn << PAGE_SHIFT) | (args.gva & ~PAGE_MASK);
   957  
 > 958  if (copy_to_user(args.result, &result, sizeof(*args.result)))
   959  return -EFAULT;
   960  
 > 961  if (copy_to_user(args.gpa, &gpa, sizeof(*args.gpa)))
   962  return -EFAULT;
   963  
   964  return 0;
   965  }
   966  

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



Re: [PATCH] mshv: Add dedicated ioctl for GVA to GPA translation

2026-04-29 Thread kernel test robot
Hi Stanislav,

kernel test robot noticed the following build errors:

[auto build test ERROR on linus/master]
[also build test ERROR on v7.1-rc1 next-20260429]
[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/Stanislav-Kinsburskii/mshv-Add-dedicated-ioctl-for-GVA-to-GPA-translation/20260429-094326
base:   linus/master
patch link:
https://lore.kernel.org/r/177741648871.626779.11067281081219290277.stgit%40skinsburskii-cloud-desktop.internal.cloudapp.net
patch subject: [PATCH] mshv: Add dedicated ioctl for GVA to GPA translation
config: x86_64-buildonly-randconfig-005-20260430 
(https://download.01.org/0day-ci/archive/20260430/[email protected]/config)
compiler: gcc-14 (Debian 14.2.0-19) 14.2.0
reproduce (this is a W=1 build): 
(https://download.01.org/0day-ci/archive/20260430/[email protected]/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 
| Closes: 
https://lore.kernel.org/oe-kbuild-all/[email protected]/

All errors (new ones prefixed by >>):

   In file included from :
>> ./usr/include/linux/mshv.h:325:14: error: use of enum 
>> 'hv_translate_gva_result_code' without previous declaration
 325 | enum hv_translate_gva_result_code *result;
 |  ^~~~

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



Re: [PATCH] mshv: Add dedicated ioctl for GVA to GPA translation

2026-04-29 Thread kernel test robot
Hi Stanislav,

kernel test robot noticed the following build errors:

[auto build test ERROR on linus/master]
[also build test ERROR on v7.1-rc1 next-20260429]
[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/Stanislav-Kinsburskii/mshv-Add-dedicated-ioctl-for-GVA-to-GPA-translation/20260429-094326
base:   linus/master
patch link:
https://lore.kernel.org/r/177741648871.626779.11067281081219290277.stgit%40skinsburskii-cloud-desktop.internal.cloudapp.net
patch subject: [PATCH] mshv: Add dedicated ioctl for GVA to GPA translation
config: x86_64-rhel-9.4 
(https://download.01.org/0day-ci/archive/20260429/[email protected]/config)
compiler: gcc-14 (Debian 14.2.0-19) 14.2.0
reproduce (this is a W=1 build): 
(https://download.01.org/0day-ci/archive/20260429/[email protected]/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 
| Closes: 
https://lore.kernel.org/oe-kbuild-all/[email protected]/

All errors (new ones prefixed by >>):

   In file included from :
>> ./usr/include/linux/mshv.h:325:14: error: use of enum 
>> 'hv_translate_gva_result_code' without previous declaration
 325 | enum hv_translate_gva_result_code *result;
 |  ^~~~

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



Re: [PATCH] mshv: Add dedicated ioctl for GVA to GPA translation

2026-04-29 Thread Anirudh Rayabharam
On Tue, Apr 28, 2026 at 10:48:24PM +, Stanislav Kinsburskii wrote:
> Add an MSHV_TRANSLATE_GVA ioctl on the VP fd that wraps
> HVCALL_TRANSLATE_VIRTUAL_ADDRESS_EX with transparent fault-in handling for
> movable memory regions. The passthrough path for this hypercall is retained
> for backward compatibility.
> 
> When guest-backing pages reside in movable memory regions, the mmu_notifier
> invalidation path remaps them to NO_ACCESS in the hypervisor's second-level
> address translation tables. If the VMM issues a GVA translation (e.g.
> during MMIO emulation) while a page-table page is invalidated, the
> hypervisor returns HV_TRANSLATE_GVA_GPA_NO_READ_ACCESS. The VMM cannot
> resolve this on its own.
> 
> The new ioctl detects this transient GPA access failure, faults the page
> back in via mshv_region_handle_gfn_fault(), and retries the translation
> until it succeeds or an unrecoverable error occurs.
> 
> Signed-off-by: Stanislav Kinsburskii 
> ---
>  drivers/hv/mshv_root.h |3 ++
>  drivers/hv/mshv_root_hv_call.c |   37 +
>  drivers/hv/mshv_root_main.c|   69 
> 
>  include/hyperv/hvgdk_mini.h|1 +
>  include/hyperv/hvhdk.h |   41 
>  include/uapi/linux/mshv.h  |   10 ++
>  6 files changed, 161 insertions(+)
> 
> diff --git a/drivers/hv/mshv_root.h b/drivers/hv/mshv_root.h
> index 1f086dcb7aa1a..2e6c4414740cc 100644
> --- a/drivers/hv/mshv_root.h
> +++ b/drivers/hv/mshv_root.h
> @@ -290,6 +290,9 @@ int hv_call_delete_vp(u64 partition_id, u32 vp_index);
>  int hv_call_assert_virtual_interrupt(u64 partition_id, u32 vector,
>u64 dest_addr,
>union hv_interrupt_control control);
> +int hv_call_translate_virtual_address_ex(u32 vp_index, u64 partition_id,
> +  u64 flags, u64 gva, u64 *gfn,
> +  struct hv_translate_gva_result_ex 
> *result);
>  int hv_call_clear_virtual_interrupt(u64 partition_id);
>  int hv_call_get_gpa_access_states(u64 partition_id, u32 count, u64 
> gpa_base_pfn,
> union hv_gpa_page_access_state_flags 
> state_flags,
> diff --git a/drivers/hv/mshv_root_hv_call.c b/drivers/hv/mshv_root_hv_call.c
> index e5992c324904a..9ff4ba5373f59 100644
> --- a/drivers/hv/mshv_root_hv_call.c
> +++ b/drivers/hv/mshv_root_hv_call.c
> @@ -692,6 +692,43 @@ int hv_call_get_partition_property_ex(u64 partition_id, 
> u64 property_code,
>   return 0;
>  }
>  
> +int hv_call_translate_virtual_address_ex(u32 vp_index, u64 partition_id,
> +  u64 flags, u64 gva, u64 *gfn,
> +  struct hv_translate_gva_result_ex 
> *result)
> +{
> + struct hv_input_translate_virtual_address *input;
> + struct hv_output_translate_virtual_address_ex *output;
> + unsigned long irq_flags;
> + u64 status;
> +
> + local_irq_save(irq_flags);
> +
> + input = *this_cpu_ptr(hyperv_pcpu_input_arg);
> + output = *this_cpu_ptr(hyperv_pcpu_output_arg);
> +
> + memset(input, 0, sizeof(*input));
> + input->partition_id = partition_id;
> + input->vp_index = vp_index;
> + input->control_flags = flags;
> + input->gva_page = gva >> HV_HYP_PAGE_SHIFT;
> +
> + status = hv_do_hypercall(HVCALL_TRANSLATE_VIRTUAL_ADDRESS_EX,
> +  input, output);
> +
> + if (!hv_result_success(status)) {
> + local_irq_restore(irq_flags);
> + pr_err("%s: %s\n", __func__, hv_result_to_string(status));
> + return hv_result_to_errno(status);
> + }
> +
> + *result = output->translation_result;
> + *gfn = output->gpa_page;
> +
> + local_irq_restore(irq_flags);
> +
> + return 0;
> +}
> +
>  int
>  hv_call_clear_virtual_interrupt(u64 partition_id)
>  {
> diff --git a/drivers/hv/mshv_root_main.c b/drivers/hv/mshv_root_main.c
> index bd1359eb58dd4..2d7b6923415a8 100644
> --- a/drivers/hv/mshv_root_main.c
> +++ b/drivers/hv/mshv_root_main.c
> @@ -898,6 +898,72 @@ mshv_vp_ioctl_get_set_state(struct mshv_vp *vp,
>   return 0;
>  }
>  
> +static bool mshv_gpa_fault_retryable(u32 result_code)
> +{
> + /*
> +  * Note: HV_TRANSLATE_GVA_GPA_UNMAPPED is intentionally not handled
> +  * here. The guest page table cannot be unmapped under normal
> +  * operation. It may be mapped with no access during page moves,
> +  * but a truly unmapped state indicates a kernel driver bug.
> +  * Retrying in this case would only mask the underlying problem of
> +  * an unmapped guest page table.
> +  */
> + return result_code == HV_TRANSLATE_GVA_GPA_NO_READ_ACCESS;
> +}
> +
> +static long
> +mshv_vp_ioctl_translate_gva(struct mshv_vp *vp, void __user *user_args)
> +{
> + struct mshv_partition *partition = vp->vp_partition;
> + struct mshv_translate_gva args;