]> git.ipfire.org Git - thirdparty/qemu.git/commitdiff
cputlb: handle first atomic write to the page
authorNikunj A Dadhania <nikunj@linux.vnet.ibm.com>
Thu, 27 Apr 2017 05:18:20 +0000 (10:48 +0530)
committerDavid Gibson <david@gibson.dropbear.id.au>
Wed, 10 May 2017 23:45:14 +0000 (09:45 +1000)
In case where the conditional write is the first write to the page,
TLB_NOTDIRTY will be set and stop_the_world is triggered. Handle this as
a special case and set the dirty bit. After that fall through to the
actual atomic instruction below.

Signed-off-by: Nikunj A Dadhania <nikunj@linux.vnet.ibm.com>
Reviewed-by: Richard Henderson <rth@twiddle.net>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
cputlb.c

index f5d056cc083ff24777d72653c80222a0c27d1b65..743776ae1907edfedd6966e62061fb55de6ab33e 100644 (file)
--- a/cputlb.c
+++ b/cputlb.c
@@ -930,7 +930,13 @@ static void *atomic_mmu_lookup(CPUArchState *env, target_ulong addr,
         tlb_addr = tlbe->addr_write;
     }
 
-    /* Notice an IO access, or a notdirty page.  */
+    /* Check notdirty */
+    if (unlikely(tlb_addr & TLB_NOTDIRTY)) {
+        tlb_set_dirty(ENV_GET_CPU(env), addr);
+        tlb_addr = tlb_addr & ~TLB_NOTDIRTY;
+    }
+
+    /* Notice an IO access  */
     if (unlikely(tlb_addr & ~TARGET_PAGE_MASK)) {
         /* There's really nothing that can be done to
            support this apart from stop-the-world.  */