x86/xen: use vmap() to map grant table pages in PVH guests
authorDavid Vrabel <david.vrabel@citrix.com>
Tue, 5 Aug 2014 10:49:19 +0000 (11:49 +0100)
committerDavid Vrabel <david.vrabel@citrix.com>
Mon, 11 Aug 2014 10:59:35 +0000 (11:59 +0100)
Commit b7dd0e350e0b (x86/xen: safely map and unmap grant frames when
in atomic context) causes PVH guests to crash in
arch_gnttab_map_shared() when they attempted to map the pages for the
grant table.

This use of a PV-specific function during the PVH grant table setup is
non-obvious and not needed.  The standard vmap() function does the
right thing.

Signed-off-by: David Vrabel <david.vrabel@citrix.com>
Reported-by: Mukesh Rathor <mukesh.rathor@oracle.com>
Tested-by: Mukesh Rathor <mukesh.rathor@oracle.com>
Cc: stable@vger.kernel.org
arch/x86/xen/grant-table.c

index c0413046483ae9862c1d487348b3a701a2045e3a..1580e7a5a4cf7600d0f424ddd5a66d76efef6b2f 100644 (file)
@@ -118,6 +118,7 @@ static int __init xlated_setup_gnttab_pages(void)
 {
        struct page **pages;
        xen_pfn_t *pfns;
+       void *vaddr;
        int rc;
        unsigned int i;
        unsigned long nr_grant_frames = gnttab_max_grant_frames();
@@ -143,21 +144,20 @@ static int __init xlated_setup_gnttab_pages(void)
        for (i = 0; i < nr_grant_frames; i++)
                pfns[i] = page_to_pfn(pages[i]);
 
-       rc = arch_gnttab_map_shared(pfns, nr_grant_frames, nr_grant_frames,
-                                   &xen_auto_xlat_grant_frames.vaddr);
-
-       if (rc) {
+       vaddr = vmap(pages, nr_grant_frames, 0, PAGE_KERNEL);
+       if (!vaddr) {
                pr_warn("%s Couldn't map %ld pfns rc:%d\n", __func__,
                        nr_grant_frames, rc);
                free_xenballooned_pages(nr_grant_frames, pages);
                kfree(pages);
                kfree(pfns);
-               return rc;
+               return -ENOMEM;
        }
        kfree(pages);
 
        xen_auto_xlat_grant_frames.pfn = pfns;
        xen_auto_xlat_grant_frames.count = nr_grant_frames;
+       xen_auto_xlat_grant_frames.vaddr = vaddr;
 
        return 0;
 }