[PATCH 0/5] Add new headers for Hyper-V Dom0

Nuno Das Neves posted 5 patches 1 month, 3 weeks ago
There is a newer version of this series
arch/arm64/hyperv/hv_core.c              |    3 +-
arch/arm64/hyperv/mshyperv.c             |    1 +
arch/arm64/include/asm/mshyperv.h        |    2 +-
arch/x86/entry/vdso/vma.c                |    1 +
arch/x86/hyperv/hv_apic.c                |    2 +-
arch/x86/hyperv/hv_init.c                |    3 +-
arch/x86/hyperv/hv_proc.c                |    4 +-
arch/x86/hyperv/hv_spinlock.c            |    1 +
arch/x86/hyperv/hv_vtl.c                 |    1 +
arch/x86/hyperv/irqdomain.c              |    1 +
arch/x86/hyperv/ivm.c                    |    2 +-
arch/x86/hyperv/mmu.c                    |    2 +-
arch/x86/hyperv/nested.c                 |    2 +-
arch/x86/include/asm/kvm_host.h          |    1 -
arch/x86/include/asm/mshyperv.h          |    3 +-
arch/x86/include/asm/svm.h               |    2 +-
arch/x86/include/asm/vdso/gettimeofday.h |    1 +
arch/x86/kernel/cpu/mshyperv.c           |    2 +-
arch/x86/kernel/cpu/mtrr/generic.c       |    1 +
arch/x86/kvm/vmx/vmx_onhyperv.h          |    1 -
arch/x86/mm/pat/set_memory.c             |    2 -
drivers/clocksource/hyperv_timer.c       |    2 +-
drivers/hv/channel.c                     |    1 +
drivers/hv/channel_mgmt.c                |    1 +
drivers/hv/connection.c                  |    1 +
drivers/hv/hv.c                          |    1 +
drivers/hv/hv_balloon.c                  |    5 +-
drivers/hv/hv_common.c                   |    2 +-
drivers/hv/hv_kvp.c                      |    1 -
drivers/hv/hv_snapshot.c                 |    1 -
drivers/hv/hv_util.c                     |    1 +
drivers/hv/hyperv_vmbus.h                |    1 -
drivers/hv/ring_buffer.c                 |    1 +
drivers/hv/vmbus_drv.c                   |    1 +
drivers/iommu/hyperv-iommu.c             |    1 +
drivers/net/hyperv/netvsc.c              |    1 +
drivers/pci/controller/pci-hyperv.c      |    1 +
include/asm-generic/hyperv-tlfs.h        |    9 +
include/asm-generic/mshyperv.h           |    2 +-
include/clocksource/hyperv_timer.h       |    2 +-
include/hyperv/hv_defs.h                 |   29 +
include/hyperv/hvgdk.h                   |   66 ++
include/hyperv/hvgdk_ext.h               |   46 +
include/hyperv/hvgdk_mini.h              | 1212 ++++++++++++++++++++++
include/hyperv/hvhdk.h                   |  733 +++++++++++++
include/hyperv/hvhdk_mini.h              |  310 ++++++
include/linux/hyperv.h                   |   12 +-
net/vmw_vsock/hyperv_transport.c         |    1 -
48 files changed, 2442 insertions(+), 40 deletions(-)
create mode 100644 include/hyperv/hv_defs.h
create mode 100644 include/hyperv/hvgdk.h
create mode 100644 include/hyperv/hvgdk_ext.h
create mode 100644 include/hyperv/hvgdk_mini.h
create mode 100644 include/hyperv/hvhdk.h
create mode 100644 include/hyperv/hvhdk_mini.h
[PATCH 0/5] Add new headers for Hyper-V Dom0
Posted by Nuno Das Neves 1 month, 3 weeks ago
To support Hyper-V Dom0 (aka Linux as root partition), many new
definitions are required.

The plan going forward is to directly import headers from
Hyper-V. This is a more maintainable way to import definitions
rather than via the TLFS doc. This patch series introduces
new headers (hvhdk.h, hvgdk.h, etc, see patch #3) directly
derived from Hyper-V code.

This patch series replaces hyperv-tlfs.h with hvhdk.h, but only
in Microsoft-maintained Hyper-V code where they are needed. This
leaves the existing hyperv-tlfs.h in use elsewhere - notably for
Hyper-V enlightenments on KVM guests.

An intermediary header "hv_defs.h" is introduced to conditionally
include either hyperv-tlfs.h or hvhdk.h. This is required because
several headers which today include hyperv-tlfs.h, are shared
between Hyper-V and KVM code (e.g. mshyperv.h).

Summary:
Patch 1-2: Cleanup patches
Patch 3: Add the new headers (hvhdk.h, etc..) in include/hyperv/
Patch 4: Add hv_defs.h and use it in mshyperv.h, svm.h,
         hyperv_timer.h
Patch 5: Switch to the new headers, only in Hyper-V code

Nuno Das Neves (5):
  hyperv: Move hv_connection_id to hyperv-tlfs.h
  hyperv: Remove unnecessary #includes
  hyperv: Add new Hyper-V headers
  hyperv: Add hv_defs.h to conditionally include hyperv-tlfs.h or
    hvhdk.h
  hyperv: Use hvhdk.h instead of hyperv-tlfs.h in Hyper-V code

 arch/arm64/hyperv/hv_core.c              |    3 +-
 arch/arm64/hyperv/mshyperv.c             |    1 +
 arch/arm64/include/asm/mshyperv.h        |    2 +-
 arch/x86/entry/vdso/vma.c                |    1 +
 arch/x86/hyperv/hv_apic.c                |    2 +-
 arch/x86/hyperv/hv_init.c                |    3 +-
 arch/x86/hyperv/hv_proc.c                |    4 +-
 arch/x86/hyperv/hv_spinlock.c            |    1 +
 arch/x86/hyperv/hv_vtl.c                 |    1 +
 arch/x86/hyperv/irqdomain.c              |    1 +
 arch/x86/hyperv/ivm.c                    |    2 +-
 arch/x86/hyperv/mmu.c                    |    2 +-
 arch/x86/hyperv/nested.c                 |    2 +-
 arch/x86/include/asm/kvm_host.h          |    1 -
 arch/x86/include/asm/mshyperv.h          |    3 +-
 arch/x86/include/asm/svm.h               |    2 +-
 arch/x86/include/asm/vdso/gettimeofday.h |    1 +
 arch/x86/kernel/cpu/mshyperv.c           |    2 +-
 arch/x86/kernel/cpu/mtrr/generic.c       |    1 +
 arch/x86/kvm/vmx/vmx_onhyperv.h          |    1 -
 arch/x86/mm/pat/set_memory.c             |    2 -
 drivers/clocksource/hyperv_timer.c       |    2 +-
 drivers/hv/channel.c                     |    1 +
 drivers/hv/channel_mgmt.c                |    1 +
 drivers/hv/connection.c                  |    1 +
 drivers/hv/hv.c                          |    1 +
 drivers/hv/hv_balloon.c                  |    5 +-
 drivers/hv/hv_common.c                   |    2 +-
 drivers/hv/hv_kvp.c                      |    1 -
 drivers/hv/hv_snapshot.c                 |    1 -
 drivers/hv/hv_util.c                     |    1 +
 drivers/hv/hyperv_vmbus.h                |    1 -
 drivers/hv/ring_buffer.c                 |    1 +
 drivers/hv/vmbus_drv.c                   |    1 +
 drivers/iommu/hyperv-iommu.c             |    1 +
 drivers/net/hyperv/netvsc.c              |    1 +
 drivers/pci/controller/pci-hyperv.c      |    1 +
 include/asm-generic/hyperv-tlfs.h        |    9 +
 include/asm-generic/mshyperv.h           |    2 +-
 include/clocksource/hyperv_timer.h       |    2 +-
 include/hyperv/hv_defs.h                 |   29 +
 include/hyperv/hvgdk.h                   |   66 ++
 include/hyperv/hvgdk_ext.h               |   46 +
 include/hyperv/hvgdk_mini.h              | 1212 ++++++++++++++++++++++
 include/hyperv/hvhdk.h                   |  733 +++++++++++++
 include/hyperv/hvhdk_mini.h              |  310 ++++++
 include/linux/hyperv.h                   |   12 +-
 net/vmw_vsock/hyperv_transport.c         |    1 -
 48 files changed, 2442 insertions(+), 40 deletions(-)
 create mode 100644 include/hyperv/hv_defs.h
 create mode 100644 include/hyperv/hvgdk.h
 create mode 100644 include/hyperv/hvgdk_ext.h
 create mode 100644 include/hyperv/hvgdk_mini.h
 create mode 100644 include/hyperv/hvhdk.h
 create mode 100644 include/hyperv/hvhdk_mini.h

-- 
2.34.1
Re: [PATCH 0/5] Add new headers for Hyper-V Dom0
Posted by Easwar Hariharan 3 weeks, 6 days ago
On 10/3/2024 12:50 PM, Nuno Das Neves wrote:
> To support Hyper-V Dom0 (aka Linux as root partition), many new
> definitions are required.
> 
> The plan going forward is to directly import headers from
> Hyper-V. This is a more maintainable way to import definitions
> rather than via the TLFS doc. This patch series introduces
> new headers (hvhdk.h, hvgdk.h, etc, see patch #3) directly
> derived from Hyper-V code.
> 
> This patch series replaces hyperv-tlfs.h with hvhdk.h, but only
> in Microsoft-maintained Hyper-V code where they are needed. This
> leaves the existing hyperv-tlfs.h in use elsewhere - notably for
> Hyper-V enlightenments on KVM guests.
> 
> An intermediary header "hv_defs.h" is introduced to conditionally
> include either hyperv-tlfs.h or hvhdk.h. This is required because
> several headers which today include hyperv-tlfs.h, are shared
> between Hyper-V and KVM code (e.g. mshyperv.h).
> 
> Summary:
> Patch 1-2: Cleanup patches
> Patch 3: Add the new headers (hvhdk.h, etc..) in include/hyperv/
> Patch 4: Add hv_defs.h and use it in mshyperv.h, svm.h,
>          hyperv_timer.h
> Patch 5: Switch to the new headers, only in Hyper-V code
> 
> Nuno Das Neves (5):
>   hyperv: Move hv_connection_id to hyperv-tlfs.h
>   hyperv: Remove unnecessary #includes
>   hyperv: Add new Hyper-V headers
>   hyperv: Add hv_defs.h to conditionally include hyperv-tlfs.h or
>     hvhdk.h
>   hyperv: Use hvhdk.h instead of hyperv-tlfs.h in Hyper-V code
>

What is the model for Hyper-V code that has both guest and host roles
where the corresponding hypercalls are available for both? As I
understand it, those are supposed to be in hvgdk*.h.

For a specific example, IOMMU hypercalls can operate on stage 2 or stage
1 translations depending on the role of the (hyper) caller and the input
values provided. Should a driver using these hypercalls import both
hvhdk* and hvgdk*? What about hyperv-tlfs?

Patches 4 and 5 seem to draw a bright line between host and guest roles
while the reality is more gray. Please do correct me if I'm wrong here,
perhaps the picture would be clearer if Stas' suggestion of a new header
file is implemented.

Thanks,
Easwar
Re: [PATCH 0/5] Add new headers for Hyper-V Dom0
Posted by Nuno Das Neves 3 weeks, 6 days ago
On 10/31/2024 12:05 PM, Easwar Hariharan wrote:
> On 10/3/2024 12:50 PM, Nuno Das Neves wrote:
>> To support Hyper-V Dom0 (aka Linux as root partition), many new
>> definitions are required.
>>
>> The plan going forward is to directly import headers from
>> Hyper-V. This is a more maintainable way to import definitions
>> rather than via the TLFS doc. This patch series introduces
>> new headers (hvhdk.h, hvgdk.h, etc, see patch #3) directly
>> derived from Hyper-V code.
>>
>> This patch series replaces hyperv-tlfs.h with hvhdk.h, but only
>> in Microsoft-maintained Hyper-V code where they are needed. This
>> leaves the existing hyperv-tlfs.h in use elsewhere - notably for
>> Hyper-V enlightenments on KVM guests.
>>
>> An intermediary header "hv_defs.h" is introduced to conditionally
>> include either hyperv-tlfs.h or hvhdk.h. This is required because
>> several headers which today include hyperv-tlfs.h, are shared
>> between Hyper-V and KVM code (e.g. mshyperv.h).
>>
>> Summary:
>> Patch 1-2: Cleanup patches
>> Patch 3: Add the new headers (hvhdk.h, etc..) in include/hyperv/
>> Patch 4: Add hv_defs.h and use it in mshyperv.h, svm.h,
>>          hyperv_timer.h
>> Patch 5: Switch to the new headers, only in Hyper-V code
>>
>> Nuno Das Neves (5):
>>   hyperv: Move hv_connection_id to hyperv-tlfs.h
>>   hyperv: Remove unnecessary #includes
>>   hyperv: Add new Hyper-V headers
>>   hyperv: Add hv_defs.h to conditionally include hyperv-tlfs.h or
>>     hvhdk.h
>>   hyperv: Use hvhdk.h instead of hyperv-tlfs.h in Hyper-V code
>>

Hi Easwar, thanks for the questions. I will attempt to clarify.
> 
> What is the model for Hyper-V code that has both guest and host roles
> where the corresponding hypercalls are available for both? As I
> understand it, those are supposed to be in hvgdk*.h.
>

It's true that the naming of the files implies hvgdk*.h is for guests,
and hvhdk*.h (which includes hvgdk*.h), is for hosts/dom0. But I would
only take that as a rough guide.

The real reason for keeping these names is to make it a easier to copy
and maintain the definitions from the Windows code into Linux, by
keeping the provenance of exactly where they came from.

> For a specific example, IOMMU hypercalls can operate on stage 2 or stage
> 1 translations depending on the role of the (hyper) caller and the input
> values provided. Should a driver using these hypercalls import both
> hvhdk* and hvgdk*? What about hyperv-tlfs?
>

I'd recommend importing hvhdk.h since it contains everything you need
(including hvgdk*.h).

The goal of this patchset is to move away from hyperv-tlfs.h, because by
definition it should only contain definitions from the TLFS document.

> Patches 4 and 5 seem to draw a bright line between host and guest roles
> while the reality is more gray. Please do correct me if I'm wrong here,
> perhaps the picture would be clearer if Stas' suggestion of a new header
> file is implemented.
> 

Patches 4 and 5 introduce the new headers in a way that avoids any
potential impact on KVM and other non-Microsoft-maintained code.

The 'line' is not between guest and host, but between Microsoft-maintained
and non-Microsoft-maintained code.

Thanks,
Nuno

> Thanks,
> Easwar
Re: [PATCH 0/5] Add new headers for Hyper-V Dom0
Posted by Wei Liu 1 month, 3 weeks ago
On Thu, Oct 03, 2024 at 12:50:59PM -0700, Nuno Das Neves wrote:
> To support Hyper-V Dom0 (aka Linux as root partition), many new
> definitions are required.
> 
> The plan going forward is to directly import headers from
> Hyper-V. This is a more maintainable way to import definitions
> rather than via the TLFS doc. This patch series introduces
> new headers (hvhdk.h, hvgdk.h, etc, see patch #3) directly
> derived from Hyper-V code.
> 
> This patch series replaces hyperv-tlfs.h with hvhdk.h, but only
> in Microsoft-maintained Hyper-V code where they are needed. This
> leaves the existing hyperv-tlfs.h in use elsewhere - notably for
> Hyper-V enlightenments on KVM guests.

It goes without saying that we need to make sure KVM still builds
correctly after this series. Please make sure to test that. Thanks.

Wei.