]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
hyperv: Add CONFIG_MSHV_ROOT to gate root partition support
authorNuno Das Neves <nunodasneves@linux.microsoft.com>
Fri, 21 Feb 2025 19:56:35 +0000 (11:56 -0800)
committerWei Liu <wei.liu@kernel.org>
Thu, 20 Mar 2025 21:22:58 +0000 (21:22 +0000)
CONFIG_MSHV_ROOT allows kernels built to run as a normal Hyper-V guest
to exclude the root partition code, which is expected to grow
significantly over time.

This option is a tristate so future driver code can be built as a
(m)odule, allowing faster development iteration cycles.

If CONFIG_MSHV_ROOT is disabled, don't compile hv_proc.c, and stub
hv_root_partition() to return false unconditionally. This allows the
compiler to optimize away root partition code blocks since they will
be disabled at compile time.

In the case of booting as root partition *without* CONFIG_MSHV_ROOT
enabled, print a critical error (the kernel will likely crash).

Signed-off-by: Nuno Das Neves <nunodasneves@linux.microsoft.com>
Reviewed-by: Easwar Hariharan <eahariha@linux.microsoft.com>
Reviewed-by: Michael Kelley <mhklinux@outlook.com>
Link: https://lore.kernel.org/r/1740167795-13296-4-git-send-email-nunodasneves@linux.microsoft.com
Signed-off-by: Wei Liu <wei.liu@kernel.org>
Message-ID: <1740167795-13296-4-git-send-email-nunodasneves@linux.microsoft.com>

drivers/hv/Kconfig
drivers/hv/Makefile
drivers/hv/hv_common.c
include/asm-generic/mshyperv.h

index 862c47b191afe85b7aaf18fde71d46c8ec4c852b..3118d5472fab1be6e7930f77f6e884bfa2adf524 100644 (file)
@@ -55,4 +55,20 @@ config HYPERV_BALLOON
        help
          Select this option to enable Hyper-V Balloon driver.
 
+config MSHV_ROOT
+       tristate "Microsoft Hyper-V root partition support"
+       depends on HYPERV && (X86_64 || ARM64)
+       depends on !HYPERV_VTL_MODE
+       # The hypervisor interface operates on 4k pages. Enforcing it here
+       # simplifies many assumptions in the root partition code.
+       # e.g. When withdrawing memory, the hypervisor gives back 4k pages in
+       # no particular order, making it impossible to reassemble larger pages
+       depends on PAGE_SIZE_4KB
+       default n
+       help
+         Select this option to enable support for booting and running as root
+         partition on Microsoft Hyper-V.
+
+         If unsure, say N.
+
 endmenu
index 9afcabb3fbd24f57dc381d5d6cf0e9e83c4c36fd..2b8dc954b3504df0c93d1f716c5681f5bd883a31 100644 (file)
@@ -13,4 +13,5 @@ hv_vmbus-$(CONFIG_HYPERV_TESTING)     += hv_debugfs.o
 hv_utils-y := hv_util.o hv_kvp.o hv_snapshot.o hv_utils_transport.o
 
 # Code that must be built-in
-obj-$(subst m,y,$(CONFIG_HYPERV)) += hv_common.o hv_proc.o
+obj-$(subst m,y,$(CONFIG_HYPERV)) += hv_common.o
+obj-$(subst m,y,$(CONFIG_MSHV_ROOT)) += hv_proc.o
index 3d9cfcfbc854ab9cf1d5d98dce69dbcaf6ed9cdd..9804adb4cc567a7b1eeaf3b7818b419039165ec5 100644 (file)
@@ -734,6 +734,9 @@ void hv_identify_partition_type(void)
            (ms_hyperv.priv_high & HV_CPU_MANAGEMENT) &&
            !(ms_hyperv.priv_high & HV_ISOLATION)) {
                pr_info("Hyper-V: running as root partition\n");
-               hv_curr_partition_type = HV_PARTITION_TYPE_ROOT;
+               if (IS_ENABLED(CONFIG_MSHV_ROOT))
+                       hv_curr_partition_type = HV_PARTITION_TYPE_ROOT;
+               else
+                       pr_crit("Hyper-V: CONFIG_MSHV_ROOT not enabled!\n");
        }
 }
index 54ebd630e72c900d081839cadc81a6d2fe24b26a..b13b0cda4ac8af61d17a474e8ea130cf27428dee 100644 (file)
@@ -223,10 +223,6 @@ void *hv_alloc_hyperv_page(void);
 void *hv_alloc_hyperv_zeroed_page(void);
 void hv_free_hyperv_page(void *addr);
 
-int hv_call_deposit_pages(int node, u64 partition_id, u32 num_pages);
-int hv_call_add_logical_proc(int node, u32 lp_index, u32 acpi_id);
-int hv_call_create_vp(int node, u64 partition_id, u32 vp_index, u32 flags);
-
 /**
  * hv_cpu_number_to_vp_number() - Map CPU to VP.
  * @cpu_number: CPU number in Linux terms
@@ -327,9 +323,29 @@ static inline enum hv_isolation_type hv_get_isolation_type(void)
 }
 #endif /* CONFIG_HYPERV */
 
+#if IS_ENABLED(CONFIG_MSHV_ROOT)
 static inline bool hv_root_partition(void)
 {
        return hv_curr_partition_type == HV_PARTITION_TYPE_ROOT;
 }
+int hv_call_deposit_pages(int node, u64 partition_id, u32 num_pages);
+int hv_call_add_logical_proc(int node, u32 lp_index, u32 acpi_id);
+int hv_call_create_vp(int node, u64 partition_id, u32 vp_index, u32 flags);
+
+#else /* CONFIG_MSHV_ROOT */
+static inline bool hv_root_partition(void) { return false; }
+static inline int hv_call_deposit_pages(int node, u64 partition_id, u32 num_pages)
+{
+       return -EOPNOTSUPP;
+}
+static inline int hv_call_add_logical_proc(int node, u32 lp_index, u32 acpi_id)
+{
+       return -EOPNOTSUPP;
+}
+static inline int hv_call_create_vp(int node, u64 partition_id, u32 vp_index, u32 flags)
+{
+       return -EOPNOTSUPP;
+}
+#endif /* CONFIG_MSHV_ROOT */
 
 #endif