On Sat, Apr 21, 2012 at 11:24:54AM +0800, Xiao Guangrong wrote: > On 04/21/2012 05:33 AM, Marcelo Tosatti wrote: > > > >> static bool > >> __rmap_write_protect(struct kvm *kvm, unsigned long *rmapp, int level) > >> { > >> @@ -1050,24 +1078,13 @@ __rmap_write_protect(struct kvm *kvm, unsigned long *rmapp, int level) > >> > >> for (sptep = rmap_get_first(*rmapp, &iter); sptep;) { > >> BUG_ON(!(*sptep & PT_PRESENT_MASK)); > >> - rmap_printk("rmap_write_protect: spte %p %llx\n", sptep, *sptep); > >> - > >> - if (!is_writable_pte(*sptep)) { > >> - sptep = rmap_get_next(&iter); > >> - continue; > >> - } > >> - > >> - if (level == PT_PAGE_TABLE_LEVEL) { > >> - mmu_spte_update(sptep, *sptep & ~PT_WRITABLE_MASK); > >> - sptep = rmap_get_next(&iter); > >> - } else { > >> - BUG_ON(!is_large_pte(*sptep)); > >> - drop_spte(kvm, sptep); > >> - --kvm->stat.lpages; > > > > It is preferable to remove all large sptes including read-only ones, the > > > It can cause page faults even if read memory on these large sptse. > > Actually, Avi suggested that make large writable spte to be readonly > (not dropped) on this path. See commits e49146dce8c3dc6f4485c1904b6587855f393e71, 38187c830cab84daecb41169948467f1f19317e3 for issues with large read-only sptes. > > current behaviour, then to verify that no read->write transition can > > occur in fault paths (fault paths which are increasing in number). > > > Yes, the small spte also has issue (find a write-protected spte in > fault paths). Later, the second part of this patchset will introduce > rmap.WRITE_PROTECTED bit, then we can do the fast check before calling > fast page fault. -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html