]> git.karo-electronics.de Git - mv-sheeva.git/commitdiff
xen/blkback: Use 'vzalloc' for page arrays and pre-allocate pages.
authorKonrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Tue, 1 Mar 2011 21:26:10 +0000 (16:26 -0500)
committerKonrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Thu, 14 Apr 2011 22:26:23 +0000 (18:26 -0400)
Previously we would allocate the array for page using 'kmalloc' which
we can as easily do with 'vzalloc'. The pre-allocation of pages
was done a bit differently in the past - it used to be that
the balloon driver would export "alloc_empty_pages_and_pagevec"
which would have in one function created an array, allocated
the pages, balloned the pages out (so the memory behind those
pages would be non-present), and provide us those pages.

This was OK as those pages were shared between other guest and
the only thing we needed was to "swizzel" the MFN of those pages
to point to the other guest MFN. We can still "swizzel" the MFNs
using the M2P (and P2M) override API calls, but for the sake of
simplicity we are dropping the balloon API calls. We can return
to those later on.

Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
drivers/xen/blkback/blkback.c

index eda50646775d6d69f4d6c928a4cdf91a47cfbbf0..d32198d1be0431b087e73ab10778c8c81a782f67 100644 (file)
@@ -637,18 +637,23 @@ static int __init blkif_init(void)
 
        blkbk->pending_reqs          = kmalloc(sizeof(blkbk->pending_reqs[0]) *
                                        blkif_reqs, GFP_KERNEL);
-       blkbk->pending_grant_handles = kmalloc(sizeof(blkbk->pending_grant_handles[0]) *
-                                       mmap_pages, GFP_KERNEL);
-       blkbk->pending_pages         = alloc_empty_pages_and_pagevec(mmap_pages);
+       blkbk->pending_grant_handles = vzalloc(sizeof(blkbk->pending_grant_handles[0]) *
+                                       mmap_pages);
+       blkbk->pending_pages         = vzalloc(sizeof(blkbk->pending_pages[0]) * mmap_pages);
 
        if (!blkbk->pending_reqs || !blkbk->pending_grant_handles || !blkbk->pending_pages) {
                rc = -ENOMEM;
                goto out_of_memory;
        }
 
-       for (i = 0; i < mmap_pages; i++)
+       for (i = 0; i < mmap_pages; i++) {
                blkbk->pending_grant_handles[i] = BLKBACK_INVALID_HANDLE;
-
+               blkbk->pending_pages[i] = alloc_page(GFP_KERNEL | __GFP_HIGHMEM);
+               if (blkbk->pending_pages[i] == NULL) {
+                       rc = -ENOMEM;
+                       goto out_of_memory;
+               }
+       }
        rc = blkif_interface_init();
        if (rc)
                goto failed_init;
@@ -672,8 +677,12 @@ static int __init blkif_init(void)
        printk(KERN_ERR "%s: out of memory\n", __func__);
  failed_init:
        kfree(blkbk->pending_reqs);
-       kfree(blkbk->pending_grant_handles);
-       free_empty_pages_and_pagevec(blkbk->pending_pages, mmap_pages);
+       vfree(blkbk->pending_grant_handles);
+       for (i = 0; i < mmap_pages; i++) {
+               if (blkbk->pending_pages[i])
+                       __free_page(blkbk->pending_pages[i]);
+       }
+       vfree(blkbk->pending_pages);
        vfree(blkbk);
        blkbk = NULL;
        return rc;