aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/hv
diff options
context:
space:
mode:
authorVitaly Kuznetsov <vkuznets@redhat.com>2015-03-27 12:10:11 -0400
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2015-04-03 10:18:02 -0400
commitd6cbd2c3a3db437708520c66f285c69ef028ac1f (patch)
treed79ffc10de64ea46e1107e883f13eec59441b7a3 /drivers/hv
parentaadc3780f31865edc84c587ab718a33a8eeeb09d (diff)
Drivers: hv: hv_balloon: do not online pages in offline blocks
Currently we add memory in 128Mb blocks but the request from host can be aligned differently. In such case we add a partially backed block and when this block goes online we skip onlining pages which are not backed (hv_online_page() callback serves this purpose). When we receive next request for the same host add region we online pages which were not backed before with hv_bring_pgs_online(). However, we don't check if the the block in question was onlined and online this tail unconditionally. This is bad as we avoid all online_pages() logic: these pages are not accounted, we don't send notifications (and hv_balloon is not the only receiver of them),... And, first of all, nobody asked as to online these pages. Solve the issue by checking if the last previously backed page was onlined and onlining the tail only in case it was. Signed-off-by: Vitaly Kuznetsov <vkuznets@redhat.com> Signed-off-by: K. Y. Srinivasan <kys@microsoft.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/hv')
-rw-r--r--drivers/hv/hv_balloon.c12
1 files changed, 11 insertions, 1 deletions
diff --git a/drivers/hv/hv_balloon.c b/drivers/hv/hv_balloon.c
index 014256a2ef88..99afef9393aa 100644
--- a/drivers/hv/hv_balloon.c
+++ b/drivers/hv/hv_balloon.c
@@ -778,7 +778,17 @@ static unsigned long handle_pg_range(unsigned long pg_start,
778 pgs_ol = has->ha_end_pfn - start_pfn; 778 pgs_ol = has->ha_end_pfn - start_pfn;
779 if (pgs_ol > pfn_cnt) 779 if (pgs_ol > pfn_cnt)
780 pgs_ol = pfn_cnt; 780 pgs_ol = pfn_cnt;
781 hv_bring_pgs_online(start_pfn, pgs_ol); 781
782 /*
783 * Check if the corresponding memory block is already
784 * online by checking its last previously backed page.
785 * In case it is we need to bring rest (which was not
786 * backed previously) online too.
787 */
788 if (start_pfn > has->start_pfn &&
789 !PageReserved(pfn_to_page(start_pfn - 1)))
790 hv_bring_pgs_online(start_pfn, pgs_ol);
791
782 has->covered_end_pfn += pgs_ol; 792 has->covered_end_pfn += pgs_ol;
783 pfn_cnt -= pgs_ol; 793 pfn_cnt -= pgs_ol;
784 } 794 }