diff --git a/drivers/xen/balloon.c b/drivers/xen/balloon.c index ce198b4..11226ad 100644 --- a/drivers/xen/balloon.c +++ b/drivers/xen/balloon.c @@ -274,7 +274,7 @@ static int increase_reservation(unsigned long nr_pages) set_phys_to_machine(pfn, mfn); /* Link back into the page tables if not highmem. */ - if (pfn < max_low_pfn) { + if (!xen_hvm_domain() && pfn < max_low_pfn) { int ret; ret = HYPERVISOR_update_va_mapping( (unsigned long)__va(pfn << PAGE_SHIFT), @@ -341,7 +341,7 @@ static int decrease_reservation(unsigned long nr_pages) set_phys_to_machine(lpfn, INVALID_P2M_ENTRY); page = pfn_to_page(lpfn); - if (!PageHighMem(page)) { + if (!xen_hvm_domain() && !PageHighMem(page)) { ret = HYPERVISOR_update_va_mapping( (unsigned long)__va(lpfn << PAGE_SHIFT), __pte_ma(0), 0); @@ -450,10 +450,10 @@ static struct notifier_block xenstore_notifier; static int __init balloon_init(void) { - unsigned long pfn, extra_pfn_end; + unsigned long pfn, nr_pages, extra_pfn_end; struct page *page; - if (!xen_pv_domain()) + if (!xen_domain()) return -ENODEV; pr_info("xen_balloon: Initialising balloon driver with page order %d.\n", @@ -461,7 +461,11 @@ static int __init balloon_init(void) balloon_npages = 1 << balloon_order; - balloon_stats.current_pages = (min(xen_start_info->nr_pages, max_pfn)) >> balloon_order; + if (xen_pv_domain()) + nr_pages = xen_start_info->nr_pages; + else + nr_pages = max_pfn; + balloon_stats.current_pages = min(nr_pages, max_pfn) >> balloon_order; balloon_stats.target_pages = balloon_stats.current_pages; balloon_stats.balloon_low = 0; balloon_stats.balloon_high = 0;