diff options
-rw-r--r-- | drivers/kvm/kvm_main.c | 24 |
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 | } |
917 | EXPORT_SYMBOL_GPL(gfn_to_page); | 917 | EXPORT_SYMBOL_GPL(gfn_to_page); |
918 | 918 | ||
919 | /* WARNING: Does not work on aliased pages. */ | ||
919 | void mark_page_dirty(struct kvm *kvm, gfn_t gfn) | 920 | void 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 | ||