diff mbox series

[5/5] hyperv: Use hvhdk.h instead of hyperv-tlfs.h in Hyper-V code

Message ID 1727985064-18362-6-git-send-email-nunodasneves@linux.microsoft.com (mailing list archive)
State New
Headers show
Series Add new headers for Hyper-V Dom0 | expand

Commit Message

Nuno Das Neves Oct. 3, 2024, 7:51 p.m. UTC
To move toward importing headers from Hyper-V directly, switch to
using hvhdk.h in all Hyper-V code. KVM code that uses Hyper-V
definitions from hyperv-tlfs.h remains untouched.

Add HYPERV_NONTLFS_HEADERS everywhere mshyperv.h, asm/svm.h,
clocksource/hyperv_timer.h is included in Hyper-V code.

Replace hyperv-tlfs.h with hvhdk.h directly in linux/hyperv.h, and
define HYPERV_NONTLFS_HEADERS there, since it is only used in
Hyper-V device code.

Update a couple of definitions to updated names found in the new
headers: HV_EXT_MEM_HEAT_HINT, HV_SUBNODE_TYPE_ANY.

Signed-off-by: Nuno Das Neves <nunodasneves@linux.microsoft.com>
---
 arch/arm64/hyperv/hv_core.c              | 1 +
 arch/arm64/hyperv/mshyperv.c             | 1 +
 arch/x86/entry/vdso/vma.c                | 1 +
 arch/x86/hyperv/hv_apic.c                | 1 +
 arch/x86/hyperv/hv_init.c                | 1 +
 arch/x86/hyperv/hv_proc.c                | 3 ++-
 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                    | 1 +
 arch/x86/hyperv/mmu.c                    | 1 +
 arch/x86/hyperv/nested.c                 | 1 +
 arch/x86/include/asm/vdso/gettimeofday.h | 1 +
 arch/x86/kernel/cpu/mshyperv.c           | 1 +
 arch/x86/kernel/cpu/mtrr/generic.c       | 1 +
 drivers/clocksource/hyperv_timer.c       | 1 +
 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                  | 3 ++-
 drivers/hv/hv_common.c                   | 1 +
 drivers/hv/hv_util.c                     | 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/linux/hyperv.h                   | 3 ++-
 29 files changed, 32 insertions(+), 3 deletions(-)

Comments

Stanislav Kinsburskii Oct. 4, 2024, 3:58 p.m. UTC | #1
Hi Nuno,

On Thu, Oct 03, 2024 at 12:51:04PM -0700, Nuno Das Neves wrote:
> diff --git a/arch/arm64/hyperv/hv_core.c b/arch/arm64/hyperv/hv_core.c
> index 9d1969b875e9..bb7f28f74bf4 100644
> --- a/arch/arm64/hyperv/hv_core.c
> +++ b/arch/arm64/hyperv/hv_core.c
> @@ -14,6 +14,7 @@
>  #include <linux/arm-smccc.h>
>  #include <linux/module.h>
>  #include <asm-generic/bug.h>
> +#define HYPERV_NONTLFS_HEADERS
>  #include <asm/mshyperv.h>
>  

Perhaps it would be cleaner to introduce a new header file to be
included, containing the new define and including <asm/mshyperv.h> instead.

Stas
Simon Horman Oct. 4, 2024, 7:11 p.m. UTC | #2
On Thu, Oct 03, 2024 at 12:51:04PM -0700, Nuno Das Neves wrote:
> To move toward importing headers from Hyper-V directly, switch to
> using hvhdk.h in all Hyper-V code. KVM code that uses Hyper-V
> definitions from hyperv-tlfs.h remains untouched.
> 
> Add HYPERV_NONTLFS_HEADERS everywhere mshyperv.h, asm/svm.h,
> clocksource/hyperv_timer.h is included in Hyper-V code.
> 
> Replace hyperv-tlfs.h with hvhdk.h directly in linux/hyperv.h, and
> define HYPERV_NONTLFS_HEADERS there, since it is only used in
> Hyper-V device code.
> 
> Update a couple of definitions to updated names found in the new
> headers: HV_EXT_MEM_HEAT_HINT, HV_SUBNODE_TYPE_ANY.
> 
> Signed-off-by: Nuno Das Neves <nunodasneves@linux.microsoft.com>

...

> diff --git a/arch/arm64/hyperv/mshyperv.c b/arch/arm64/hyperv/mshyperv.c
> index b1a4de4eee29..62b2a270ae65 100644
> --- a/arch/arm64/hyperv/mshyperv.c
> +++ b/arch/arm64/hyperv/mshyperv.c
> @@ -15,6 +15,7 @@
>  #include <linux/errno.h>
>  #include <linux/version.h>
>  #include <linux/cpuhotplug.h>
> +#define HYPERV_NONTLFS_HEADERS
>  #include <asm/mshyperv.h>
>  
>  static bool hyperv_initialized;

Hi,

With this change in place I see allmodconfig x86_64 builds reporting that
HV_REGISTER_FEATURES is undeclared.

arch/arm64/hyperv/mshyperv.c: In function 'hyperv_init':
arch/arm64/hyperv/mshyperv.c:53:26: error: 'HV_REGISTER_FEATURES' undeclared (first use in this function); did you mean 'HV_REGISTER_FEATURES_INFO'?
   53 |         hv_get_vpreg_128(HV_REGISTER_FEATURES, &result);
      |                          ^~~~~~~~~~~~~~~~~~~~
      |                          HV_REGISTER_FEATURES_INFO
arch/arm64/hyperv/mshyperv.c:53:26: note: each undeclared identifier is reported only once for each function it appears in
arch/arm64/hyperv/mshyperv.c:58:26: error: 'HV_REGISTER_ENLIGHTENMENTS' undeclared (first use in this function); did you mean 'HV_ACCESS_REENLIGHTENMENT'?
   58 |         hv_get_vpreg_128(HV_REGISTER_ENLIGHTENMENTS, &result);
      |                          ^~~~~~~~~~~~~~~~~~~~~~~~~~
      |                          HV_ACCESS_REENLIGHTENMENT

