mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 18:50:05 +01:00
[IA64] linux: remove dom0vp_populate_physmap hypercall
dom0 vp model: remove populate_physmap hypercall which becomes unnecesarry because xenmem operation is fully supported by the previous patch. Signed-off-by: Isaku Yamahata <yamahata@valinux.co.jp>
This commit is contained in:
1 parent
6d74295dec
commit
8d9e045fea
4 files changed
+109
-102
No files matched your search
@@ -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/
|
||||
|
||||
|
||||
@@ -26,14 +26,8 @@
|
||||
#include <asm/page.h>
|
||||
#include <asm/hypervisor.h>
|
||||
#include <asm/hypercall.h>
|
||||
|
||||
#define XEN_IA64_BALLOON_IS_NOT_YET
|
||||
#ifndef XEN_IA64_BALLOON_IS_NOT_YET
|
||||
#include <xen/interface/memory.h>
|
||||
#include <xen/balloon.h>
|
||||
#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 long vstart,
|
||||
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 long vstart,
|
||||
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 @@ __xen_create_contiguous_region(unsigned long vstart,
|
||||
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 error = 0;
|
||||
unsigned long gphys = __pa(vstart);
|
||||
unsigned long start_gpfn = gphys >> PAGE_SHIFT;
|
||||
unsigned long num_pfn = 1 << order;
|
||||
unsigned long i;
|
||||
unsigned long flags;
|
||||
unsigned long error = 0;
|
||||
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;
|
||||
|
||||
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;
|
||||
}
|
||||
contiguous_bitmap_clear(start_gpfn, num_gpfn);
|
||||
error = HYPERVISOR_remove_physmap(start_gpfn, order);
|
||||
if (error) {
|
||||
goto fail;
|
||||
}
|
||||
|
||||
for (i = 0; i < num_pfn; i++) {
|
||||
error = HYPERVISOR_populate_physmap(start_gpfn + i, 0, 0);
|
||||
if (error) {
|
||||
goto out;
|
||||
}
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
@@ -296,38 +352,6 @@ HYPERVISOR_grant_table_op(unsigned int cmd, void *uop, unsigned int count)
|
||||
}
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
//XXX taken from balloon.c
|
||||
// temporal hack until balloon driver support.
|
||||
#include <linux/module.h>
|
||||
|
||||
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);
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
// PageForeign(), SetPageForeign(), ClearPageForeign()
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -457,27 +457,6 @@ HYPERVISOR_machtophys(unsigned long mfn)
|
||||
return ret;
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
@@ -503,6 +482,7 @@ __HYPERVISOR_add_physmap(unsigned long gpfn, unsigned long mfn,
|
||||
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 gpfn, unsigned long mfn,
|
||||
#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
|
||||
|
||||