drivers/hv/Kconfig | 22 + drivers/hv/Makefile | 7 +- drivers/hv/hv.c | 3 + drivers/hv/hyperv_vmbus.h | 1 + drivers/hv/mshv_vtl.h | 52 ++ drivers/hv/mshv_vtl_main.c | 1508 +++++++++++++++++++++++++++++++++++ drivers/hv/vmbus_drv.c | 4 +- include/hyperv/hvgdk_mini.h | 106 +++ include/uapi/linux/mshv.h | 80 ++ 9 files changed, 1781 insertions(+), 2 deletions(-) create mode 100644 drivers/hv/mshv_vtl.h create mode 100644 drivers/hv/mshv_vtl_main.c
Introduce a new mshv_vtl driver to provide an interface for Virtual Machine Monitor like OpenVMM and its use as OpenHCL paravisor to control VTL0 (Virtual trust Level). Expose devices and support IOCTLs for features like VTL creation, VTL0 memory management, context switch, making hypercalls, mapping VTL0 address space to VTL2 userspace, getting new VMBus messages and channel events in VTL2 etc. OpenVMM : https://openvmm.dev/guide/ Changes since v5: https://lore.kernel.org/all/20250611072704.83199-1-namjain@linux.microsoft.com/ Addressed Michael Kelley's suggestions: * Added "depends on HYPERV_VTL_MODE", removed "depends on HYPERV" in Kconfig * Removed unused macro MAX_GUEST_MEM_SIZE * Made macro dependency explicit: MSHV_PG_OFF_CPU_MASK and MSHV_REAL_OFF_SHIFT * Refactored and corrected how allow_bitmap is used and defined. Removed PAGE_SIZE dependency. * Added __packed for structure definitions wherever it was missing. * Moved hv_register_vsm_* union definitions to hvgdk_mini.h, kept mshv_synic_overlay_page_msr in the driver, renamed it and added a comment. (Nuno) * Introduced global variables input_vtl_zero and input_vtl_normal and used them everywhere these were defined locally * s/"page_to_phys(reg_page) >> HV_HYP_PAGE_SHIFT"/"page_to_hvpfn(reg_page)" in mshv_vtl_configure_reg_page * Refactored mshv_vtl_vmbus_isr() to reduce complexity in finding and resetting bits similar to how vmbus_chan_sched is implemented. * Used __get_free_page() instead in mshv_vtl_alloc_context() * Added fallback hv_setup_vmbus_handler(vmbus_isr) in hv_vtl_setup_synic() and in hv_vtl_remove_synic(). * Maintained symmetry of functions in hv_vtl_remove_synic * Added a note for explanation of excluding last PFN in the range provided in mshv_vtl_ioctl_add_vtl0_mem() * Added comments for hotplug being not supported, wherever cpu_online() was used to check if CPU is online or not. * Added a check for input.cpu to make sure it's less than nr_cpu_ids in mshv_vtl_ioctl_set_poll_file() * Removed switch-case and implemented static tables in mshv_vtl_(get|set)_reg for reducing LOC * Simplified mshv_vtl_ioctl_(get|set)_regs to process one register at a time, and fixed earlier bug with array of registers processing. * Used hv_result_to_errno() in mshv_vtl_sint_ioctl_signal_event() * Added a READ_ONCE() while reading old_eventfd in mshv_vtl_sint_ioctl_set_eventfd() * Renamed mshv_vtl_hvcall and mshv_vtl_hvcall_setup to remove ambiguity * Took care of latest mm patches regarding PFN_DEV, pfn_t deprecation * Few other minor changes while reorganizing code. Addressed Markus Elfring's suggestions: * Used guard(mutex) for better mutex handling. Changes since v4: https://lore.kernel.org/all/20250610052435.1660967-1-namjain@linux.microsoft.com/ * Fixed warnings from kernel test robot for missing export.h when the kernel is compiled with W=1 option. Some recent changes in kernel flags these warnings and that's why it was not seen in previous runs. Warnings in other Hyper-V drivers will be fixed separately. * No functional changes Changes since v3: https://lore.kernel.org/all/20250519045642.50609-1-namjain@linux.microsoft.com/ Addressed Stanislav's, Nuno's comments. * Change data types for different variables, excluding the ones in uapi headers * Added comment for the need of HUGEPAGES config in Kconfig. * generalized new IOCTL names by removing VTL in their name. * Rebased and added Saurabh's Reviewed-by tag Changes since v2: https://lore.kernel.org/all/20250512140432.2387503-1-namjain@linux.microsoft.com/ * Removed CONFIG_OF dependency (addressed Saurabh's comments) * Fixed typo in "allow_map_intialized" variable name Changes since v1: https://lore.kernel.org/all/20250506084937.624680-1-namjain@linux.microsoft.com/ Addressed Saurabh's comments: * Split the patch in 2 to keep export symbols separate * Make MSHV_VTL module tristate and fixed compilation warning that would come when HYPERV is compiled as a module. * Remove the use of ref_count * Split functionality of mshv_vtl_ioctl_get_set_regs to different functions mshv_vtl_ioctl_(get|set)_regs as it actually make things simpler * Fixed use of copy_from_user in atomic context in mshv_vtl_hvcall_call. Added ToDo comment for info. * Added extra code to free memory for vtl in error scenarios in mshv_ioctl_create_vtl() Addressed Alok's comments regarding: * Additional conditional checks * corrected typo in HV_X64_REGISTER_MSR_MTRR_PHYS_MASKB case * empty lines before return statement * Added/edited comments, variable names, structure field names as suggested to improve documentation - no functional change here. Naman Jain (2): Drivers: hv: Export some symbols for mshv_vtl Drivers: hv: Introduce mshv_vtl driver drivers/hv/Kconfig | 22 + drivers/hv/Makefile | 7 +- drivers/hv/hv.c | 3 + drivers/hv/hyperv_vmbus.h | 1 + drivers/hv/mshv_vtl.h | 52 ++ drivers/hv/mshv_vtl_main.c | 1508 +++++++++++++++++++++++++++++++++++ drivers/hv/vmbus_drv.c | 4 +- include/hyperv/hvgdk_mini.h | 106 +++ include/uapi/linux/mshv.h | 80 ++ 9 files changed, 1781 insertions(+), 2 deletions(-) create mode 100644 drivers/hv/mshv_vtl.h create mode 100644 drivers/hv/mshv_vtl_main.c base-commit: a933d3dc1968fcfb0ab72879ec304b1971ed1b9a -- 2.34.1
…> Changes since v5: …> * Used guard(mutex) for better mutex handling. … Thanks. Do you see opportunities to extend guard applications for further data structures? Regards, Markus
On 7/24/2025 2:26 PM, Markus Elfring wrote: > …> Changes since v5: > …> * Used guard(mutex) for better mutex handling. > … > > Thanks. > > Do you see opportunities to extend guard applications for further data structures? > > Regards, > Markus So I actually extended using guard to all the other places where I was using manual mutex lock/unlock. I had to reorganize the code a bit, which made the overall flow simpler and more robust. If I am missing something, please let me know. Regards, Naman
… >> Do you see opportunities to extend guard applications for further data structures? … > So I actually extended using guard to all the other places where I was > using manual mutex lock/unlock. I had to reorganize the code a bit, > which made the overall flow simpler and more robust. If I am missing > something, please let me know. Can you imagine that similar adjustments will become helpful at further source code places also according to other pairs of function/macro calls? https://elixir.bootlin.com/linux/v6.16-rc7/source/include/linux/rcupdate.h#L1155-L1167 How do you think about to fiddle any more with “constructors” and “destructors”? Regards, Markus
On 7/24/2025 4:56 PM, Markus Elfring wrote: > … > >>> Do you see opportunities to extend guard applications for further data structures? > … > >> So I actually extended using guard to all the other places where I was >> using manual mutex lock/unlock. I had to reorganize the code a bit, >> which made the overall flow simpler and more robust. If I am missing >> something, please let me know. > > Can you imagine that similar adjustments will become helpful at further > source code places also according to other pairs of function/macro calls? > https://elixir.bootlin.com/linux/v6.16-rc7/source/include/linux/rcupdate.h#L1155-L1167 > > How do you think about to fiddle any more with “constructors” and “destructors”? > > Regards, > Markus I have one other usage of rcu_read_lock/unlock in the code, which I feel is fine in its current form. Thanks, Naman Jain
> I have one other usage of rcu_read_lock/unlock in the code, which I feel is fine in its current form. You may use another lock guard accordingly, don't you? https://elixir.bootlin.com/linux/v6.16-rc7/source/include/linux/rcupdate.h#L1155-L1167 Regards, Markus
© 2016 - 2025 Red Hat, Inc.