Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input
[linux] / drivers / xen / balloon.c
index 065f0b6..e12bb25 100644 (file)
@@ -71,6 +71,7 @@
 #include <xen/balloon.h>
 #include <xen/features.h>
 #include <xen/page.h>
+#include <xen/mem-reservation.h>
 
 static int xen_hotplug_unpopulated;
 
@@ -157,13 +158,6 @@ static DECLARE_DELAYED_WORK(balloon_worker, balloon_process);
 #define GFP_BALLOON \
        (GFP_HIGHUSER | __GFP_NOWARN | __GFP_NORETRY | __GFP_NOMEMALLOC)
 
-static void scrub_page(struct page *page)
-{
-#ifdef CONFIG_XEN_SCRUB_PAGES
-       clear_highpage(page);
-#endif
-}
-
 /* balloon_append: add the given page to the balloon. */
 static void __balloon_append(struct page *page)
 {
@@ -463,11 +457,6 @@ static enum bp_state increase_reservation(unsigned long nr_pages)
        int rc;
        unsigned long i;
        struct page   *page;
-       struct xen_memory_reservation reservation = {
-               .address_bits = 0,
-               .extent_order = EXTENT_ORDER,
-               .domid        = DOMID_SELF
-       };
 
        if (nr_pages > ARRAY_SIZE(frame_list))
                nr_pages = ARRAY_SIZE(frame_list);
@@ -479,16 +468,11 @@ static enum bp_state increase_reservation(unsigned long nr_pages)
                        break;
                }
 
-               /* XENMEM_populate_physmap requires a PFN based on Xen
-                * granularity.
-                */
                frame_list[i] = page_to_xen_pfn(page);
                page = balloon_next_page(page);
        }
 
-       set_xen_guest_handle(reservation.extent_start, frame_list);
-       reservation.nr_extents = nr_pages;
-       rc = HYPERVISOR_memory_op(XENMEM_populate_physmap, &reservation);
+       rc = xenmem_reservation_increase(nr_pages, frame_list);
        if (rc <= 0)
                return BP_EAGAIN;
 
@@ -496,29 +480,7 @@ static enum bp_state increase_reservation(unsigned long nr_pages)
                page = balloon_retrieve(false);
                BUG_ON(page == NULL);
 
-#ifdef CONFIG_XEN_HAVE_PVMMU
-               /*
-                * We don't support PV MMU when Linux and Xen is using
-                * different page granularity.
-                */
-               BUILD_BUG_ON(XEN_PAGE_SIZE != PAGE_SIZE);
-
-               if (!xen_feature(XENFEAT_auto_translated_physmap)) {
-                       unsigned long pfn = page_to_pfn(page);
-
-                       set_phys_to_machine(pfn, frame_list[i]);
-
-                       /* Link back into the page tables if not highmem. */
-                       if (!PageHighMem(page)) {
-                               int ret;
-                               ret = HYPERVISOR_update_va_mapping(
-                                               (unsigned long)__va(pfn << PAGE_SHIFT),
-                                               mfn_pte(frame_list[i], PAGE_KERNEL),
-                                               0);
-                               BUG_ON(ret);
-                       }
-               }
-#endif
+               xenmem_reservation_va_mapping_update(1, &page, &frame_list[i]);
 
                /* Relinquish the page back to the allocator. */
                free_reserved_page(page);
@@ -535,11 +497,6 @@ static enum bp_state decrease_reservation(unsigned long nr_pages, gfp_t gfp)
        unsigned long i;
        struct page *page, *tmp;
        int ret;
-       struct xen_memory_reservation reservation = {
-               .address_bits = 0,
-               .extent_order = EXTENT_ORDER,
-               .domid        = DOMID_SELF
-       };
        LIST_HEAD(pages);
 
        if (nr_pages > ARRAY_SIZE(frame_list))
@@ -553,7 +510,7 @@ static enum bp_state decrease_reservation(unsigned long nr_pages, gfp_t gfp)
                        break;
                }
                adjust_managed_page_count(page, -1);
-               scrub_page(page);
+               xenmem_reservation_scrub_page(page);
                list_add(&page->lru, &pages);
        }
 
@@ -572,28 +529,10 @@ static enum bp_state decrease_reservation(unsigned long nr_pages, gfp_t gfp)
         */
        i = 0;
        list_for_each_entry_safe(page, tmp, &pages, lru) {
-               /* XENMEM_decrease_reservation requires a GFN */
                frame_list[i++] = xen_page_to_gfn(page);
 
-#ifdef CONFIG_XEN_HAVE_PVMMU
-               /*
-                * We don't support PV MMU when Linux and Xen is using
-                * different page granularity.
-                */
-               BUILD_BUG_ON(XEN_PAGE_SIZE != PAGE_SIZE);
-
-               if (!xen_feature(XENFEAT_auto_translated_physmap)) {
-                       unsigned long pfn = page_to_pfn(page);
+               xenmem_reservation_va_mapping_reset(1, &page);
 
-                       if (!PageHighMem(page)) {
-                               ret = HYPERVISOR_update_va_mapping(
-                                               (unsigned long)__va(pfn << PAGE_SHIFT),
-                                               __pte_ma(0), 0);
-                               BUG_ON(ret);
-                       }
-                       __set_phys_to_machine(pfn, INVALID_P2M_ENTRY);
-               }
-#endif
                list_del(&page->lru);
 
                balloon_append(page);
@@ -601,9 +540,7 @@ static enum bp_state decrease_reservation(unsigned long nr_pages, gfp_t gfp)
 
        flush_tlb_all();
 
-       set_xen_guest_handle(reservation.extent_start, frame_list);
-       reservation.nr_extents   = nr_pages;
-       ret = HYPERVISOR_memory_op(XENMEM_decrease_reservation, &reservation);
+       ret = xenmem_reservation_decrease(nr_pages, frame_list);
        BUG_ON(ret != nr_pages);
 
        balloon_stats.current_pages -= nr_pages;