> diff --git a/arch/x86/entry/vdso/vma.c b/arch/x86/entry/vdso/vma.c
> index 6d83ceb7f1ba..5f4053c49658 100644
> --- a/arch/x86/entry/vdso/vma.c
> +++ b/arch/x86/entry/vdso/vma.c
> @@ -25,6 +25,7 @@
>  #include <asm/page.h>
>  #include <asm/desc.h>
>  #include <asm/cpufeature.h>
> +#define HYPERV_NONTLFS_HEADERS
>  #include <clocksource/hyperv_timer.h>
>  
>  #undef _ASM_X86_VVAR_H
> diff --git a/arch/x86/hyperv/hv_apic.c b/arch/x86/hyperv/hv_apic.c
> index f022d5f64fb6..4fe3b3b13256 100644
> --- a/arch/x86/hyperv/hv_apic.c
> +++ b/arch/x86/hyperv/hv_apic.c
> @@ -26,6 +26,7 @@
>  #include <linux/slab.h>
>  #include <linux/cpuhotplug.h>
>  #include <asm/hypervisor.h>
> +#define HYPERV_NONTLFS_HEADERS
>  #include <asm/mshyperv.h>
>  #include <asm/apic.h>
>  
> diff --git a/arch/x86/hyperv/hv_init.c b/arch/x86/hyperv/hv_init.c
> index fc3c3d76c181..680c4abc456e 100644
> --- a/arch/x86/hyperv/hv_init.c
> +++ b/arch/x86/hyperv/hv_init.c
> @@ -19,6 +19,7 @@
>  #include <asm/sev.h>
>  #include <asm/ibt.h>
>  #include <asm/hypervisor.h>
> +#define HYPERV_NONTLFS_HEADERS
>  #include <asm/mshyperv.h>
>  #include <asm/idtentry.h>
>  #include <asm/set_memory.h>

And here too, with x86_64 allmodconfig.

In file included from ./include/linux/string.h:390,
                 from ./include/linux/efi.h:16,
                 from arch/x86/hyperv/hv_init.c:12:
arch/x86/hyperv/hv_init.c: In function 'get_vtl':
./include/linux/overflow.h:372:23: error: invalid application of 'sizeof' to incomplete type 'struct hv_get_vp_registers_input'
  372 |                 sizeof(*(p)) + flex_array_size(p, member, count),       \
      |                       ^
./include/linux/fortify-string.h:502:42: note: in definition of macro '__fortify_memset_chk'
  502 |         size_t __fortify_size = (size_t)(size);                         \
      |                                          ^~~~
arch/x86/hyperv/hv_init.c:427:9: note: in expansion of macro 'memset'
  427 |         memset(input, 0, struct_size(input, element, 1));
      |         ^~~~~~
arch/x86/hyperv/hv_init.c:427:26: note: in expansion of macro 'struct_size'
  427 |         memset(input, 0, struct_size(input, element, 1));
      |                          ^~~~~~~~~~~

[errors trimmed for the sake of brevity]

...

> diff --git a/arch/x86/hyperv/hv_vtl.c b/arch/x86/hyperv/hv_vtl.c
> index 04775346369c..a8bb6ad7efb6 100644
> --- a/arch/x86/hyperv/hv_vtl.c
> +++ b/arch/x86/hyperv/hv_vtl.c
> @@ -10,6 +10,7 @@
>  #include <asm/boot.h>
>  #include <asm/desc.h>
>  #include <asm/i8259.h>
> +#define HYPERV_NONTLFS_HEADERS
>  #include <asm/mshyperv.h>
>  #include <asm/realmode.h>
>  #include <../kernel/smpboot.h>

And, likewise, with this patch applied I see a number of errors when
compiling this file. This is with allmodconfig on x86_64 with:

Modified: CONFIG_HYPERV=y (instead of m)
Added: CONFIG_HYPERV_VTL_MODE=y

arch/x86/hyperv/hv_vtl.c: In function 'hv_vtl_bringup_vcpu':
arch/x86/hyperv/hv_vtl.c:154:34: error: 'HVCALL_ENABLE_VP_VTL' undeclared (first use in this function)
  154 |         status = hv_do_hypercall(HVCALL_ENABLE_VP_VTL, input, NULL);
      |                                  ^~~~~~~~~~~~~~~~~~~~
arch/x86/hyperv/hv_vtl.c:154:34: note: each undeclared identifier is reported only once for each function it appears in
In file included from ./include/linux/string.h:390,
                 from ./include/linux/bitmap.h:13,
                 from ./include/linux/cpumask.h:12,
                 from ./arch/x86/include/asm/apic.h:5,
                 from arch/x86/hyperv/hv_vtl.c:9:
arch/x86/hyperv/hv_vtl.c: In function 'hv_vtl_apicid_to_vp_id':
arch/x86/hyperv/hv_vtl.c:189:32: error: invalid application of 'sizeof' to incomplete type 'struct hv_get_vp_from_apic_id_in'
  189 |         memset(input, 0, sizeof(*input));
      |                                ^
./include/linux/fortify-string.h:502:42: note: in definition of macro '__fortify_memset_chk'
  502 |         size_t __fortify_size = (size_t)(size);                         \
      |                                          ^~~~
arch/x86/hyperv/hv_vtl.c:189:9: note: in expansion of macro 'memset'
  189 |         memset(input, 0, sizeof(*input));
      |         ^~~~~~
arch/x86/hyperv/hv_vtl.c:190:14: error: invalid use of undefined type 'struct hv_get_vp_from_apic_id_in'
  190 |         input->partition_id = HV_PARTITION_ID_SELF;
      |              ^~
arch/x86/hyperv/hv_vtl.c:191:14: error: invalid use of undefined type 'struct hv_get_vp_from_apic_id_in'
  191 |         input->apic_ids[0] = apic_id;
      |              ^~
arch/x86/hyperv/hv_vtl.c:195:45: error: 'HVCALL_GET_VP_ID_FROM_APIC_ID' undeclared (first use in this function)
  195 |         control = HV_HYPERCALL_REP_COMP_1 | HVCALL_GET_VP_ID_FROM_APIC_ID;
      |                                             ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~

...
kernel test robot Oct. 4, 2024, 9:55 p.m. UTC | #3
Hi Nuno,

kernel test robot noticed the following build errors:

[auto build test ERROR on tip/x86/core]
[also build test ERROR on arm64/for-next/core kvm/queue linus/master v6.12-rc1 next-20241004]
[cannot apply to kvm/linux-next]
[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/hyperv-Move-hv_connection_id-to-hyperv-tlfs-h/20241004-035418
base:   tip/x86/core
patch link:    https://lore.kernel.org/r/1727985064-18362-6-git-send-email-nunodasneves%40linux.microsoft.com
patch subject: [PATCH 5/5] hyperv: Use hvhdk.h instead of hyperv-tlfs.h in Hyper-V code
config: x86_64-allmodconfig (https://download.01.org/0day-ci/archive/20241005/202410050518.LFXqJEpd-lkp@intel.com/config)
compiler: clang version 18.1.8 (https://github.com/llvm/llvm-project 3b5b5c1ec4a3095ab096dd780e84d7ab81f3d7ff)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20241005/202410050518.LFXqJEpd-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/202410050518.LFXqJEpd-lkp@intel.com/

All errors (new ones prefixed by >>):

>> arch/x86/hyperv/hv_init.c:428:19: error: invalid application of 'sizeof' to an incomplete type 'struct hv_get_vp_registers_input'
     428 |         memset(input, 0, struct_size(input, element, 1));
         |         ~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   include/linux/overflow.h:372:9: note: expanded from macro 'struct_size'
     372 |                 sizeof(*(p)) + flex_array_size(p, member, count),       \
         |                       ^
   include/linux/fortify-string.h:512:52: note: expanded from macro 'memset'
     512 | #define memset(p, c, s) __fortify_memset_chk(p, c, s,                   \
         |                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
     513 |                 __struct_size(p), __member_size(p))
         |                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   include/linux/fortify-string.h:502:35: note: expanded from macro '__fortify_memset_chk'
     502 |         size_t __fortify_size = (size_t)(size);                         \
         |                                          ^~~~
   arch/x86/hyperv/hv_init.c:419:9: note: forward declaration of 'struct hv_get_vp_registers_input'
     419 |         struct hv_get_vp_registers_input *input;
         |                ^
>> arch/x86/hyperv/hv_init.c:428:19: error: incomplete definition of type 'struct hv_get_vp_registers_input'
     428 |         memset(input, 0, struct_size(input, element, 1));
         |         ~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   include/linux/overflow.h:372:18: note: expanded from macro 'struct_size'
     372 |                 sizeof(*(p)) + flex_array_size(p, member, count),       \
         |                                ^
   include/linux/overflow.h:356:24: note: expanded from macro 'flex_array_size'
     356 |                 (count) * sizeof(*(p)->member) + __must_be_array((p)->member),  \
         |                                      ^
   include/linux/fortify-string.h:512:52: note: expanded from macro 'memset'
     512 | #define memset(p, c, s) __fortify_memset_chk(p, c, s,                   \
         |                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
     513 |                 __struct_size(p), __member_size(p))
         |                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   include/linux/fortify-string.h:502:35: note: expanded from macro '__fortify_memset_chk'
     502 |         size_t __fortify_size = (size_t)(size);                         \
         |                                          ^~~~
   arch/x86/hyperv/hv_init.c:419:9: note: forward declaration of 'struct hv_get_vp_registers_input'
     419 |         struct hv_get_vp_registers_input *input;
         |                ^
>> arch/x86/hyperv/hv_init.c:428:19: error: incomplete definition of type 'struct hv_get_vp_registers_input'
     428 |         memset(input, 0, struct_size(input, element, 1));
         |         ~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   include/linux/overflow.h:372:18: note: expanded from macro 'struct_size'
     372 |                 sizeof(*(p)) + flex_array_size(p, member, count),       \
         |                                ^
   include/linux/overflow.h:356:55: note: expanded from macro 'flex_array_size'
     356 |                 (count) * sizeof(*(p)->member) + __must_be_array((p)->member),  \
         |                                                                     ^
   include/linux/compiler.h:243:59: note: expanded from macro '__must_be_array'
     243 | #define __must_be_array(a)      BUILD_BUG_ON_ZERO(__same_type((a), &(a)[0]))
         |                                                                ^
   note: (skipping 1 expansions in backtrace; use -fmacro-backtrace-limit=0 to see all)
   include/linux/build_bug.h:16:62: note: expanded from macro 'BUILD_BUG_ON_ZERO'
      16 | #define BUILD_BUG_ON_ZERO(e) ((int)(sizeof(struct { int:(-!!(e)); })))
         |                                                              ^
   include/linux/fortify-string.h:512:52: note: expanded from macro 'memset'
     512 | #define memset(p, c, s) __fortify_memset_chk(p, c, s,                   \
         |                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
     513 |                 __struct_size(p), __member_size(p))
         |                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   include/linux/fortify-string.h:502:35: note: expanded from macro '__fortify_memset_chk'
     502 |         size_t __fortify_size = (size_t)(size);                         \
         |                                          ^~~~
   arch/x86/hyperv/hv_init.c:419:9: note: forward declaration of 'struct hv_get_vp_registers_input'
     419 |         struct hv_get_vp_registers_input *input;
         |                ^
>> arch/x86/hyperv/hv_init.c:428:19: error: incomplete definition of type 'struct hv_get_vp_registers_input'
     428 |         memset(input, 0, struct_size(input, element, 1));
         |         ~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   include/linux/overflow.h:372:18: note: expanded from macro 'struct_size'
     372 |                 sizeof(*(p)) + flex_array_size(p, member, count),       \
         |                                ^
   include/linux/overflow.h:357:30: note: expanded from macro 'flex_array_size'
     357 |                 size_mul(count, sizeof(*(p)->member) + __must_be_array((p)->member)))
         |                                            ^
   include/linux/fortify-string.h:512:52: note: expanded from macro 'memset'
     512 | #define memset(p, c, s) __fortify_memset_chk(p, c, s,                   \
         |                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
     513 |                 __struct_size(p), __member_size(p))
         |                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   include/linux/fortify-string.h:502:35: note: expanded from macro '__fortify_memset_chk'
     502 |         size_t __fortify_size = (size_t)(size);                         \
         |                                          ^~~~
   arch/x86/hyperv/hv_init.c:419:9: note: forward declaration of 'struct hv_get_vp_registers_input'
     419 |         struct hv_get_vp_registers_input *input;
         |                ^
>> arch/x86/hyperv/hv_init.c:428:19: error: incomplete definition of type 'struct hv_get_vp_registers_input'
     428 |         memset(input, 0, struct_size(input, element, 1));
         |         ~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   include/linux/overflow.h:372:18: note: expanded from macro 'struct_size'
     372 |                 sizeof(*(p)) + flex_array_size(p, member, count),       \
         |                                ^
   include/linux/overflow.h:357:61: note: expanded from macro 'flex_array_size'
     357 |                 size_mul(count, sizeof(*(p)->member) + __must_be_array((p)->member)))
         |                                                                           ^
   include/linux/compiler.h:243:59: note: expanded from macro '__must_be_array'
     243 | #define __must_be_array(a)      BUILD_BUG_ON_ZERO(__same_type((a), &(a)[0]))
         |                                                                ^
   note: (skipping 1 expansions in backtrace; use -fmacro-backtrace-limit=0 to see all)
   include/linux/build_bug.h:16:62: note: expanded from macro 'BUILD_BUG_ON_ZERO'
      16 | #define BUILD_BUG_ON_ZERO(e) ((int)(sizeof(struct { int:(-!!(e)); })))
         |                                                              ^
   include/linux/fortify-string.h:512:52: note: expanded from macro 'memset'
     512 | #define memset(p, c, s) __fortify_memset_chk(p, c, s,                   \
         |                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
     513 |                 __struct_size(p), __member_size(p))
         |                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   include/linux/fortify-string.h:502:35: note: expanded from macro '__fortify_memset_chk'
     502 |         size_t __fortify_size = (size_t)(size);                         \
         |                                          ^~~~
   arch/x86/hyperv/hv_init.c:419:9: note: forward declaration of 'struct hv_get_vp_registers_input'
     419 |         struct hv_get_vp_registers_input *input;
         |                ^
   arch/x86/hyperv/hv_init.c:429:7: error: incomplete definition of type 'struct hv_get_vp_registers_input'
     429 |         input->header.partitionid = HV_PARTITION_ID_SELF;
         |         ~~~~~^
   arch/x86/hyperv/hv_init.c:419:9: note: forward declaration of 'struct hv_get_vp_registers_input'
     419 |         struct hv_get_vp_registers_input *input;
         |                ^
   arch/x86/hyperv/hv_init.c:430:7: error: incomplete definition of type 'struct hv_get_vp_registers_input'
     430 |         input->header.vpindex = HV_VP_INDEX_SELF;
         |         ~~~~~^
   arch/x86/hyperv/hv_init.c:419:9: note: forward declaration of 'struct hv_get_vp_registers_input'
     419 |         struct hv_get_vp_registers_input *input;
         |                ^
   arch/x86/hyperv/hv_init.c:431:7: error: incomplete definition of type 'struct hv_get_vp_registers_input'
     431 |         input->header.inputvtl = 0;
         |         ~~~~~^
   arch/x86/hyperv/hv_init.c:419:9: note: forward declaration of 'struct hv_get_vp_registers_input'
     419 |         struct hv_get_vp_registers_input *input;
         |                ^
   arch/x86/hyperv/hv_init.c:432:7: error: incomplete definition of type 'struct hv_get_vp_registers_input'
     432 |         input->element[0].name0 = HV_X64_REGISTER_VSM_VP_STATUS;
         |         ~~~~~^
   arch/x86/hyperv/hv_init.c:419:9: note: forward declaration of 'struct hv_get_vp_registers_input'
     419 |         struct hv_get_vp_registers_input *input;
         |                ^
>> arch/x86/hyperv/hv_init.c:436:15: error: incomplete definition of type 'struct hv_get_vp_registers_output'
     436 |                 ret = output->as64.low & HV_X64_VTL_MASK;
         |                       ~~~~~~^
   arch/x86/hyperv/hv_init.c:420:9: note: forward declaration of 'struct hv_get_vp_registers_output'
     420 |         struct hv_get_vp_registers_output *output;
         |                ^
   10 errors generated.
--
>> arch/x86/hyperv/hv_vtl.c:154:27: error: use of undeclared identifier 'HVCALL_ENABLE_VP_VTL'
     154 |         status = hv_do_hypercall(HVCALL_ENABLE_VP_VTL, input, NULL);
         |                                  ^
>> arch/x86/hyperv/hv_vtl.c:189:25: error: invalid application of 'sizeof' to an incomplete type 'struct hv_get_vp_from_apic_id_in'
     189 |         memset(input, 0, sizeof(*input));
         |                                ^~~~~~~~
   include/linux/fortify-string.h:512:52: note: expanded from macro 'memset'
     512 | #define memset(p, c, s) __fortify_memset_chk(p, c, s,                   \
         |                                                    ^
   include/linux/fortify-string.h:502:35: note: expanded from macro '__fortify_memset_chk'
     502 |         size_t __fortify_size = (size_t)(size);                         \
         |                                          ^~~~
   arch/x86/hyperv/hv_vtl.c:183:9: note: forward declaration of 'struct hv_get_vp_from_apic_id_in'
     183 |         struct hv_get_vp_from_apic_id_in *input;
         |                ^
>> arch/x86/hyperv/hv_vtl.c:190:7: error: incomplete definition of type 'struct hv_get_vp_from_apic_id_in'
     190 |         input->partition_id = HV_PARTITION_ID_SELF;
         |         ~~~~~^
   arch/x86/hyperv/hv_vtl.c:183:9: note: forward declaration of 'struct hv_get_vp_from_apic_id_in'
     183 |         struct hv_get_vp_from_apic_id_in *input;
         |                ^
   arch/x86/hyperv/hv_vtl.c:191:7: error: incomplete definition of type 'struct hv_get_vp_from_apic_id_in'
     191 |         input->apic_ids[0] = apic_id;
         |         ~~~~~^
   arch/x86/hyperv/hv_vtl.c:183:9: note: forward declaration of 'struct hv_get_vp_from_apic_id_in'
     183 |         struct hv_get_vp_from_apic_id_in *input;
         |                ^
>> arch/x86/hyperv/hv_vtl.c:195:38: error: use of undeclared identifier 'HVCALL_GET_VP_ID_FROM_APIC_ID'
     195 |         control = HV_HYPERCALL_REP_COMP_1 | HVCALL_GET_VP_ID_FROM_APIC_ID;
         |                                             ^
   5 errors generated.


vim +428 arch/x86/hyperv/hv_init.c

99a0f46af6a771 Wei Liu        2021-02-03  414  
f2a55d08d7e1a5 Saurabh Sengar 2023-09-19  415  #if IS_ENABLED(CONFIG_HYPERV_VTL_MODE)
8387ce06d70bbb Tianyu Lan     2023-08-18  416  static u8 __init get_vtl(void)
8387ce06d70bbb Tianyu Lan     2023-08-18  417  {
8387ce06d70bbb Tianyu Lan     2023-08-18  418  	u64 control = HV_HYPERCALL_REP_COMP_1 | HVCALL_GET_VP_REGISTERS;
8387ce06d70bbb Tianyu Lan     2023-08-18 @419  	struct hv_get_vp_registers_input *input;
8387ce06d70bbb Tianyu Lan     2023-08-18  420  	struct hv_get_vp_registers_output *output;
8387ce06d70bbb Tianyu Lan     2023-08-18  421  	unsigned long flags;
8387ce06d70bbb Tianyu Lan     2023-08-18  422  	u64 ret;
8387ce06d70bbb Tianyu Lan     2023-08-18  423  
8387ce06d70bbb Tianyu Lan     2023-08-18  424  	local_irq_save(flags);
8387ce06d70bbb Tianyu Lan     2023-08-18  425  	input = *this_cpu_ptr(hyperv_pcpu_input_arg);
8387ce06d70bbb Tianyu Lan     2023-08-18  426  	output = (struct hv_get_vp_registers_output *)input;
8387ce06d70bbb Tianyu Lan     2023-08-18  427  
8387ce06d70bbb Tianyu Lan     2023-08-18 @428  	memset(input, 0, struct_size(input, element, 1));
8387ce06d70bbb Tianyu Lan     2023-08-18  429  	input->header.partitionid = HV_PARTITION_ID_SELF;
8387ce06d70bbb Tianyu Lan     2023-08-18  430  	input->header.vpindex = HV_VP_INDEX_SELF;
8387ce06d70bbb Tianyu Lan     2023-08-18  431  	input->header.inputvtl = 0;
8387ce06d70bbb Tianyu Lan     2023-08-18  432  	input->element[0].name0 = HV_X64_REGISTER_VSM_VP_STATUS;
8387ce06d70bbb Tianyu Lan     2023-08-18  433  
8387ce06d70bbb Tianyu Lan     2023-08-18  434  	ret = hv_do_hypercall(control, input, output);
8387ce06d70bbb Tianyu Lan     2023-08-18  435  	if (hv_result_success(ret)) {
8387ce06d70bbb Tianyu Lan     2023-08-18 @436  		ret = output->as64.low & HV_X64_VTL_MASK;
8387ce06d70bbb Tianyu Lan     2023-08-18  437  	} else {
f2a55d08d7e1a5 Saurabh Sengar 2023-09-19  438  		pr_err("Failed to get VTL(error: %lld) exiting...\n", ret);
f2a55d08d7e1a5 Saurabh Sengar 2023-09-19  439  		BUG();
8387ce06d70bbb Tianyu Lan     2023-08-18  440  	}
8387ce06d70bbb Tianyu Lan     2023-08-18  441  
8387ce06d70bbb Tianyu Lan     2023-08-18  442  	local_irq_restore(flags);
8387ce06d70bbb Tianyu Lan     2023-08-18  443  	return ret;
8387ce06d70bbb Tianyu Lan     2023-08-18  444  }
f2a55d08d7e1a5 Saurabh Sengar 2023-09-19  445  #else
f2a55d08d7e1a5 Saurabh Sengar 2023-09-19  446  static inline u8 get_vtl(void) { return 0; }
f2a55d08d7e1a5 Saurabh Sengar 2023-09-19  447  #endif
8387ce06d70bbb Tianyu Lan     2023-08-18  448
Nuno Das Neves Oct. 4, 2024, 11:36 p.m. UTC | #4
On 10/4/2024 12:11 PM, Simon Horman wrote:
> Hi,
> 
> With this change in place I see allmodconfig x86_64 builds reporting that
> HV_REGISTER_FEATURES is undeclared.
> 
> arch/arm64/hyperv/mshyperv.c: In function 'hyperv_init':
> arch/arm64/hyperv/mshyperv.c:53:26: error: 'HV_REGISTER_FEATURES' undeclared (first use in this function); did you mean 'HV_REGISTER_FEATURES_INFO'?
>    53 |         hv_get_vpreg_128(HV_REGISTER_FEATURES, &result);
>       |                          ^~~~~~~~~~~~~~~~~~~~
>       |                          HV_REGISTER_FEATURES_INFO
> arch/arm64/hyperv/mshyperv.c:53:26: note: each undeclared identifier is reported only once for each function it appears in
> arch/arm64/hyperv/mshyperv.c:58:26: error: 'HV_REGISTER_ENLIGHTENMENTS' undeclared (first use in this function); did you mean 'HV_ACCESS_REENLIGHTENMENT'?
>    58 |         hv_get_vpreg_128(HV_REGISTER_ENLIGHTENMENTS, &result);
>       |                          ^~~~~~~~~~~~~~~~~~~~~~~~~~
>       |                          HV_ACCESS_REENLIGHTENMENT
> 

Ah, I did forgot to check arm64. Thanks for the catch, I'll be sure to
fix it for v2.

> 
> And here too, with x86_64 allmodconfig.
> 
> In file included from ./include/linux/string.h:390,
>                  from ./include/linux/efi.h:16,
>                  from arch/x86/hyperv/hv_init.c:12:
> arch/x86/hyperv/hv_init.c: In function 'get_vtl':
> ./include/linux/overflow.h:372:23: error: invalid application of 'sizeof' to incomplete type 'struct hv_get_vp_registers_input'
>   372 |                 sizeof(*(p)) + flex_array_size(p, member, count),       \
>       |                       ^
> ./include/linux/fortify-string.h:502:42: note: in definition of macro '__fortify_memset_chk'
>   502 |         size_t __fortify_size = (size_t)(size);                         \
>       |                                          ^~~~
> arch/x86/hyperv/hv_init.c:427:9: note: in expansion of macro 'memset'
>   427 |         memset(input, 0, struct_size(input, element, 1));
>       |         ^~~~~~
> arch/x86/hyperv/hv_init.c:427:26: note: in expansion of macro 'struct_size'
>   427 |         memset(input, 0, struct_size(input, element, 1));
>       |                          ^~~~~~~~~~~
> 
> [errors trimmed for the sake of brevity]
> 
> ...
> 

Thanks

> 
> And, likewise, with this patch applied I see a number of errors when
> compiling this file. This is with allmodconfig on x86_64 with:
> 
> Modified: CONFIG_HYPERV=y (instead of m)
> Added: CONFIG_HYPERV_VTL_MODE=y
> 

Thanks again,
Ah, I wish there was a way to check these different combinations of y/m
more easily.

> arch/x86/hyperv/hv_vtl.c: In function 'hv_vtl_bringup_vcpu':
> arch/x86/hyperv/hv_vtl.c:154:34: error: 'HVCALL_ENABLE_VP_VTL' undeclared (first use in this function)
>   154 |         status = hv_do_hypercall(HVCALL_ENABLE_VP_VTL, input, NULL);
>       |                                  ^~~~~~~~~~~~~~~~~~~~
> arch/x86/hyperv/hv_vtl.c:154:34: note: each undeclared identifier is reported only once for each function it appears in
> In file included from ./include/linux/string.h:390,
>                  from ./include/linux/bitmap.h:13,
>                  from ./include/linux/cpumask.h:12,
>                  from ./arch/x86/include/asm/apic.h:5,
>                  from arch/x86/hyperv/hv_vtl.c:9:
> arch/x86/hyperv/hv_vtl.c: In function 'hv_vtl_apicid_to_vp_id':
> arch/x86/hyperv/hv_vtl.c:189:32: error: invalid application of 'sizeof' to incomplete type 'struct hv_get_vp_from_apic_id_in'
>   189 |         memset(input, 0, sizeof(*input));
>       |                                ^
> ./include/linux/fortify-string.h:502:42: note: in definition of macro '__fortify_memset_chk'
>   502 |         size_t __fortify_size = (size_t)(size);                         \
>       |                                          ^~~~
> arch/x86/hyperv/hv_vtl.c:189:9: note: in expansion of macro 'memset'
>   189 |         memset(input, 0, sizeof(*input));
>       |         ^~~~~~
> arch/x86/hyperv/hv_vtl.c:190:14: error: invalid use of undefined type 'struct hv_get_vp_from_apic_id_in'
>   190 |         input->partition_id = HV_PARTITION_ID_SELF;
>       |              ^~
> arch/x86/hyperv/hv_vtl.c:191:14: error: invalid use of undefined type 'struct hv_get_vp_from_apic_id_in'
>   191 |         input->apic_ids[0] = apic_id;
>       |              ^~
> arch/x86/hyperv/hv_vtl.c:195:45: error: 'HVCALL_GET_VP_ID_FROM_APIC_ID' undeclared (first use in this function)
>   195 |         control = HV_HYPERCALL_REP_COMP_1 | HVCALL_GET_VP_ID_FROM_APIC_ID;
>       |                                             ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> 
> ...

