# HG changeset patch
# User kfraser@xxxxxxxxxxxxxxxxxxxxx
# Node ID 2ae4e4e89d6de2232dbf7a46247d1b8178d327f2
# Parent c242b6d6a64a3697b0ee140aec1d24538543c5d5
[XEN] Cleanups to phys/mach address handling.
1. Balloon driver does not need to set M2P entry.
This is done by the populate_physmap hypercall.
2. Xen now translates foreign mappings from GMFN->MFN.
Tools are simplified because of this.
Signed-off-by: Keir Fraser <keir@xxxxxxxxxxxxx>
---
linux-2.6-xen-sparse/arch/i386/mm/hypervisor.c | 12 ---
linux-2.6-xen-sparse/drivers/xen/balloon/balloon.c | 2
linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/hypervisor.h | 1
linux-2.6-xen-sparse/include/asm-ia64/maddr.h | 5 -
tools/ioemu/vl.c | 22 -----
tools/libxc/xc_domain.c | 16 ----
tools/libxc/xc_hvm_build.c | 7 -
tools/libxc/xc_linux_build.c | 6 -
tools/libxc/xc_linux_restore.c | 16 +---
tools/libxc/xc_private.c | 32 --------
tools/libxc/xenctrl.h | 6 -
xen/arch/x86/mm.c | 38
+++++-----
12 files changed, 25 insertions(+), 138 deletions(-)
diff -r c242b6d6a64a -r 2ae4e4e89d6d
linux-2.6-xen-sparse/arch/i386/mm/hypervisor.c
--- a/linux-2.6-xen-sparse/arch/i386/mm/hypervisor.c Mon Nov 27 13:50:02
2006 +0000
+++ b/linux-2.6-xen-sparse/arch/i386/mm/hypervisor.c Mon Nov 27 14:20:44
2006 +0000
@@ -98,18 +98,6 @@ void xen_l4_entry_update(pgd_t *ptr, pgd
BUG_ON(HYPERVISOR_mmu_update(&u, 1, NULL, DOMID_SELF) < 0);
}
#endif /* CONFIG_X86_64 */
-
-void xen_machphys_update(unsigned long mfn, unsigned long pfn)
-{
- mmu_update_t u;
- if (xen_feature(XENFEAT_auto_translated_physmap)) {
- BUG_ON(pfn != mfn);
- return;
- }
- u.ptr = ((unsigned long long)mfn << PAGE_SHIFT) | MMU_MACHPHYS_UPDATE;
- u.val = pfn;
- BUG_ON(HYPERVISOR_mmu_update(&u, 1, NULL, DOMID_SELF) < 0);
-}
void xen_pt_switch(unsigned long ptr)
{
diff -r c242b6d6a64a -r 2ae4e4e89d6d
linux-2.6-xen-sparse/drivers/xen/balloon/balloon.c
--- a/linux-2.6-xen-sparse/drivers/xen/balloon/balloon.c Mon Nov 27
13:50:02 2006 +0000
+++ b/linux-2.6-xen-sparse/drivers/xen/balloon/balloon.c Mon Nov 27
14:20:44 2006 +0000
@@ -215,9 +215,7 @@ static int increase_reservation(unsigned
BUG_ON(!xen_feature(XENFEAT_auto_translated_physmap) &&
phys_to_machine_mapping_valid(pfn));
- /* Update P->M and M->P tables. */
set_phys_to_machine(pfn, frame_list[i]);
- xen_machphys_update(frame_list[i], pfn);
/* Link back into the page tables if not highmem. */
if (pfn < max_low_pfn) {
diff -r c242b6d6a64a -r 2ae4e4e89d6d
linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/hypervisor.h
--- a/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/hypervisor.h Mon Nov
27 13:50:02 2006 +0000
+++ b/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/hypervisor.h Mon Nov
27 14:20:44 2006 +0000
@@ -98,7 +98,6 @@ void xen_pgd_unpin(unsigned long ptr);
void xen_pgd_unpin(unsigned long ptr);
void xen_set_ldt(unsigned long ptr, unsigned long bytes);
-void xen_machphys_update(unsigned long mfn, unsigned long pfn);
#ifdef CONFIG_SMP
#include <linux/cpumask.h>
diff -r c242b6d6a64a -r 2ae4e4e89d6d
linux-2.6-xen-sparse/include/asm-ia64/maddr.h
--- a/linux-2.6-xen-sparse/include/asm-ia64/maddr.h Mon Nov 27 13:50:02
2006 +0000
+++ b/linux-2.6-xen-sparse/include/asm-ia64/maddr.h Mon Nov 27 14:20:44
2006 +0000
@@ -96,11 +96,6 @@ mfn_to_local_pfn(unsigned long mfn)
#define virt_to_machine(virt) __pa(virt) // for tpmfront.c
#define set_phys_to_machine(pfn, mfn) do { } while (0)
-#ifdef CONFIG_VMX_GUEST
-extern void xen_machphys_update(unsigned long mfn, unsigned long pfn);
-#else /* CONFIG_VMX_GUEST */
-#define xen_machphys_update(mfn, pfn) do { } while (0)
-#endif /* CONFIG_VMX_GUEST */
typedef unsigned long maddr_t; // to compile netback, netfront
diff -r c242b6d6a64a -r 2ae4e4e89d6d tools/ioemu/vl.c
--- a/tools/ioemu/vl.c Mon Nov 27 13:50:02 2006 +0000
+++ b/tools/ioemu/vl.c Mon Nov 27 14:20:44 2006 +0000
@@ -5787,9 +5787,6 @@ int set_mm_mapping(int xc_handle, uint32
unsigned long nr_pages, unsigned int address_bits,
xen_pfn_t *extent_start)
{
-#if 0
- int i;
-#endif
xc_dominfo_t info;
int err = 0;
@@ -5807,19 +5804,6 @@ int set_mm_mapping(int xc_handle, uint32
fprintf(stderr, "Failed to populate physmap\n");
return -1;
}
-
- err = xc_domain_translate_gpfn_list(xc_handle, domid, nr_pages,
- extent_start, extent_start);
- if (err) {
- fprintf(stderr, "Failed to translate gpfn list\n");
- return -1;
- }
-
-#if 0 /* Generates lots of log file output - turn on for debugging */
- for (i = 0; i < nr_pages; i++)
- fprintf(stderr, "set_map result i %x result %lx\n", i,
- extent_start[i]);
-#endif
return 0;
}
@@ -6425,12 +6409,6 @@ int main(int argc, char **argv)
#if defined(__i386__) || defined(__x86_64__)
for ( i = 0; i < tmp_nr_pages; i++)
page_array[i] = i;
- if (xc_domain_translate_gpfn_list(xc_handle, domid, tmp_nr_pages,
- page_array, page_array)) {
- fprintf(logfile, "xc_domain_translate_gpfn_list returned error %d\n",
- errno);
- exit(-1);
- }
phys_ram_base = xc_map_foreign_batch(xc_handle, domid,
PROT_READ|PROT_WRITE, page_array,
diff -r c242b6d6a64a -r 2ae4e4e89d6d tools/libxc/xc_domain.c
--- a/tools/libxc/xc_domain.c Mon Nov 27 13:50:02 2006 +0000
+++ b/tools/libxc/xc_domain.c Mon Nov 27 14:20:44 2006 +0000
@@ -428,22 +428,6 @@ int xc_domain_memory_populate_physmap(in
}
return err;
-}
-
-int xc_domain_translate_gpfn_list(int xc_handle,
- uint32_t domid,
- unsigned long nr_gpfns,
- xen_pfn_t *gpfn_list,
- xen_pfn_t *mfn_list)
-{
- struct xen_translate_gpfn_list op = {
- .domid = domid,
- .nr_gpfns = nr_gpfns,
- };
- set_xen_guest_handle(op.gpfn_list, gpfn_list);
- set_xen_guest_handle(op.mfn_list, mfn_list);
-
- return xc_memory_op(xc_handle, XENMEM_translate_gpfn_list, &op);
}
int xc_domain_max_vcpus(int xc_handle, uint32_t domid, unsigned int max)
diff -r c242b6d6a64a -r 2ae4e4e89d6d tools/libxc/xc_hvm_build.c
--- a/tools/libxc/xc_hvm_build.c Mon Nov 27 13:50:02 2006 +0000
+++ b/tools/libxc/xc_hvm_build.c Mon Nov 27 14:20:44 2006 +0000
@@ -245,13 +245,6 @@ static int setup_guest(int xc_handle,
goto error_out;
}
- if ( xc_domain_translate_gpfn_list(xc_handle, dom, nr_pages,
- page_array, page_array) )
- {
- PERROR("Could not translate addresses of HVM guest.\n");
- goto error_out;
- }
-
loadelfimage(image, xc_handle, dom, page_array, &dsi);
if ( set_hvm_info(xc_handle, dom, page_array, vcpus, acpi) )
diff -r c242b6d6a64a -r 2ae4e4e89d6d tools/libxc/xc_linux_build.c
--- a/tools/libxc/xc_linux_build.c Mon Nov 27 13:50:02 2006 +0000
+++ b/tools/libxc/xc_linux_build.c Mon Nov 27 14:20:44 2006 +0000
@@ -509,12 +509,6 @@ static int setup_guest(int xc_handle,
PERROR("Could not allocate memory for PV guest.\n");
goto error_out;
}
- if ( xc_domain_translate_gpfn_list(xc_handle, dom, nr_pages,
- page_array, page_array) )
- {
- PERROR("Could not translate addresses of PV guest.\n");
- goto error_out;
- }
dsi.v_start = round_pgdown(dsi.v_start);
vinitrd_start = round_pgup(dsi.v_end);
diff -r c242b6d6a64a -r 2ae4e4e89d6d tools/libxc/xc_linux_restore.c
--- a/tools/libxc/xc_linux_restore.c Mon Nov 27 13:50:02 2006 +0000
+++ b/tools/libxc/xc_linux_restore.c Mon Nov 27 14:20:44 2006 +0000
@@ -265,13 +265,16 @@ int xc_linux_restore(int xc_handle, int
}
shared_info_frame = domctl.u.getdomaininfo.shared_info_frame;
- if(xc_domain_setmaxmem(xc_handle, dom, PFN_TO_KB(max_pfn)) != 0) {
+ if (xc_domain_setmaxmem(xc_handle, dom, PFN_TO_KB(max_pfn)) != 0) {
errno = ENOMEM;
goto out;
}
- if(xc_domain_memory_increase_reservation(
- xc_handle, dom, max_pfn, 0, 0, NULL) != 0) {
+ for ( pfn = 0; pfn < max_pfn; pfn++ )
+ p2m[pfn] = pfn;
+
+ if (xc_domain_memory_populate_physmap(xc_handle, dom, max_pfn,
+ 0, 0, p2m) != 0) {
ERROR("Failed to increase reservation by %lx KB", PFN_TO_KB(max_pfn));
errno = ENOMEM;
goto out;
@@ -279,17 +282,10 @@ int xc_linux_restore(int xc_handle, int
DPRINTF("Increased domain reservation by %lx KB\n", PFN_TO_KB(max_pfn));
- /* Build the pfn-to-mfn table. We choose MFN ordering returned by Xen. */
- if (xc_get_pfn_list(xc_handle, dom, p2m, max_pfn) != max_pfn) {
- ERROR("Did not read correct number of frame numbers for new dom");
- goto out;
- }
-
if(!(mmu = xc_init_mmu_updates(xc_handle, dom))) {
ERROR("Could not initialise for MMU updates");
goto out;
}
-
DPRINTF("Reloading memory pages: 0%%\n");
diff -r c242b6d6a64a -r 2ae4e4e89d6d tools/libxc/xc_private.c
--- a/tools/libxc/xc_private.c Mon Nov 27 13:50:02 2006 +0000
+++ b/tools/libxc/xc_private.c Mon Nov 27 14:20:44 2006 +0000
@@ -134,10 +134,7 @@ int xc_memory_op(int xc_handle,
DECLARE_HYPERCALL;
struct xen_memory_reservation *reservation = arg;
struct xen_machphys_mfn_list *xmml = arg;
- struct xen_translate_gpfn_list *trans = arg;
xen_pfn_t *extent_start;
- xen_pfn_t *gpfn_list;
- xen_pfn_t *mfn_list;
long ret = -EINVAL;
hypercall.op = __HYPERVISOR_memory_op;
@@ -183,28 +180,6 @@ int xc_memory_op(int xc_handle,
if ( lock_pages(arg, sizeof(struct xen_add_to_physmap)) )
{
PERROR("Could not lock");
- goto out1;
- }
- break;
- case XENMEM_translate_gpfn_list:
- if ( lock_pages(trans, sizeof(*trans)) != 0 )
- {
- PERROR("Could not lock");
- goto out1;
- }
- get_xen_guest_handle(gpfn_list, trans->gpfn_list);
- if ( lock_pages(gpfn_list, trans->nr_gpfns * sizeof(xen_pfn_t)) != 0 )
- {
- PERROR("Could not lock");
- unlock_pages(trans, sizeof(*trans));
- goto out1;
- }
- get_xen_guest_handle(mfn_list, trans->mfn_list);
- if ( lock_pages(mfn_list, trans->nr_gpfns * sizeof(xen_pfn_t)) != 0 )
- {
- PERROR("Could not lock");
- unlock_pages(gpfn_list, trans->nr_gpfns * sizeof(xen_pfn_t));
- unlock_pages(trans, sizeof(*trans));
goto out1;
}
break;
@@ -231,13 +206,6 @@ int xc_memory_op(int xc_handle,
break;
case XENMEM_add_to_physmap:
unlock_pages(arg, sizeof(struct xen_add_to_physmap));
- break;
- case XENMEM_translate_gpfn_list:
- get_xen_guest_handle(mfn_list, trans->mfn_list);
- unlock_pages(mfn_list, trans->nr_gpfns * sizeof(xen_pfn_t));
- get_xen_guest_handle(gpfn_list, trans->gpfn_list);
- unlock_pages(gpfn_list, trans->nr_gpfns * sizeof(xen_pfn_t));
- unlock_pages(trans, sizeof(*trans));
break;
}
diff -r c242b6d6a64a -r 2ae4e4e89d6d tools/libxc/xenctrl.h
--- a/tools/libxc/xenctrl.h Mon Nov 27 13:50:02 2006 +0000
+++ b/tools/libxc/xenctrl.h Mon Nov 27 14:20:44 2006 +0000
@@ -439,12 +439,6 @@ int xc_domain_memory_populate_physmap(in
unsigned int address_bits,
xen_pfn_t *extent_start);
-int xc_domain_translate_gpfn_list(int xc_handle,
- uint32_t domid,
- unsigned long nr_gpfns,
- xen_pfn_t *gpfn_list,
- xen_pfn_t *mfn_list);
-
int xc_domain_ioport_permission(int xc_handle,
uint32_t domid,
uint32_t first_port,
diff -r c242b6d6a64a -r 2ae4e4e89d6d xen/arch/x86/mm.c
--- a/xen/arch/x86/mm.c Mon Nov 27 13:50:02 2006 +0000
+++ b/xen/arch/x86/mm.c Mon Nov 27 14:20:44 2006 +0000
@@ -1240,6 +1240,10 @@ static int mod_l1_entry(l1_pgentry_t *pl
if ( l1e_get_flags(nl1e) & _PAGE_PRESENT )
{
+ /* Translate foreign guest addresses. */
+ nl1e = l1e_from_pfn(gmfn_to_mfn(FOREIGNDOM, l1e_get_pfn(nl1e)),
+ l1e_get_flags(nl1e));
+
if ( unlikely(l1e_get_flags(nl1e) & L1_DISALLOW_MASK) )
{
MEM_LOG("Bad L1 flags %x",
@@ -1814,10 +1818,15 @@ static int set_foreigndom(domid_t domid)
if ( likely(domid == DOMID_SELF) )
goto out;
- if ( domid == d->domain_id )
+ if ( unlikely(domid == d->domain_id) )
{
MEM_LOG("Dom %u tried to specify itself as foreign domain",
d->domain_id);
+ okay = 0;
+ }
+ else if ( unlikely(shadow_mode_translate(d)) )
+ {
+ MEM_LOG("Cannot mix foreign mappings with translated domains");
okay = 0;
}
else if ( !IS_PRIV(d) )
@@ -1855,14 +1864,6 @@ static int set_foreigndom(domid_t domid)
break;
}
}
- }
-
- if ( unlikely(shadow_mode_translate(d)) )
- {
- MEM_LOG("%s: can not mix foreign mappings with translated domains",
- __func__);
- info->foreign = NULL;
- okay = 0;
}
out:
@@ -2340,13 +2341,15 @@ int do_mmu_update(
break;
}
- if ( shadow_mode_translate(FOREIGNDOM) )
- shadow_guest_physmap_add_page(FOREIGNDOM, gpfn, mfn);
- else
- set_gpfn_from_mfn(mfn, gpfn);
+ if ( unlikely(shadow_mode_translate(FOREIGNDOM)) )
+ {
+ MEM_LOG("Mach-phys update on shadow-translate guest");
+ break;
+ }
+
+ set_gpfn_from_mfn(mfn, gpfn);
okay = 1;
- // Mark the new gfn dirty...
mark_dirty(FOREIGNDOM, mfn);
put_page(mfn_to_page(mfn));
@@ -2557,10 +2560,7 @@ static int destroy_grant_va_mapping(
}
ol1e = *pl1e;
- /*
- * Check that the virtual address supplied is actually mapped to
- * frame.
- */
+ /* Check that the virtual address supplied is actually mapped to frame. */
if ( unlikely(l1e_get_pfn(ol1e) != frame) )
{
MEM_LOG("PTE entry %lx for address %lx doesn't match frame %lx",
@@ -2574,7 +2574,7 @@ static int destroy_grant_va_mapping(
{
MEM_LOG("Cannot delete PTE entry at %p", (unsigned long *)pl1e);
rc = GNTST_general_error;
- goto out; // this is redundant & unnecessary, but informative
+ goto out;
}
out:
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|