From 807bf8c89b08a58324c067da05da74bc404d5389 Mon Sep 17 00:00:00 2001 From: "K. Y. Srinivasan" Date: Mon, 18 Mar 2013 13:51:37 -0700 Subject: [PATCH] --- yaml --- r: 363171 b: refs/heads/master c: f766dc1ea576fcdfbf2bc5638757ddbdacfb5a69 h: refs/heads/master i: 363169: 2314c58840b6c957d7c1e4ea050688ddeb19416b 363167: 0a24984b0ba04febc6fc2181417bbc6ae275b6b1 v: v3 --- [refs] | 2 +- trunk/drivers/hv/hv_balloon.c | 18 ++++++++++++++++-- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/[refs] b/[refs] index 04c4267c59fe..1edd796bfa19 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 5853ff23c2f0f6c87a859e7f882eac3300b329a0 +refs/heads/master: f766dc1ea576fcdfbf2bc5638757ddbdacfb5a69 diff --git a/trunk/drivers/hv/hv_balloon.c b/trunk/drivers/hv/hv_balloon.c index 2250bf532bb0..d1b4a4624d81 100644 --- a/trunk/drivers/hv/hv_balloon.c +++ b/trunk/drivers/hv/hv_balloon.c @@ -1004,6 +1004,14 @@ static int alloc_balloon_pages(struct hv_dynmem_device *dm, int num_pages, dm->num_pages_ballooned += alloc_unit; + /* + * If we allocatted 2M pages; split them so we + * can free them in any order we get. + */ + + if (alloc_unit != 1) + split_page(pg, get_order(alloc_unit << PAGE_SHIFT)); + bl_resp->range_count++; bl_resp->range_array[i].finfo.start_page = page_to_pfn(pg); @@ -1030,9 +1038,10 @@ static void balloon_up(struct work_struct *dummy) /* - * Currently, we only support 4k allocations. + * We will attempt 2M allocations. However, if we fail to + * allocate 2M chunks, we will go back to 4k allocations. */ - alloc_unit = 1; + alloc_unit = 512; while (!done) { bl_resp = (struct dm_balloon_response *)send_buffer; @@ -1048,6 +1057,11 @@ static void balloon_up(struct work_struct *dummy) bl_resp, alloc_unit, &alloc_error); + if ((alloc_error) && (alloc_unit != 1)) { + alloc_unit = 1; + continue; + } + if ((alloc_error) || (num_ballooned == num_pages)) { bl_resp->more_pages = 0; done = true;