# HG changeset patch # User yamahata@xxxxxxxxxxxxx # Node ID 498db9021959b066cabafcd3dcbd1ac069f7f02a # Parent 1c59cefee0e48990384ab183db81d82e890f59a9 dom0 vp model: remove populate_physmap hypercall which becomes unnecesarry because xenmem operation is fully supported by the previous patch. PATCHNAME: remove_populate_physmap_linux Signed-off-by: Isaku Yamahata diff -r 1c59cefee0e4 -r 498db9021959 linux-2.6-xen-sparse/arch/ia64/xen/drivers/Makefile --- a/linux-2.6-xen-sparse/arch/ia64/xen/drivers/Makefile Fri May 12 19:59:44 2006 +0900 +++ b/linux-2.6-xen-sparse/arch/ia64/xen/drivers/Makefile Fri May 12 19:59:46 2006 +0900 @@ -8,7 +8,7 @@ obj-y += core/ #obj-y += char/ obj-y += console/ obj-y += evtchn/ -#obj-y += balloon/ +obj-$(CONFIG_XEN_IA64_DOM0_VP) += balloon/ obj-y += privcmd/ obj-y += xenbus/ diff -r 1c59cefee0e4 -r 498db9021959 linux-2.6-xen-sparse/arch/ia64/xen/hypervisor.c --- a/linux-2.6-xen-sparse/arch/ia64/xen/hypervisor.c Fri May 12 19:59:44 2006 +0900 +++ b/linux-2.6-xen-sparse/arch/ia64/xen/hypervisor.c Fri May 12 19:59:46 2006 +0900 @@ -26,14 +26,8 @@ #include #include #include - -#define XEN_IA64_BALLOON_IS_NOT_YET -#ifndef XEN_IA64_BALLOON_IS_NOT_YET +#include #include -#else -#define balloon_lock(flags) ((void)flags) -#define balloon_unlock(flags) ((void)flags) -#endif //XXX xen/ia64 copy_from_guest() is broken. // This is a temporal work around until it is fixed. @@ -148,6 +142,39 @@ static void contiguous_bitmap_clear( } } +static unsigned long +HYPERVISOR_populate_physmap(unsigned long gpfn, unsigned int extent_order, + unsigned int address_bits) +{ + unsigned long ret; + struct xen_memory_reservation reservation = { + .nr_extents = 1, + .address_bits = address_bits, + .extent_order = extent_order, + .domid = DOMID_SELF + }; + set_xen_guest_handle(reservation.extent_start, &gpfn); + ret = HYPERVISOR_memory_op(XENMEM_populate_physmap, &reservation); + BUG_ON(ret != 1); + return 0; +} + +static unsigned long +HYPERVISOR_remove_physmap(unsigned long gpfn, unsigned int extent_order) +{ + unsigned long ret; + struct xen_memory_reservation reservation = { + .nr_extents = 1, + .address_bits = 0, + .extent_order = extent_order, + .domid = DOMID_SELF + }; + set_xen_guest_handle(reservation.extent_start, &gpfn); + ret = HYPERVISOR_memory_op(XENMEM_decrease_reservation, &reservation); + BUG_ON(ret != 1); + return 0; +} + /* Ensure multi-page extents are contiguous in machine memory. */ int __xen_create_contiguous_region(unsigned long vstart, @@ -156,29 +183,29 @@ __xen_create_contiguous_region(unsigned unsigned long error = 0; unsigned long gphys = __pa(vstart); unsigned long start_gpfn = gphys >> PAGE_SHIFT; - unsigned long num_pfn = 1 << order; + unsigned long num_gpfn = 1 << order; unsigned long i; unsigned long flags; - scrub_pages(vstart, 1 << order); + scrub_pages(vstart, num_gpfn); balloon_lock(flags); - //XXX order - for (i = 0; i < num_pfn; i++) { - error = HYPERVISOR_zap_physmap(start_gpfn + i, 0); - if (error) { - goto out; - } + error = HYPERVISOR_remove_physmap(start_gpfn, order); + if (error) { + goto fail; } error = HYPERVISOR_populate_physmap(start_gpfn, order, address_bits); - contiguous_bitmap_set(start_gpfn, 1UL << order); + if (error) { + goto fail; + } + contiguous_bitmap_set(start_gpfn, num_gpfn); #if 0 { unsigned long mfn; unsigned long mfn_prev = ~0UL; - for (i = 0; i < 1 << order; i++) { + for (i = 0; i < num_gpfn; i++) { mfn = pfn_to_mfn_for_dma(start_gpfn + i); if (mfn_prev != ~0UL && mfn != mfn_prev + 1) { xprintk("\n"); @@ -188,7 +215,7 @@ __xen_create_contiguous_region(unsigned vstart, virt_to_bus((void*)vstart), phys_to_machine_for_dma(gphys)); xprintk("mfn: "); - for (i = 0; i < 1 << order; i++) { + for (i = 0; i < num_gpfn; i++) { mfn = pfn_to_mfn_for_dma(start_gpfn + i); xprintk("0x%lx ", mfn); } @@ -202,44 +229,73 @@ out: out: balloon_unlock(flags); return error; + +fail: + for (i = 0; i < num_gpfn; i++) { + error = HYPERVISOR_populate_physmap(start_gpfn + i, 0, 0); + if (error) { + BUG();//XXX + } + } + goto out; } void __xen_destroy_contiguous_region(unsigned long vstart, unsigned int order) { + unsigned long flags; unsigned long error = 0; - unsigned long gphys = __pa(vstart); - unsigned long start_gpfn = gphys >> PAGE_SHIFT; - unsigned long num_pfn = 1 << order; + unsigned long start_gpfn = __pa(vstart) >> PAGE_SHIFT; + unsigned long num_gpfn = 1UL << order; + unsigned long* gpfns; + struct xen_memory_reservation reservation; unsigned long i; - unsigned long flags; - - scrub_pages(vstart, 1 << order); + + gpfns = kmalloc(sizeof(gpfns[0]) * num_gpfn, + GFP_KERNEL | __GFP_NOFAIL); + for (i = 0; i < num_gpfn; i++) { + gpfns[i] = start_gpfn + i; + } + + scrub_pages(vstart, num_gpfn); balloon_lock(flags); - contiguous_bitmap_clear(start_gpfn, 1UL << order); - - //XXX order - for (i = 0; i < num_pfn; i++) { - error = HYPERVISOR_zap_physmap(start_gpfn + i, 0); - if (error) { - goto out; - } - } - - for (i = 0; i < num_pfn; i++) { - error = HYPERVISOR_populate_physmap(start_gpfn + i, 0, 0); - if (error) { - goto out; - } - } - + contiguous_bitmap_clear(start_gpfn, num_gpfn); + error = HYPERVISOR_remove_physmap(start_gpfn, order); + if (error) { + goto fail; + } + + set_xen_guest_handle(reservation.extent_start, gpfns); + reservation.nr_extents = num_gpfn; + reservation.address_bits = 0; + reservation.extent_order = 0; + reservation.domid = DOMID_SELF; + error = HYPERVISOR_memory_op(XENMEM_populate_physmap, &reservation); + if (error != num_gpfn) { + error = -EFAULT;//XXX + goto fail; + } + error = 0; out: balloon_unlock(flags); + kfree(gpfns); if (error) { - //XXX - } + // error can't be returned. + BUG();//XXX + } + return; + +fail: + for (i = 0; i < num_gpfn; i++) { + int tmp_error;// don't overwrite error. + tmp_error = HYPERVISOR_populate_physmap(start_gpfn + i, 0, 0); + if (tmp_error) { + BUG();//XXX + } + } + goto out; } @@ -294,38 +350,6 @@ HYPERVISOR_grant_table_op(unsigned int c return ____HYPERVISOR_grant_table_op(cmd, uop, count); } - - -/////////////////////////////////////////////////////////////////////////// -//XXX taken from balloon.c -// temporal hack until balloon driver support. -#include - -struct page *balloon_alloc_empty_page_range(unsigned long nr_pages) -{ - unsigned long vstart; - unsigned int order = get_order(nr_pages * PAGE_SIZE); - - vstart = __get_free_pages(GFP_KERNEL, order); - if (vstart == 0) - return NULL; - - return virt_to_page(vstart); -} - -void balloon_dealloc_empty_page_range( - struct page *page, unsigned long nr_pages) -{ - __free_pages(page, get_order(nr_pages * PAGE_SIZE)); -} - -void balloon_update_driver_allowance(long delta) -{ -} - -EXPORT_SYMBOL(balloon_alloc_empty_page_range); -EXPORT_SYMBOL(balloon_dealloc_empty_page_range); -EXPORT_SYMBOL(balloon_update_driver_allowance); /////////////////////////////////////////////////////////////////////////// diff -r 1c59cefee0e4 -r 498db9021959 linux-2.6-xen-sparse/arch/ia64/xen/util.c --- a/linux-2.6-xen-sparse/arch/ia64/xen/util.c Fri May 12 19:59:44 2006 +0900 +++ b/linux-2.6-xen-sparse/arch/ia64/xen/util.c Fri May 12 19:59:46 2006 +0900 @@ -74,13 +74,18 @@ void free_vm_area(struct vm_struct *area // This area is used for foreign page mappping. // So underlying machine page may not be assigned. for (i = 0; i < (1 << order); i++) { - unsigned long error; - error = HYPERVISOR_populate_physmap( - (area->phys_addr >> PAGE_SHIFT) + i, 0, 0); - if (error) { - BUG();//XXX - return; - } + unsigned long ret; + unsigned long gpfn = (area->phys_addr >> PAGE_SHIFT) + i; + struct xen_memory_reservation reservation = { + .nr_extents = 1, + .address_bits = 0, + .extent_order = 0, + .domid = DOMID_SELF + }; + set_xen_guest_handle(reservation.extent_start, &gpfn); + ret = HYPERVISOR_memory_op(XENMEM_populate_physmap, + &reservation); + BUG_ON(ret != 1); } free_pages((unsigned long)area->addr, order); kfree(area); diff -r 1c59cefee0e4 -r 498db9021959 linux-2.6-xen-sparse/include/asm-ia64/hypercall.h --- a/linux-2.6-xen-sparse/include/asm-ia64/hypercall.h Fri May 12 19:59:44 2006 +0900 +++ b/linux-2.6-xen-sparse/include/asm-ia64/hypercall.h Fri May 12 19:59:46 2006 +0900 @@ -458,27 +458,6 @@ HYPERVISOR_machtophys(unsigned long mfn) } static inline unsigned long -__HYPERVISOR_populate_physmap(unsigned long gpfn, unsigned int extent_order, - unsigned int address_bits) -{ - return _hypercall_imm3(unsigned long, ia64_dom0vp_op, - IA64_DOM0VP_populate_physmap, gpfn, - extent_order, address_bits); -} - -static inline unsigned long -HYPERVISOR_populate_physmap(unsigned long gpfn, unsigned int extent_order, - unsigned int address_bits) -{ - unsigned long ret = 0; - if (running_on_xen) { - ret = __HYPERVISOR_populate_physmap(gpfn, extent_order, - address_bits); - } - return ret; -} - -static inline unsigned long __HYPERVISOR_zap_physmap(unsigned long gpfn, unsigned int extent_order) { return _hypercall_imm2(unsigned long, ia64_dom0vp_op, @@ -503,6 +482,7 @@ __HYPERVISOR_add_physmap(unsigned long g IA64_DOM0VP_add_physmap, gpfn, mfn, flags, domid); } + static inline unsigned long HYPERVISOR_add_physmap(unsigned long gpfn, unsigned long mfn, unsigned int flags, domid_t domid) @@ -522,8 +502,6 @@ HYPERVISOR_add_physmap(unsigned long gpf #define HYPERVISOR_ioremap(ioaddr, size) (ioaddr) #define HYPERVISOR_phystomach(gpfn) (gpfn) #define HYPERVISOR_machtophys(mfn) (mfn) -#define HYPERVISOR_populate_physmap(gpfn, extent_order, address_bits) \ - (0) #define HYPERVISOR_zap_physmap(gpfn, extent_order) (0) #define HYPERVISOR_add_physmap(gpfn, mfn, flags) (0) #endif