# HG changeset patch
# User kfraser@xxxxxxxxxxxxxxxxxxxxx
# Date 1171901163 0
# Node ID 01476c7804b2ec8577be537f8868e9690bbab7d5
# Parent 184db7a674d93d92d0d963a7b3c80f1889983a9e
ia64: Fixes after changes to grant table code.
Signed-off-by: Isaku Yamahata <yamahata@xxxxxxxxxxxxx>
---
xen/arch/ia64/xen/domain.c | 10 +++++++++
xen/include/asm-ia64/grant_table.h | 41 ++++++++++++++++++++++---------------
2 files changed, 35 insertions(+), 16 deletions(-)
diff -r 184db7a674d9 -r 01476c7804b2 xen/arch/ia64/xen/domain.c
--- a/xen/arch/ia64/xen/domain.c Mon Feb 19 16:05:34 2007 +0000
+++ b/xen/arch/ia64/xen/domain.c Mon Feb 19 16:06:03 2007 +0000
@@ -521,6 +521,16 @@ int arch_domain_create(struct domain *d)
if ((d->arch.mm.pgd = pgd_alloc(&d->arch.mm)) == NULL)
goto fail_nomem;
+ /*
+ * grant_table_create() can't fully initialize grant table for domain
+ * because it is called before arch_domain_create().
+ * Here we complete the initialization which requires p2m table.
+ */
+ spin_lock(&d->grant_table->lock);
+ for (i = 0; i < nr_grant_frames(d->grant_table); i++)
+ ia64_gnttab_create_shared_page(d, d->grant_table, i);
+ spin_unlock(&d->grant_table->lock);
+
d->arch.ioport_caps = rangeset_new(d, "I/O Ports",
RANGESETF_prettyprint_hex);
diff -r 184db7a674d9 -r 01476c7804b2 xen/include/asm-ia64/grant_table.h
--- a/xen/include/asm-ia64/grant_table.h Mon Feb 19 16:05:34 2007 +0000
+++ b/xen/include/asm-ia64/grant_table.h Mon Feb 19 16:06:03 2007 +0000
@@ -13,15 +13,6 @@ int destroy_grant_host_mapping(unsigned
// for grant transfer
void guest_physmap_add_page(struct domain *d, unsigned long gpfn, unsigned
long mfn);
-
-// for grant table shared page
-#define gnttab_create_shared_page(d, t, i) \
- do { \
- share_xen_page_with_guest( \
- virt_to_page((char *)(t)->shared + ((i) << PAGE_SHIFT)), \
- (d), XENSHARE_writable); \
- } while (0)
-
/* XXX
* somewhere appropriate
@@ -39,14 +30,32 @@ void guest_physmap_add_page(struct domai
/* Guest physical address of the grant table. */
#define IA64_GRANT_TABLE_PADDR IA64_XMAPPEDREGS_PADDR(NR_CPUS)
-#define gnttab_shared_maddr(d, t, i) \
- virt_to_maddr((char*)(t)->shared + ((i) << PAGE_SHIFT))
+#define gnttab_shared_maddr(t, i) (virt_to_maddr((t)->shared[(i)]))
+#define gnttab_shared_page(t, i) (virt_to_page((t)->shared[(i)]))
-# define gnttab_shared_gmfn(d, t, i) \
- ({ assign_domain_page((d), \
- IA64_GRANT_TABLE_PADDR + ((i) << PAGE_SHIFT), \
- gnttab_shared_maddr((d), (t), (i))); \
- (IA64_GRANT_TABLE_PADDR >> PAGE_SHIFT) + (i);})
+#define ia64_gnttab_create_shared_page(d, t, i) \
+ do { \
+ BUG_ON((d)->arch.mm.pgd == NULL); \
+ assign_domain_page((d), \
+ IA64_GRANT_TABLE_PADDR + ((i) << PAGE_SHIFT), \
+ gnttab_shared_maddr((t), (i))); \
+ } while (0)
+
+/*
+ * for grant table shared page
+ * grant_table_create() might call this macro before allocating the p2m table.
+ * In such case, arch_domain_create() completes the initialization.
+ */
+#define gnttab_create_shared_page(d, t, i) \
+ do { \
+ share_xen_page_with_guest(gnttab_shared_page((t), (i)), \
+ (d), XENSHARE_writable); \
+ if ((d)->arch.mm.pgd) \
+ ia64_gnttab_create_shared_page((d), (t), (i)); \
+ } while (0)
+
+#define gnttab_shared_gmfn(d, t, i) \
+ ((IA64_GRANT_TABLE_PADDR >> PAGE_SHIFT) + (i))
#define gnttab_mark_dirty(d, f) ((void)f)
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|