[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [xen-unstable test] 16788: regressions - FAIL



>>> On 04.03.13 at 12:45, Tim Deegan <tim@xxxxxxx> wrote:
> At 11:29 +0000 on 04 Mar (1362396574), Jan Beulich wrote:
>> >>> On 04.03.13 at 12:12, Tim Deegan <tim@xxxxxxx> wrote:
>> > At 10:57 +0000 on 04 Mar (1362394626), Jan Beulich wrote:
>> >> Question - is there really no better way than this to deal with
>> >> cross page emulated writes?
>> > 
>> > There probably is -- all that's wanted here is two mappings that are
>> > guaranteed to be contiguous in virtual address.  The LDT slots were
>> > available; it would have been better to document this use where
>> > LDT_VIRT_START is defined, though.
>> > 
>> > AFAICT, we'll need to:
>> >  - cause some equivalent pair of PTEs to be available (either per-cpu or
>> >    per-vcpu); or
>> >  - add a map_two_domain_pages() function to use the mapcache for this; or
>> 
>> Would vmap() do? Or do we expect this code path to be performance
>> sensitive?
> 
> I can't really tell what vmap() is for, since it seems to have no
> documentation, and the checkin description just says "implement vmap()".
> But it looks plausible, and emulating page-crossing writes oughtn't to
> be performance-sensitive.

Like this then (compile tested only so far):

--- a/xen/arch/x86/mm/shadow/multi.c
+++ b/xen/arch/x86/mm/shadow/multi.c
@@ -4611,7 +4611,6 @@ static void *emulate_map_dest(struct vcp
                               u32 bytes,
                               struct sh_emulate_ctxt *sh_ctxt)
 {
-    unsigned long offset;
     void *map = NULL;
 
     sh_ctxt->mfn1 = emulate_gva_to_mfn(v, vaddr, sh_ctxt);
@@ -4643,6 +4642,8 @@ static void *emulate_map_dest(struct vcp
     }
     else 
     {
+        unsigned long mfns[2];
+
         /* Cross-page emulated writes are only supported for HVM guests; 
          * PV guests ought to know better */
         if ( !is_hvm_vcpu(v) )
@@ -4660,17 +4661,11 @@ static void *emulate_map_dest(struct vcp
         /* Cross-page writes mean probably not a pagetable */
         sh_remove_shadows(v, sh_ctxt->mfn2, 0, 0 /* Slow, can fail */ );
         
-        /* Hack: we map the pages into the vcpu's LDT space, since we
-         * know that we're not going to need the LDT for HVM guests, 
-         * and only HVM guests are allowed unaligned writes. */
-        ASSERT(is_hvm_vcpu(v));
-        map = (void *)LDT_VIRT_START(v);
-        offset = l1_linear_offset((unsigned long) map);
-        l1e_write(&__linear_l1_table[offset],
-                  l1e_from_pfn(mfn_x(sh_ctxt->mfn1), __PAGE_HYPERVISOR));
-        l1e_write(&__linear_l1_table[offset + 1],
-                  l1e_from_pfn(mfn_x(sh_ctxt->mfn2), __PAGE_HYPERVISOR));
-        flush_tlb_local();
+        mfns[0] = mfn_x(sh_ctxt->mfn1);
+        mfns[1] = mfn_x(sh_ctxt->mfn2);
+        map = vmap(mfns, 2);
+        if ( !map )
+            return MAPPING_UNHANDLEABLE;
         map += (vaddr & ~PAGE_MASK);
     }
 
@@ -4748,14 +4743,8 @@ static void emulate_unmap_dest(struct vc
 
     if ( unlikely(mfn_valid(sh_ctxt->mfn2)) )
     {
-        unsigned long offset;
         paging_mark_dirty(v->domain, mfn_x(sh_ctxt->mfn2));
-        /* Undo the hacky two-frame contiguous map. */
-        ASSERT(((unsigned long) addr & PAGE_MASK) == LDT_VIRT_START(v));
-        offset = l1_linear_offset((unsigned long) addr);
-        l1e_write(&__linear_l1_table[offset], l1e_empty());
-        l1e_write(&__linear_l1_table[offset + 1], l1e_empty());
-        flush_tlb_all();
+        vunmap(addr - ((unsigned long)addr & ~PAGE_MASK));
     }
     else 
         sh_unmap_domain_page(addr);

Jan


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.