Re: [patch 02/10] KVM: MMU: move local TLB flush to mmu_set_spte

2008-09-22 Thread Marcelo Tosatti
On Mon, Sep 22, 2008 at 11:26:36PM +0300, Avi Kivity wrote:
 Marcelo Tosatti wrote:

   

 I think we had cases where the spte.pfn contents changed, for example 
  when a large page was replaced by a normal page,
 

 True. And the TLB is not flushed now for large-normal replace, in case
 the pte thats faulting is read-only. The local (and remote) TLB's must
 be flushed on large-normal replace.

   

 Can you prepare a patch for that, for -stable?

First one in the v3 series.
--
To unsubscribe from this list: send the line unsubscribe kvm in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [patch 02/10] KVM: MMU: move local TLB flush to mmu_set_spte

2008-09-20 Thread Marcelo Tosatti
On Fri, Sep 19, 2008 at 05:21:09PM -0700, Avi Kivity wrote:
 Marcelo Tosatti wrote:
 Since the sync page path can collapse flushes.

 Also only flush if the spte was writable before.

 Signed-off-by: Marcelo Tosatti [EMAIL PROTECTED]

 @@ -1241,9 +1239,12 @@ static void mmu_set_spte(struct kvm_vcpu
  }
  }
  if (set_spte(vcpu, shadow_pte, pte_access, user_fault, write_fault,
 -  dirty, largepage, gfn, pfn, speculative))
 +  dirty, largepage, gfn, pfn, speculative)) {
  if (write_fault)
  *ptwrite = 1;
 +if (was_writeble)
 +kvm_x86_ops-tlb_flush(vcpu);
 +}


 I think we had cases where the spte.pfn contents changed, for example  
 when a large page was replaced by a normal page,

True. And the TLB is not flushed now for large-normal replace, in case
the pte thats faulting is read-only. The local (and remote) TLB's must
be flushed on large-normal replace.

(BTW the largepage patch is wrong, will reply to that soon).

 and also:

} else if (pfn != spte_to_pfn(*shadow_pte)) {

That one is likely to crash the guest anyway, so I don't see the need
for a flush there:

  Did you find out what's causing the errors in the first place (if
  zap is not used)?  It worries me greatly.
 Yes, the problem is that the rmap code does not handle the qemu
 process
 mappings from vanishing while there is a present rmap. If that
 happens,
 and there is a fault for a gfn whose qemu mapping has been removed, a
 different physical zero page will be allocated:
 
  rmap a - gfn 0 - physical host page 0
  mapping for gfn 0 gets removed
  guest faults in gfn 0 through the same pte chain
  rmap a - gfn 0 - physical host page 1
 
 When instantiating the shadow mapping for the second time, the
 is_rmap_pte check succeeds, so we release the reference grabbed by
 gfn_to_page() at mmu_set_spte(). We now have a shadow mapping
 pointing
 to a physical page without having an additional reference on that
 page.
 
 The following makes the host not crash under such a condition, but
 the condition itself is invalid leading to inconsistent state on the
 guest.
 So IMHO it shouldnt be allowed to happen in the first place.

--
To unsubscribe from this list: send the line unsubscribe kvm in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [patch 02/10] KVM: MMU: move local TLB flush to mmu_set_spte

2008-09-19 Thread Avi Kivity

Marcelo Tosatti wrote:

Since the sync page path can collapse flushes.

Also only flush if the spte was writable before.

Signed-off-by: Marcelo Tosatti [EMAIL PROTECTED]

@@ -1241,9 +1239,12 @@ static void mmu_set_spte(struct kvm_vcpu
}
}
if (set_spte(vcpu, shadow_pte, pte_access, user_fault, write_fault,
- dirty, largepage, gfn, pfn, speculative))
+ dirty, largepage, gfn, pfn, speculative)) {
if (write_fault)
*ptwrite = 1;
+   if (was_writeble)
+   kvm_x86_ops-tlb_flush(vcpu);
+   }
 
  


I think we had cases where the spte.pfn contents changed, for example 
when a large page was replaced by a normal page, and also:


   } else if (pfn != spte_to_pfn(*shadow_pte)) {


--
I have a truly marvellous patch that fixes the bug which this
signature is too narrow to contain.

--
To unsubscribe from this list: send the line unsubscribe kvm in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[patch 02/10] KVM: MMU: move local TLB flush to mmu_set_spte

2008-09-18 Thread Marcelo Tosatti
Since the sync page path can collapse flushes.

Also only flush if the spte was writable before.

Signed-off-by: Marcelo Tosatti [EMAIL PROTECTED]

Index: kvm/arch/x86/kvm/mmu.c
===
--- kvm.orig/arch/x86/kvm/mmu.c
+++ kvm/arch/x86/kvm/mmu.c
@@ -1189,10 +1189,8 @@ static int set_spte(struct kvm_vcpu *vcp
 __func__, gfn);
ret = 1;
pte_access = ~ACC_WRITE_MASK;
-   if (is_writeble_pte(spte)) {
+   if (is_writeble_pte(spte))
spte = ~PT_WRITABLE_MASK;
-   kvm_x86_ops-tlb_flush(vcpu);
-   }
}
}
 
@@ -1241,9 +1239,12 @@ static void mmu_set_spte(struct kvm_vcpu
}
}
if (set_spte(vcpu, shadow_pte, pte_access, user_fault, write_fault,
- dirty, largepage, gfn, pfn, speculative))
+ dirty, largepage, gfn, pfn, speculative)) {
if (write_fault)
*ptwrite = 1;
+   if (was_writeble)
+   kvm_x86_ops-tlb_flush(vcpu);
+   }
 
pgprintk(%s: setting spte %llx\n, __func__, *shadow_pte);
pgprintk(instantiating %s PTE (%s) at %ld (%llx) addr %p\n,

-- 

--
To unsubscribe from this list: send the line unsubscribe kvm in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html