aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/kvm
diff options
context:
space:
mode:
authorRusty Russell <rusty@rustcorp.com.au>2007-07-31 06:41:14 -0400
committerAvi Kivity <avi@qumranet.com>2007-10-13 04:18:22 -0400
commit7e9d619d2aa28b71d547edfa15c66d6ab9a3a39c (patch)
tree6500d9365b0d9db2988fd7d33cacb1e2cf1d0337 /drivers/kvm
parentfb764416492a1204c20fdf4507019012d27bd1a2 (diff)
KVM: Cleanup mark_page_dirty
For some reason, mark_page_dirty open-codes __gfn_to_memslot(). Signed-off-by: Rusty Russell <rusty@rustcorp.com.au> Signed-off-by: Avi Kivity <avi@qumranet.com>
Diffstat (limited to 'drivers/kvm')
-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