[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] Get the network interface working in shadow translate mode. This
# HG changeset patch # User sos22@xxxxxxxxxxxxxxxxxxxx # Node ID 1580009f137c2d90a3de05c06d677dfbdd65e4bd # Parent cc9bb3e0e348e6484d6fa2bc43b4900c6a40da79 Get the network interface working in shadow translate mode. This required a few extra __gpfn_to_mfn translations, and also required a minor change in the grant tables interface: if we're in shadow translate mode, then shared->frame is supposed to be the pfn you want to map the new mfn to when accepting a grant transfer, and Xen handles updating the M2P and P2M tables for you. Signed-off-by: Steven Smith, sos22@xxxxxxxxx diff -r cc9bb3e0e348 -r 1580009f137c xen/common/grant_table.c --- a/xen/common/grant_table.c Wed Jan 25 17:57:44 2006 +++ b/xen/common/grant_table.c Thu Jan 26 13:33:20 2006 @@ -711,6 +711,7 @@ int i; grant_entry_t *sha; gnttab_transfer_t gop; + unsigned long real_mfn; for ( i = 0; i < count; i++ ) { @@ -731,7 +732,8 @@ continue; } - page = pfn_to_page(gop.mfn); + real_mfn = __gpfn_to_mfn(d, gop.mfn); + page = pfn_to_page(real_mfn); if ( unlikely(IS_XEN_HEAP_FRAME(page)) ) { DPRINTK("gnttab_transfer: xen frame %lx\n", @@ -792,7 +794,21 @@ /* Tell the guest about its new page frame. */ sha = &e->grant_table->shared[gop.ref]; - sha->frame = gop.mfn; + if (shadow_mode_translate(e)) { + struct domain_mmap_cache c1, c2; + unsigned long pfn = sha->frame; + domain_mmap_cache_init(&c1); + domain_mmap_cache_init(&c2); + shadow_lock(e); + shadow_sync_and_drop_references(e, page); + set_p2m_entry(e, pfn, real_mfn, &c1, &c2); + set_pfn_from_mfn(real_mfn, pfn); + shadow_unlock(e); + domain_mmap_cache_destroy(&c1); + domain_mmap_cache_destroy(&c2); + } else { + sha->frame = real_mfn; + } wmb(); sha->flags |= GTF_transfer_completed; diff -r cc9bb3e0e348 -r 1580009f137c xen/common/memory.c --- a/xen/common/memory.c Wed Jan 25 17:57:44 2006 +++ b/xen/common/memory.c Thu Jan 26 13:33:20 2006 @@ -76,7 +76,7 @@ int *preempted) { struct pfn_info *page; - unsigned long i, j, mpfn; + unsigned long i, j, mpfn, mfn; if ( !array_access_ok(extent_list, nr_extents, sizeof(*extent_list)) ) return 0; @@ -94,14 +94,15 @@ for ( j = 0; j < (1 << extent_order); j++ ) { - if ( unlikely((mpfn + j) >= max_page) ) + mfn = __gpfn_to_mfn(d, mpfn + j); + if ( unlikely(mfn >= max_page) ) { DPRINTK("Domain %u page number out of range (%lx >= %lx)\n", - d->domain_id, mpfn + j, max_page); + d->domain_id, mfn, max_page); return i; } - page = pfn_to_page(mpfn + j); + page = pfn_to_page(mfn); if ( unlikely(!get_page(page, d)) ) { DPRINTK("Bad page free for domain %u\n", d->domain_id); _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |