From d3ab0d793d618b25f86c6075d4d1d38e914ecbff Mon Sep 17 00:00:00 2001 From: Avi Kivity Date: Mon, 8 Jun 2009 15:52:39 +0300 Subject: [PATCH] --- yaml --- r: 146607 b: refs/heads/master c: ac04527f7947020c5890090b2ac87af4e98d977e h: refs/heads/master i: 146605: 23c820cd5dcba30e2741a74cd8361aadbd3597b6 146603: 1d113a6d61d66ca644f1fe898a0a24106e323163 146599: 940e84c6c836dc7bb6dc4524e822995cfd04957c 146591: ddb9ee61ee9e46dc1daf4e9996334d7341fa41cb v: v3 --- [refs] | 2 +- trunk/virt/kvm/kvm_main.c | 10 +++++++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/[refs] b/[refs] index 39f04d0102c2..6c02711a9b91 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: a0861c02a981c943573478ea13b29b1fb958ee5b +refs/heads/master: ac04527f7947020c5890090b2ac87af4e98d977e diff --git a/trunk/virt/kvm/kvm_main.c b/trunk/virt/kvm/kvm_main.c index 5fed9bfc3cf5..5f865ed4c431 100644 --- a/trunk/virt/kvm/kvm_main.c +++ b/trunk/virt/kvm/kvm_main.c @@ -1086,7 +1086,7 @@ int __kvm_set_memory_region(struct kvm *kvm, { int r; gfn_t base_gfn; - unsigned long npages; + unsigned long npages, ugfn; int largepages; unsigned long i; struct kvm_memory_slot *memslot; @@ -1177,6 +1177,14 @@ int __kvm_set_memory_region(struct kvm *kvm, new.lpage_info[0].write_count = 1; if ((base_gfn+npages) % KVM_PAGES_PER_HPAGE) new.lpage_info[largepages-1].write_count = 1; + ugfn = new.userspace_addr >> PAGE_SHIFT; + /* + * If the gfn and userspace address are not aligned wrt each + * other, disable large page support for this slot + */ + if ((base_gfn ^ ugfn) & (KVM_PAGES_PER_HPAGE - 1)) + for (i = 0; i < largepages; ++i) + new.lpage_info[i].write_count = 1; } /* Allocate page dirty bitmap if needed */