mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-08-05 16:54:27 +00:00
Drivers: hv: vmbus: Move Hyper-V page allocator to arch neutral code
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@microsoft.com> Reviewed-by: Boqun Feng <boqun.feng@gmail.com> Link: https://lore.kernel.org/r/1614721102-2241-2-git-send-email-mikelley@microsoft.com Signed-off-by: Wei Liu <wei.liu@kernel.org>
This commit is contained in:
parent
f850a4cad2
commit
ca48739e59
4 changed files with 40 additions and 27 deletions
|
@ -54,28 +54,6 @@ EXPORT_SYMBOL_GPL(hyperv_pcpu_output_arg);
|
||||||
u32 hv_max_vp_index;
|
u32 hv_max_vp_index;
|
||||||
EXPORT_SYMBOL_GPL(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)
|
static int hv_cpu_init(unsigned int cpu)
|
||||||
{
|
{
|
||||||
u64 msr_vp_index;
|
u64 msr_vp_index;
|
||||||
|
|
|
@ -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 __init hyperv_init(void);
|
||||||
void hyperv_setup_mmu_ops(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 set_hv_tscchange_cb(void (*cb)(void));
|
||||||
void clear_hv_tscchange_cb(void);
|
void clear_hv_tscchange_cb(void);
|
||||||
void hyperv_stop_tsc_emulation(void);
|
void hyperv_stop_tsc_emulation(void);
|
||||||
|
@ -272,8 +269,6 @@ int hv_unmap_ioapic_interrupt(int ioapic_id, struct hv_interrupt_entry *entry);
|
||||||
#else /* CONFIG_HYPERV */
|
#else /* CONFIG_HYPERV */
|
||||||
static inline void hyperv_init(void) {}
|
static inline void hyperv_init(void) {}
|
||||||
static inline void hyperv_setup_mmu_ops(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 set_hv_tscchange_cb(void (*cb)(void)) {}
|
||||||
static inline void clear_hv_tscchange_cb(void) {}
|
static inline void clear_hv_tscchange_cb(void) {}
|
||||||
static inline void hyperv_stop_tsc_emulation(void) {};
|
static inline void hyperv_stop_tsc_emulation(void) {};
|
||||||
|
|
|
@ -36,6 +36,42 @@ int hv_init(void)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 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);
|
||||||
|
}
|
||||||
|
|
||||||
|
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.
|
* hv_post_message - Post a message using the hypervisor message IPC.
|
||||||
*
|
*
|
||||||
|
|
|
@ -117,6 +117,10 @@ extern u32 hv_max_vp_index;
|
||||||
/* Sentinel value for an uninitialized entry in hv_vp_index array */
|
/* Sentinel value for an uninitialized entry in hv_vp_index array */
|
||||||
#define VP_INVAL U32_MAX
|
#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.
|
* hv_cpu_number_to_vp_number() - Map CPU to VP.
|
||||||
* @cpu_number: CPU number in Linux terms
|
* @cpu_number: CPU number in Linux terms
|
||||||
|
|
Loading…
Add table
Reference in a new issue