aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/virt/vboxguest/vboxguest_utils.c
diff options
context:
space:
mode:
authorHans de Goede <hdegoede@redhat.com>2018-04-18 15:24:49 +0200
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2018-04-23 13:41:55 +0200
commitfaf6a2a44164c0fb2c2a82692ab9051917514bce (patch)
treeb7ed81ebf85416b394564e24e2200aa751934358 /drivers/virt/vboxguest/vboxguest_utils.c
parentvirt: vbox: Add vbg_req_free() helper function (diff)
downloadlinux-dev-faf6a2a44164c0fb2c2a82692ab9051917514bce.tar.xz
linux-dev-faf6a2a44164c0fb2c2a82692ab9051917514bce.zip
virt: vbox: Use __get_free_pages instead of kmalloc for DMA32 memory
It is not possible to get DMA32 zone memory through kmalloc, causing the vboxguest driver to malfunction due to getting memory above 4G which the PCI device cannot handle. This commit changes the kmalloc calls where the 4G limit matters to using __get_free_pages() fixing vboxguest not working on x86_64 guests with more then 4G RAM. Cc: stable@vger.kernel.org Reported-by: Eloy Coto Pereiro <eloy.coto@gmail.com> Signed-off-by: Hans de Goede <hdegoede@redhat.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/virt/vboxguest/vboxguest_utils.c')
-rw-r--r--drivers/virt/vboxguest/vboxguest_utils.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/drivers/virt/vboxguest/vboxguest_utils.c b/drivers/virt/vboxguest/vboxguest_utils.c
index bad915463359..bf4474214b4d 100644
--- a/drivers/virt/vboxguest/vboxguest_utils.c
+++ b/drivers/virt/vboxguest/vboxguest_utils.c
@@ -65,8 +65,9 @@ VBG_LOG(vbg_debug, pr_debug);
void *vbg_req_alloc(size_t len, enum vmmdev_request_type req_type)
{
struct vmmdev_request_header *req;
+ int order = get_order(PAGE_ALIGN(len));
- req = kmalloc(len, GFP_KERNEL | __GFP_DMA32);
+ req = (void *)__get_free_pages(GFP_KERNEL | GFP_DMA32, order);
if (!req)
return NULL;
@@ -87,7 +88,7 @@ void vbg_req_free(void *req, size_t len)
if (!req)
return;
- kfree(req);
+ free_pages((unsigned long)req, get_order(PAGE_ALIGN(len)));
}
/* Note this function returns a VBox status code, not a negative errno!! */