Re: [PATCH] mshv: Add dedicated ioctl for GVA to GPA translation
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
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
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
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;

