lkml.org 
[lkml]   [2011]   [Sep]   [8]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[PATCH v4 1/2] xen: add an "highmem" parameter to alloc_xenballooned_pages
    Add an highmem parameter to alloc_xenballooned_pages, to allow callers to
    request lowmem or highmem pages.

    Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
    ---
    drivers/xen/balloon.c | 12 ++++++++----
    drivers/xen/gntdev.c | 2 +-
    include/xen/balloon.h | 3 ++-
    3 files changed, 11 insertions(+), 6 deletions(-)

    diff --git a/drivers/xen/balloon.c b/drivers/xen/balloon.c
    index 5dfd8f8..7f7d463 100644
    --- a/drivers/xen/balloon.c
    +++ b/drivers/xen/balloon.c
    @@ -501,20 +501,24 @@ EXPORT_SYMBOL_GPL(balloon_set_new_target);
    * alloc_xenballooned_pages - get pages that have been ballooned out
    * @nr_pages: Number of pages to get
    * @pages: pages returned
    + * @highmem: highmem or lowmem pages
    * @return 0 on success, error otherwise
    */
    -int alloc_xenballooned_pages(int nr_pages, struct page** pages)
    +int alloc_xenballooned_pages(int nr_pages, struct page** pages, bool highmem)
    {
    int pgno = 0;
    struct page* page;
    mutex_lock(&balloon_mutex);
    while (pgno < nr_pages) {
    - page = balloon_retrieve(true);
    - if (page) {
    + page = balloon_retrieve(highmem);
    + if (page && PageHighMem(page) == highmem) {
    pages[pgno++] = page;
    } else {
    enum bp_state st;
    - st = decrease_reservation(nr_pages - pgno, GFP_HIGHUSER);
    + if (page)
    + balloon_append(page);
    + st = decrease_reservation(nr_pages - pgno,
    + highmem ? GFP_HIGHUSER : GFP_USER);
    if (st != BP_DONE)
    goto out_undo;
    }
    diff --git a/drivers/xen/gntdev.c b/drivers/xen/gntdev.c
    index f914b26..7b9b1d1 100644
    --- a/drivers/xen/gntdev.c
    +++ b/drivers/xen/gntdev.c
    @@ -123,7 +123,7 @@ static struct grant_map *gntdev_alloc_map(struct gntdev_priv *priv, int count)
    NULL == add->pages)
    goto err;

    - if (alloc_xenballooned_pages(count, add->pages))
    + if (alloc_xenballooned_pages(count, add->pages, false /* lowmem */))
    goto err;

    for (i = 0; i < count; i++) {
    diff --git a/include/xen/balloon.h b/include/xen/balloon.h
    index 76f7538..b1a8233 100644
    --- a/include/xen/balloon.h
    +++ b/include/xen/balloon.h
    @@ -25,7 +25,8 @@ extern struct balloon_stats balloon_stats;

    void balloon_set_new_target(unsigned long target);

    -int alloc_xenballooned_pages(int nr_pages, struct page** pages);
    +int alloc_xenballooned_pages(int nr_pages, struct page** pages,
    + bool highmem);
    void free_xenballooned_pages(int nr_pages, struct page** pages);

    struct sys_device;
    --
    1.7.2.3


    \
     
     \ /
      Last update: 2011-09-09 01:17    [W:0.022 / U:0.284 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site