diff options
author | Michael Kelley <mikelley@microsoft.com> | 2021-03-02 13:38:13 -0800 |
---|---|---|
committer | Wei Liu <wei.liu@kernel.org> | 2021-03-08 17:32:59 +0000 |
commit | ca48739e59df31d16c27dbcd9ea2ea61d7caa9fb (patch) | |
tree | 3212f550f5f24e46a62d79324606b926a62635db /drivers/hv | |
parent | f850a4cad27c3cfeb89fd28c768d5e6821bf178f (diff) | |
download | linux-ca48739e59df31d16c27dbcd9ea2ea61d7caa9fb.tar.bz2 |
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>
Diffstat (limited to 'drivers/hv')
-rw-r--r-- | drivers/hv/hv.c | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/drivers/hv/hv.c b/drivers/hv/hv.c index f202ac7f4b3d..cca8d5ea61f0 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); +} + +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. |