[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] Re-enable per-cpu cache on map_domain_page(). Fix the
# HG changeset patch # User kaf24@xxxxxxxxxxxxxxxxxxxx # Node ID 87a97054b469610c354b30195a84b85798ac3f62 # Parent bfcdf4099d232bd6668436621581c328a6afcf09 Re-enable per-cpu cache on map_domain_page(). Fix the offending caller that broke the vcpu cache (writable pagetable code kept a mapping outstanding until flush, which could occur on a different vcpu). Signed-off-by: Keir Fraser <keir@xxxxxxxxxxxxx> diff -r bfcdf4099d23 -r 87a97054b469 xen/arch/x86/mm.c --- a/xen/arch/x86/mm.c Thu Jan 12 13:27:55 2006 +++ b/xen/arch/x86/mm.c Thu Jan 12 14:43:22 2006 @@ -2999,7 +2999,7 @@ BUG(); } PTWR_PRINTK("[%c] disconnected_l1va at %p is %"PRIpte"\n", - PTWR_PRINT_WHICH, ptep, pte.l1); + PTWR_PRINT_WHICH, ptep, l1e_get_intpte(pte)); l1e_remove_flags(pte, _PAGE_RW); /* Write-protect the p.t. page in the guest page table. */ @@ -3017,13 +3017,13 @@ /* NB. INVLPG is a serialising instruction: flushes pending updates. */ flush_tlb_one_mask(d->domain_dirty_cpumask, l1va); PTWR_PRINTK("[%c] disconnected_l1va at %p now %"PRIpte"\n", - PTWR_PRINT_WHICH, ptep, pte.l1); + PTWR_PRINT_WHICH, ptep, trawl l1e_get_intpte(pte)); /* * STEP 2. Validate any modified PTEs. */ - pl1e = d->arch.ptwr[which].pl1e; + pl1e = map_domain_page(l1e_get_pfn(pte)); modified = revalidate_l1(d, pl1e, d->arch.ptwr[which].page); unmap_domain_page(pl1e); perfc_incr_histo(wpt_updates, modified, PT_UPDATES); @@ -3206,7 +3206,7 @@ { unsigned long pfn; struct pfn_info *page; - l1_pgentry_t pte; + l1_pgentry_t *pl1e, pte; l2_pgentry_t *pl2e, l2e; int which, flags; unsigned long l2_idx; @@ -3343,11 +3343,10 @@ } /* Temporarily map the L1 page, and make a copy of it. */ - d->arch.ptwr[which].pl1e = map_domain_page(pfn); - memcpy(d->arch.ptwr[which].page, - d->arch.ptwr[which].pl1e, - L1_PAGETABLE_ENTRIES * sizeof(l1_pgentry_t)); - + pl1e = map_domain_page(pfn); + memcpy(d->arch.ptwr[which].page, pl1e, PAGE_SIZE); + unmap_domain_page(pl1e); + /* Finally, make the p.t. page writable by the guest OS. */ l1e_add_flags(pte, _PAGE_RW); if ( unlikely(__put_user(pte.l1, @@ -3356,7 +3355,6 @@ MEM_LOG("ptwr: Could not update pte at %p", (unsigned long *) &linear_pg_table[l1_linear_offset(addr)]); /* Toss the writable pagetable state and crash. */ - unmap_domain_page(d->arch.ptwr[which].pl1e); d->arch.ptwr[which].l1va = 0; domain_crash(d); return 0; diff -r bfcdf4099d23 -r 87a97054b469 xen/arch/x86/x86_32/domain_page.c --- a/xen/arch/x86/x86_32/domain_page.c Thu Jan 12 13:27:55 2006 +++ b/xen/arch/x86/x86_32/domain_page.c Thu Jan 12 14:43:22 2006 @@ -40,7 +40,6 @@ cache = &d->arch.mapcache; hashent = &cache->vcpu_maphash[vcpu].hash[MAPHASH_HASHFN(pfn)]; -#if 0 if ( hashent->pfn == pfn ) { idx = hashent->idx; @@ -49,7 +48,6 @@ ASSERT(l1e_get_pfn(cache->l1tab[idx]) == pfn); goto out; } -#endif spin_lock(&cache->lock); @@ -92,7 +90,7 @@ cache->l1tab[idx] = l1e_from_pfn(pfn, __PAGE_HYPERVISOR); -/*out:*/ + out: va = MAPCACHE_VIRT_START + (idx << PAGE_SHIFT); return (void *)va; } diff -r bfcdf4099d23 -r 87a97054b469 xen/include/asm-x86/mm.h --- a/xen/include/asm-x86/mm.h Thu Jan 12 13:27:55 2006 +++ b/xen/include/asm-x86/mm.h Thu Jan 12 14:43:22 2006 @@ -309,16 +309,13 @@ unsigned long l1va; /* Copy of the p.t. page, taken before guest is given write access. */ l1_pgentry_t *page; - /* A temporary Xen mapping of the actual p.t. page. */ - l1_pgentry_t *pl1e; /* Index in L2 page table where this L1 p.t. is always hooked. */ unsigned int l2_idx; /* NB. Only used for PTWR_PT_ACTIVE. */ /* Info about last ptwr update batch. */ unsigned int prev_nr_updates; - /* Exec domain which created writable mapping. */ + /* VCPU which created writable mapping. */ struct vcpu *vcpu; - /* EIP of the address which took the original write fault - used for stats collection only */ + /* EIP of the original write fault (stats collection only). */ unsigned long eip; }; _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |