Commit 461fbbd0 authored by Nuno Das Neves's avatar Nuno Das Neves Committed by Wei Liu
Browse files

hyperv: Add CONFIG_MSHV_ROOT to gate root partition support



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: default avatarNuno Das Neves <nunodasneves@linux.microsoft.com>
Reviewed-by: default avatarEaswar Hariharan <eahariha@linux.microsoft.com>
Reviewed-by: default avatarMichael Kelley <mhklinux@outlook.com>
Link: https://lore.kernel.org/r/1740167795-13296-4-git-send-email-nunodasneves@linux.microsoft.com


Signed-off-by: default avatarWei Liu <wei.liu@kernel.org>
Message-ID: <1740167795-13296-4-git-send-email-nunodasneves@linux.microsoft.com>
parent db912b89
Loading
Loading
Loading
Loading
+16 −0
Original line number Diff line number Diff line
@@ -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
+2 −1
Original line number Diff line number Diff line
@@ -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
+4 −1
Original line number Diff line number Diff line
@@ -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");
		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");
	}
}
+20 −4
Original line number Diff line number Diff line
@@ -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