Looks like I'm missing a one or two definitions in the new headers, and the
names have changed slightly in couple of cases. I'll do some more thorough
checking and have it all fixed for v2.

I didn't know about this allmodconfig target, that will make it a bit easier!

Nuno
Nuno Das Neves Oct. 5, 2024, 12:07 a.m. UTC | #5
On 10/4/2024 8:58 AM, Stanislav Kinsburskii wrote:
> Hi Nuno,
> 
> On Thu, Oct 03, 2024 at 12:51:04PM -0700, Nuno Das Neves wrote:
>> diff --git a/arch/arm64/hyperv/hv_core.c b/arch/arm64/hyperv/hv_core.c
>> index 9d1969b875e9..bb7f28f74bf4 100644
>> --- a/arch/arm64/hyperv/hv_core.c
>> +++ b/arch/arm64/hyperv/hv_core.c
>> @@ -14,6 +14,7 @@
>>  #include <linux/arm-smccc.h>
>>  #include <linux/module.h>
>>  #include <asm-generic/bug.h>
>> +#define HYPERV_NONTLFS_HEADERS
>>  #include <asm/mshyperv.h>
>>  
> 
> Perhaps it would be cleaner to introduce a new header file to be
> included, containing the new define and including <asm/mshyperv.h> instead.
> 
> Stas

If I understand correctly, you're suggesting adding another stub named e.g.
"hv_mshyperv.h", containing:

#define HYPERV_NONTLFS_HEADERS
#include<asm/mshyperv.h>

Then in the roughly 24 places in this patch where we have:

+#define HYPERV_NONTLFS_HEADERS

Instead, we'd have:

-#include <asm/mshyperv.h>
+#include <hyperv/hv_mshyperv.h>

I suppose the current version is a bit opaque - it's not immediately clear
why HYPERV_NONTLFs_HEADERS is defined, and that it must be defined before
including asm/mshyperv.h - someone reading the code would have to go find
hv_defs.h to puzzle that out.

This improves the situation slightly by associating the #define with
asm/mshyperv.h. I'll consider it for v2, thanks!

Nuno
diff mbox series

Patch

diff --git a/arch/arm64/hyperv/hv_core.c b/arch/arm64/hyperv/hv_core.c
index 9d1969b875e9..bb7f28f74bf4 100644
--- a/arch/arm64/hyperv/hv_core.c
+++ b/arch/arm64/hyperv/hv_core.c
@@ -14,6 +14,7 @@ 
 #include <linux/arm-smccc.h>
 #include <linux/module.h>
 #include <asm-generic/bug.h>
