Michael Kelley <mikelley@xxxxxxxxxxxxx> writes: > The Hyper-V page allocator functions are implemented in an architecture > neutral way. Move them into the architecture neutral VMbus module so > a separate implementation for ARM64 is not needed. > > No functional change. > > Signed-off-by: Michael Kelley <mikelley@xxxxxxxxxxxxx> > Reviewed-by: Boqun Feng <boqun.feng@xxxxxxxxx> > --- > arch/x86/hyperv/hv_init.c | 22 ---------------------- > arch/x86/include/asm/mshyperv.h | 5 ----- > drivers/hv/hv.c | 36 ++++++++++++++++++++++++++++++++++++ > include/asm-generic/mshyperv.h | 4 ++++ > 4 files changed, 40 insertions(+), 27 deletions(-) > > diff --git a/arch/x86/hyperv/hv_init.c b/arch/x86/hyperv/hv_init.c > index b81047d..4bdb344 100644 > --- a/arch/x86/hyperv/hv_init.c > +++ b/arch/x86/hyperv/hv_init.c > @@ -54,28 +54,6 @@ > u32 hv_max_vp_index; > EXPORT_SYMBOL_GPL(hv_max_vp_index); > > -void *hv_alloc_hyperv_page(void) > -{ > - BUILD_BUG_ON(PAGE_SIZE != HV_HYP_PAGE_SIZE); > - > - return (void *)__get_free_page(GFP_KERNEL); > -} > -EXPORT_SYMBOL_GPL(hv_alloc_hyperv_page); > - > -void *hv_alloc_hyperv_zeroed_page(void) > -{ > - BUILD_BUG_ON(PAGE_SIZE != HV_HYP_PAGE_SIZE); > - > - return (void *)__get_free_page(GFP_KERNEL | __GFP_ZERO); > -} > -EXPORT_SYMBOL_GPL(hv_alloc_hyperv_zeroed_page); > - > -void hv_free_hyperv_page(unsigned long addr) > -{ > - free_page(addr); > -} > -EXPORT_SYMBOL_GPL(hv_free_hyperv_page); > - > static int hv_cpu_init(unsigned int cpu) > { > u64 msr_vp_index; > diff --git a/arch/x86/include/asm/mshyperv.h b/arch/x86/include/asm/mshyperv.h > index ccf60a8..ef6e968 100644 > --- a/arch/x86/include/asm/mshyperv.h > +++ b/arch/x86/include/asm/mshyperv.h > @@ -233,9 +233,6 @@ static inline struct hv_vp_assist_page *hv_get_vp_assist_page(unsigned int cpu) > > void __init hyperv_init(void); > void hyperv_setup_mmu_ops(void); > -void *hv_alloc_hyperv_page(void); > -void *hv_alloc_hyperv_zeroed_page(void); > -void hv_free_hyperv_page(unsigned long addr); > void set_hv_tscchange_cb(void (*cb)(void)); > void clear_hv_tscchange_cb(void); > void hyperv_stop_tsc_emulation(void); > @@ -272,8 +269,6 @@ int hv_map_ioapic_interrupt(int ioapic_id, bool level, int vcpu, int vector, > #else /* CONFIG_HYPERV */ > static inline void hyperv_init(void) {} > static inline void hyperv_setup_mmu_ops(void) {} > -static inline void *hv_alloc_hyperv_page(void) { return NULL; } > -static inline void hv_free_hyperv_page(unsigned long addr) {} > static inline void set_hv_tscchange_cb(void (*cb)(void)) {} > static inline void clear_hv_tscchange_cb(void) {} > static inline void hyperv_stop_tsc_emulation(void) {}; > diff --git a/drivers/hv/hv.c b/drivers/hv/hv.c > index f202ac7..cca8d5e 100644 > --- a/drivers/hv/hv.c > +++ b/drivers/hv/hv.c > @@ -37,6 +37,42 @@ int hv_init(void) > } > > /* > + * Functions for allocating and freeing memory with size and > + * alignment HV_HYP_PAGE_SIZE. These functions are needed because > + * the guest page size may not be the same as the Hyper-V page > + * size. We depend upon kmalloc() aligning power-of-two size > + * allocations to the allocation size boundary, so that the > + * allocated memory appears to Hyper-V as a page of the size > + * it expects. > + */ > + > +void *hv_alloc_hyperv_page(void) > +{ > + BUILD_BUG_ON(PAGE_SIZE < HV_HYP_PAGE_SIZE); > + > + if (PAGE_SIZE == HV_HYP_PAGE_SIZE) > + return (void *)__get_free_page(GFP_KERNEL); > + else > + return kmalloc(HV_HYP_PAGE_SIZE, GFP_KERNEL); PAGE_SIZE and HV_HYP_PAGE_SIZE are known compile-time and in case this won't change in the future we can probably write this as #if PAGE_SIZE == HV_HYP_PAGE_SIZE return (void *)__get_free_page(GFP_KERNEL); #else return kmalloc(HV_HYP_PAGE_SIZE, GFP_KERNEL); #endif (not sure if the output is going to be any different with e.g. gcc's '-O2') > +} > + > +void *hv_alloc_hyperv_zeroed_page(void) > +{ > + if (PAGE_SIZE == HV_HYP_PAGE_SIZE) > + return (void *)__get_free_page(GFP_KERNEL | __GFP_ZERO); > + else > + return kzalloc(HV_HYP_PAGE_SIZE, GFP_KERNEL); > +} > + > +void hv_free_hyperv_page(unsigned long addr) > +{ > + if (PAGE_SIZE == HV_HYP_PAGE_SIZE) > + free_page(addr); > + else > + kfree((void *)addr); > +} > + > +/* > * hv_post_message - Post a message using the hypervisor message IPC. > * > * This involves a hypercall. > diff --git a/include/asm-generic/mshyperv.h b/include/asm-generic/mshyperv.h > index dff58a3..694b5bc 100644 > --- a/include/asm-generic/mshyperv.h > +++ b/include/asm-generic/mshyperv.h > @@ -117,6 +117,10 @@ static inline void vmbus_signal_eom(struct hv_message *msg, u32 old_msg_type) > /* Sentinel value for an uninitialized entry in hv_vp_index array */ > #define VP_INVAL U32_MAX > > +void *hv_alloc_hyperv_page(void); > +void *hv_alloc_hyperv_zeroed_page(void); > +void hv_free_hyperv_page(unsigned long addr); > + > /** > * hv_cpu_number_to_vp_number() - Map CPU to VP. > * @cpu_number: CPU number in Linux terms -- Vitaly