Message ID | 1740167795-13296-4-git-send-email-nunodasneves@linux.microsoft.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | Introduce CONFIG_MSHV_ROOT for root partition code | expand |
From: Nuno Das Neves <nunodasneves@linux.microsoft.com> Sent: Friday, February 21, 2025 11:57 AM > > 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> > --- > drivers/hv/Kconfig | 16 ++++++++++++++++ > drivers/hv/Makefile | 3 ++- > drivers/hv/hv_common.c | 5 ++++- > include/asm-generic/mshyperv.h | 24 ++++++++++++++++++++---- > 4 files changed, 42 insertions(+), 6 deletions(-) Reviewed-by: Michael Kelley <mhklinux@outlook.com> > > diff --git a/drivers/hv/Kconfig b/drivers/hv/Kconfig > index 862c47b191af..794e88e9dc6b 100644 > --- a/drivers/hv/Kconfig > +++ b/drivers/hv/Kconfig > @@ -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 > + 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 > diff --git a/drivers/hv/Makefile b/drivers/hv/Makefile > index 9afcabb3fbd2..2b8dc954b350 100644 > --- a/drivers/hv/Makefile > +++ b/drivers/hv/Makefile > @@ -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 > diff --git a/drivers/hv/hv_common.c b/drivers/hv/hv_common.c > index 3d9cfcfbc854..9804adb4cc56 100644 > --- a/drivers/hv/hv_common.c > +++ b/drivers/hv/hv_common.c > @@ -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"); > } > } > diff --git a/include/asm-generic/mshyperv.h b/include/asm-generic/mshyperv.h > index 54ebd630e72c..b13b0cda4ac8 100644 > --- a/include/asm-generic/mshyperv.h > +++ b/include/asm-generic/mshyperv.h > @@ -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 > -- > 2.34.1
diff --git a/drivers/hv/Kconfig b/drivers/hv/Kconfig index 862c47b191af..794e88e9dc6b 100644 --- a/drivers/hv/Kconfig +++ b/drivers/hv/Kconfig @@ -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 + 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 diff --git a/drivers/hv/Makefile b/drivers/hv/Makefile index 9afcabb3fbd2..2b8dc954b350 100644 --- a/drivers/hv/Makefile +++ b/drivers/hv/Makefile @@ -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 diff --git a/drivers/hv/hv_common.c b/drivers/hv/hv_common.c index 3d9cfcfbc854..9804adb4cc56 100644 --- a/drivers/hv/hv_common.c +++ b/drivers/hv/hv_common.c @@ -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"); } } diff --git a/include/asm-generic/mshyperv.h b/include/asm-generic/mshyperv.h index 54ebd630e72c..b13b0cda4ac8 100644 --- a/include/asm-generic/mshyperv.h +++ b/include/asm-generic/mshyperv.h @@ -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