+#define HYPERV_NONTLFS_HEADERS
 #include <asm/mshyperv.h>
 
 /*
diff --git a/arch/arm64/hyperv/mshyperv.c b/arch/arm64/hyperv/mshyperv.c
index b1a4de4eee29..62b2a270ae65 100644
--- a/arch/arm64/hyperv/mshyperv.c
+++ b/arch/arm64/hyperv/mshyperv.c
@@ -15,6 +15,7 @@ 
 #include <linux/errno.h>
 #include <linux/version.h>
 #include <linux/cpuhotplug.h>
+#define HYPERV_NONTLFS_HEADERS
 #include <asm/mshyperv.h>
 
 static bool hyperv_initialized;
diff --git a/arch/x86/entry/vdso/vma.c b/arch/x86/entry/vdso/vma.c
index 6d83ceb7f1ba..5f4053c49658 100644
--- a/arch/x86/entry/vdso/vma.c
+++ b/arch/x86/entry/vdso/vma.c
@@ -25,6 +25,7 @@ 
 #include <asm/page.h>
 #include <asm/desc.h>
 #include <asm/cpufeature.h>
+#define HYPERV_NONTLFS_HEADERS
 #include <clocksource/hyperv_timer.h>
 
 #undef _ASM_X86_VVAR_H
diff --git a/arch/x86/hyperv/hv_apic.c b/arch/x86/hyperv/hv_apic.c
index f022d5f64fb6..4fe3b3b13256 100644
--- a/arch/x86/hyperv/hv_apic.c
+++ b/arch/x86/hyperv/hv_apic.c
@@ -26,6 +26,7 @@ 
 #include <linux/slab.h>
 #include <linux/cpuhotplug.h>
 #include <asm/hypervisor.h>
+#define HYPERV_NONTLFS_HEADERS
 #include <asm/mshyperv.h>
 #include <asm/apic.h>
 
diff --git a/arch/x86/hyperv/hv_init.c b/arch/x86/hyperv/hv_init.c
index fc3c3d76c181..680c4abc456e 100644
--- a/arch/x86/hyperv/hv_init.c
+++ b/arch/x86/hyperv/hv_init.c
@@ -19,6 +19,7 @@ 
 #include <asm/sev.h>
 #include <asm/ibt.h>
 #include <asm/hypervisor.h>
+#define HYPERV_NONTLFS_HEADERS
 #include <asm/mshyperv.h>
 #include <asm/idtentry.h>
 #include <asm/set_memory.h>
diff --git a/arch/x86/hyperv/hv_proc.c b/arch/x86/hyperv/hv_proc.c
index b74c06c04ff1..428542134b84 100644
--- a/arch/x86/hyperv/hv_proc.c
+++ b/arch/x86/hyperv/hv_proc.c
@@ -7,6 +7,7 @@ 
 #include <linux/cpuhotplug.h>
 #include <linux/minmax.h>
 #include <asm/hypervisor.h>
+#define HYPERV_NONTLFS_HEADERS
 #include <asm/mshyperv.h>
 #include <asm/apic.h>
 
@@ -176,7 +177,7 @@  int hv_call_create_vp(int node, u64 partition_id, u32 vp_index, u32 flags)
 		input->partition_id = partition_id;
 		input->vp_index = vp_index;
 		input->flags = flags;
-		input->subnode_type = HvSubnodeAny;
+		input->subnode_type = HV_SUBNODE_ANY;
 		input->proximity_domain_info = hv_numa_node_to_pxm_info(node);
 		status = hv_do_hypercall(HVCALL_CREATE_VP, input, NULL);
 		local_irq_restore(irq_flags);
diff --git a/arch/x86/hyperv/hv_spinlock.c b/arch/x86/hyperv/hv_spinlock.c
index 151e851bef09..7e8e2c03f669 100644
--- a/arch/x86/hyperv/hv_spinlock.c
+++ b/arch/x86/hyperv/hv_spinlock.c
@@ -12,6 +12,7 @@ 
 
 #include <linux/spinlock.h>
 
+#define HYPERV_NONTLFS_HEADERS
 #include <asm/mshyperv.h>
 #include <asm/paravirt.h>
 #include <asm/apic.h>
diff --git a/arch/x86/hyperv/hv_vtl.c b/arch/x86/hyperv/hv_vtl.c
index 04775346369c..a8bb6ad7efb6 100644
--- a/arch/x86/hyperv/hv_vtl.c
+++ b/arch/x86/hyperv/hv_vtl.c
@@ -10,6 +10,7 @@ 
 #include <asm/boot.h>
 #include <asm/desc.h>
 #include <asm/i8259.h>
+#define HYPERV_NONTLFS_HEADERS
 #include <asm/mshyperv.h>
 #include <asm/realmode.h>
 #include <../kernel/smpboot.h>
diff --git a/arch/x86/hyperv/irqdomain.c b/arch/x86/hyperv/irqdomain.c
index 3215a4a07408..977f90d08471 100644
--- a/arch/x86/hyperv/irqdomain.c
+++ b/arch/x86/hyperv/irqdomain.c
@@ -10,6 +10,7 @@ 
 
 #include <linux/pci.h>
 #include <linux/irq.h>
+#define HYPERV_NONTLFS_HEADERS
 #include <asm/mshyperv.h>
 
 static int hv_map_interrupt(union hv_device_id device_id, bool level,
diff --git a/arch/x86/hyperv/ivm.c b/arch/x86/hyperv/ivm.c
index b56d70612734..557a308e8e0a 100644
--- a/arch/x86/hyperv/ivm.c
+++ b/arch/x86/hyperv/ivm.c
@@ -9,6 +9,7 @@ 
 #include <linux/bitfield.h>
 #include <linux/types.h>
 #include <linux/slab.h>
+#define HYPERV_NONTLFS_HEADERS
 #include <asm/svm.h>
 #include <asm/sev.h>
 #include <asm/io.h>
diff --git a/arch/x86/hyperv/mmu.c b/arch/x86/hyperv/mmu.c
index cc8c3bd0e7c2..6bf9915611b8 100644
--- a/arch/x86/hyperv/mmu.c
+++ b/arch/x86/hyperv/mmu.c
@@ -5,6 +5,7 @@ 
 #include <linux/types.h>
 
 #include <asm/fpu/api.h>
+#define HYPERV_NONTLFS_HEADERS
 #include <asm/mshyperv.h>
 #include <asm/msr.h>
 #include <asm/tlbflush.h>
diff --git a/arch/x86/hyperv/nested.c b/arch/x86/hyperv/nested.c
index ee06d0315c24..03775d72b7f9 100644
--- a/arch/x86/hyperv/nested.c
+++ b/arch/x86/hyperv/nested.c
@@ -11,6 +11,7 @@ 
 
 
 #include <linux/types.h>
+#define HYPERV_NONTLFS_HEADERS
 #include <asm/mshyperv.h>
 #include <asm/tlbflush.h>
 
diff --git a/arch/x86/include/asm/vdso/gettimeofday.h b/arch/x86/include/asm/vdso/gettimeofday.h
index b2d2df026f6e..528ac66e366b 100644
--- a/arch/x86/include/asm/vdso/gettimeofday.h
+++ b/arch/x86/include/asm/vdso/gettimeofday.h
@@ -18,6 +18,7 @@ 
 #include <asm/unistd.h>
 #include <asm/msr.h>
 #include <asm/pvclock.h>
+#define HYPERV_NONTLFS_HEADERS
 #include <clocksource/hyperv_timer.h>
 
 #define __vdso_data (VVAR(_vdso_data))
diff --git a/arch/x86/kernel/cpu/mshyperv.c b/arch/x86/kernel/cpu/mshyperv.c
index 8e8fd23b1439..59bb8ab93dc2 100644
--- a/arch/x86/kernel/cpu/mshyperv.c
+++ b/arch/x86/kernel/cpu/mshyperv.c
@@ -20,6 +20,7 @@ 
 #include <linux/random.h>
 #include <asm/processor.h>
 #include <asm/hypervisor.h>
+#define HYPERV_NONTLFS_HEADERS
 #include <asm/mshyperv.h>
 #include <asm/desc.h>
 #include <asm/idtentry.h>
diff --git a/arch/x86/kernel/cpu/mtrr/generic.c b/arch/x86/kernel/cpu/mtrr/generic.c
index 7b29ebda024f..22228f2f550d 100644
--- a/arch/x86/kernel/cpu/mtrr/generic.c
+++ b/arch/x86/kernel/cpu/mtrr/generic.c
@@ -13,6 +13,7 @@ 
 #include <asm/cacheinfo.h>
 #include <asm/cpufeature.h>
 #include <asm/hypervisor.h>
+#define HYPERV_NONTLFS_HEADERS
 #include <asm/mshyperv.h>
 #include <asm/tlbflush.h>
 #include <asm/mtrr.h>
diff --git a/drivers/clocksource/hyperv_timer.c b/drivers/clocksource/hyperv_timer.c
index 1b7de45a7185..ec37476c4e15 100644
--- a/drivers/clocksource/hyperv_timer.c
+++ b/drivers/clocksource/hyperv_timer.c
@@ -22,6 +22,7 @@ 
 #include <linux/irq.h>
 #include <linux/acpi.h>
 #include <linux/hyperv.h>
+#define HYPERV_NONTLFS_HEADERS
 #include <clocksource/hyperv_timer.h>
 #include <asm/mshyperv.h>
 
diff --git a/drivers/hv/channel.c b/drivers/hv/channel.c
index fb8cd8469328..76d3c27e961e 100644
--- a/drivers/hv/channel.c
+++ b/drivers/hv/channel.c
@@ -19,6 +19,7 @@ 
 #include <linux/interrupt.h>
 #include <linux/set_memory.h>
 #include <asm/page.h>
+#define HYPERV_NONTLFS_HEADERS
 #include <asm/mshyperv.h>
 
 #include "hyperv_vmbus.h"
diff --git a/drivers/hv/channel_mgmt.c b/drivers/hv/channel_mgmt.c
index 3c6011a48dab..e6d56c73175a 100644
--- a/drivers/hv/channel_mgmt.c
+++ b/drivers/hv/channel_mgmt.c
@@ -20,6 +20,7 @@ 
 #include <linux/delay.h>
 #include <linux/cpu.h>
 #include <linux/hyperv.h>
+#define HYPERV_NONTLFS_HEADERS
 #include <asm/mshyperv.h>
 #include <linux/sched/isolation.h>
 
diff --git a/drivers/hv/connection.c b/drivers/hv/connection.c
index f001ae880e1d..88546b0c2242 100644
--- a/drivers/hv/connection.c
+++ b/drivers/hv/connection.c
@@ -21,6 +21,7 @@ 
 #include <linux/export.h>
 #include <linux/io.h>
 #include <linux/set_memory.h>
+#define HYPERV_NONTLFS_HEADERS
 #include <asm/mshyperv.h>
 
 #include "hyperv_vmbus.h"
diff --git a/drivers/hv/hv.c b/drivers/hv/hv.c
index e0d676c74f14..42f3790656e2 100644
--- a/drivers/hv/hv.c
+++ b/drivers/hv/hv.c
@@ -18,6 +18,7 @@ 
 #include <linux/clockchips.h>
 #include <linux/delay.h>
 #include <linux/interrupt.h>
+#define HYPERV_NONTLFS_HEADERS
 #include <clocksource/hyperv_timer.h>
 #include <asm/mshyperv.h>
 #include <linux/set_memory.h>
diff --git a/drivers/hv/hv_balloon.c b/drivers/hv/hv_balloon.c
index a120e9b80ded..6b270ee75747 100644
--- a/drivers/hv/hv_balloon.c
+++ b/drivers/hv/hv_balloon.c
@@ -28,6 +28,7 @@ 
 #include <linux/sizes.h>
 
 #include <linux/hyperv.h>
+#define HYPERV_NONTLFS_HEADERS
 #include <asm/mshyperv.h>
 
 #define CREATE_TRACE_POINTS
@@ -1583,7 +1584,7 @@  static int hv_free_page_report(struct page_reporting_dev_info *pr_dev_info,
 		return -ENOSPC;
 	}
 
-	hint->type = HV_EXT_MEMORY_HEAT_HINT_TYPE_COLD_DISCARD;
+	hint->heat_type = HV_EXTMEM_HEAT_HINT_COLD_DISCARD;
 	hint->reserved = 0;
 	for_each_sg(sgl, sg, nents, i) {
 		union hv_gpa_page_range *range;
diff --git a/drivers/hv/hv_common.c b/drivers/hv/hv_common.c
index a5217f837237..2723711868bc 100644
--- a/drivers/hv/hv_common.c
+++ b/drivers/hv/hv_common.c
@@ -28,6 +28,7 @@ 
 #include <linux/slab.h>
 #include <linux/dma-map-ops.h>
 #include <linux/set_memory.h>
+#define HYPERV_NONTLFS_HEADERS
 #include <asm/mshyperv.h>
 
 /*
diff --git a/drivers/hv/hv_util.c b/drivers/hv/hv_util.c
index c4f525325790..a17f6e6024a4 100644
--- a/drivers/hv/hv_util.c
+++ b/drivers/hv/hv_util.c
@@ -17,6 +17,7 @@ 
 #include <linux/hyperv.h>
 #include <linux/clockchips.h>
 #include <linux/ptp_clock_kernel.h>
+#define HYPERV_NONTLFS_HEADERS
 #include <asm/mshyperv.h>
 
 #include "hyperv_vmbus.h"
diff --git a/drivers/hv/ring_buffer.c b/drivers/hv/ring_buffer.c
index 3c9b02471760..6bfd064b4e65 100644
--- a/drivers/hv/ring_buffer.c
+++ b/drivers/hv/ring_buffer.c
@@ -18,6 +18,7 @@ 
 #include <linux/slab.h>
 #include <linux/prefetch.h>
 #include <linux/io.h>
+#define HYPERV_NONTLFS_HEADERS
 #include <asm/mshyperv.h>
 
 #include "hyperv_vmbus.h"
diff --git a/drivers/hv/vmbus_drv.c b/drivers/hv/vmbus_drv.c
index 7242c4920427..71745d62e064 100644
--- a/drivers/hv/vmbus_drv.c
+++ b/drivers/hv/vmbus_drv.c
@@ -36,6 +36,7 @@ 
 #include <linux/syscore_ops.h>
 #include <linux/dma-map-ops.h>
 #include <linux/pci.h>
+#define HYPERV_NONTLFS_HEADERS
 #include <clocksource/hyperv_timer.h>
 #include <asm/mshyperv.h>
 #include "hyperv_vmbus.h"
diff --git a/drivers/iommu/hyperv-iommu.c b/drivers/iommu/hyperv-iommu.c
index 8a5c17b97310..ade14cc9c071 100644
--- a/drivers/iommu/hyperv-iommu.c
+++ b/drivers/iommu/hyperv-iommu.c
@@ -20,6 +20,7 @@ 
 #include <asm/io_apic.h>
 #include <asm/irq_remapping.h>
 #include <asm/hypervisor.h>
+#define HYPERV_NONTLFS_HEADERS
 #include <asm/mshyperv.h>
 
 #include "irq_remapping.h"
diff --git a/drivers/net/hyperv/netvsc.c b/drivers/net/hyperv/netvsc.c
index 2b6ec979a62f..55095c02cc78 100644
--- a/drivers/net/hyperv/netvsc.c
+++ b/drivers/net/hyperv/netvsc.c
@@ -23,6 +23,7 @@ 
 #include <linux/filter.h>
 
 #include <asm/sync_bitops.h>
+#define HYPERV_NONTLFS_HEADERS
 #include <asm/mshyperv.h>
 
 #include "hyperv_net.h"
diff --git a/drivers/pci/controller/pci-hyperv.c b/drivers/pci/controller/pci-hyperv.c
index cdd5be16021d..261ff8b80caa 100644
--- a/drivers/pci/controller/pci-hyperv.c
+++ b/drivers/pci/controller/pci-hyperv.c
@@ -50,6 +50,7 @@ 
 #include <linux/irqdomain.h>
 #include <linux/acpi.h>
 #include <linux/sizes.h>
+#define HYPERV_NONTLFS_HEADERS
 #include <asm/mshyperv.h>
 
 /*
diff --git a/include/linux/hyperv.h b/include/linux/hyperv.h
index d0893ec488ae..64fd385723fc 100644
--- a/include/linux/hyperv.h
+++ b/include/linux/hyperv.h
@@ -24,7 +24,8 @@ 
 #include <linux/mod_devicetable.h>
 #include <linux/interrupt.h>
 #include <linux/reciprocal_div.h>
-#include <asm/hyperv-tlfs.h>
+#include <hyperv/hvhdk.h>
+#define HYPERV_NONTLFS_HEADERS
 
 #define MAX_PAGE_BUFFER_COUNT				32
 #define MAX_MULTIPAGE_BUFFER_COUNT			32 /* 128K */