On 06/06/2010 04:06 PM, Avi Kivity wrote:
When we call rmap_remove(), we (almost) always immediately follow it by
an __set_spte() to a nonpresent pte.  Since we need to perform the two
operations atomically, to avoid losing the dirty and accessed bits, introduce
a helper drop_spte() and convert all call sites.

The operation is still nonatomic at this point.


@@ -1498,13 +1502,14 @@ static void kvm_mmu_page_unlink_children(struct kvm 
*kvm,
                                ent&= PT64_BASE_ADDR_MASK;
                                mmu_page_remove_parent_pte(page_header(ent),
                                                        &pt[i]);
+                               pt[i] = shadow_trap_nonpresent_pte;
                        } else {
                                if (is_large_pte(ent))
                                        --kvm->stat.lpages;
-                               rmap_remove(kvm,&pt[i]);
+                               drop_spte(kvm,&pt[i],
+                                         shadow_trap_nonpresent_pte);
                        }
                }
-               pt[i] = shadow_trap_nonpresent_pte;
        }
  }

Autotest points out that this transformation (and an identical one in zap_pte) does not preserve the semantics; if the outer if () fails, the new code does not update pt[i].

With the original line after the if () retained, autotest is happier.

--
error compiling committee.c: too many arguments to function

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

Reply via email to