aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'drivers')
-rw-r--r--drivers/kvm/kvm_main.c24
1 files changed, 7 insertions, 17 deletions
diff --git a/drivers/kvm/kvm_main.c b/drivers/kvm/kvm_main.c
index 5dc601702782..55639aceca63 100644
--- a/drivers/kvm/kvm_main.c
+++ b/drivers/kvm/kvm_main.c
@@ -916,28 +916,18 @@ struct page *gfn_to_page(struct kvm *kvm, gfn_t gfn)
916} 916}
917EXPORT_SYMBOL_GPL(gfn_to_page); 917EXPORT_SYMBOL_GPL(gfn_to_page);
918 918
919/* WARNING: Does not work on aliased pages. */
919void mark_page_dirty(struct kvm *kvm, gfn_t gfn) 920void mark_page_dirty(struct kvm *kvm, gfn_t gfn)
920{ 921{
921 int i;
922 struct kvm_memory_slot *memslot; 922 struct kvm_memory_slot *memslot;
923 unsigned long rel_gfn;
924 923
925 for (i = 0; i < kvm->nmemslots; ++i) { 924 memslot = __gfn_to_memslot(kvm, gfn);
926 memslot = &kvm->memslots[i]; 925 if (memslot && memslot->dirty_bitmap) {
926 unsigned long rel_gfn = gfn - memslot->base_gfn;
927 927
928 if (gfn >= memslot->base_gfn 928 /* avoid RMW */
929 && gfn < memslot->base_gfn + memslot->npages) { 929 if (!test_bit(rel_gfn, memslot->dirty_bitmap))
930 930 set_bit(rel_gfn, memslot->dirty_bitmap);
931 if (!memslot->dirty_bitmap)
932 return;
933
934 rel_gfn = gfn - memslot->base_gfn;
935
936 /* avoid RMW */
937 if (!test_bit(rel_gfn, memslot->dirty_bitmap))
938 set_bit(rel_gfn, memslot->dirty_bitmap);
939 return;
940 }
941 } 931 }
942} 932}
943 933