aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTakuya Yoshikawa <yoshikawa_takuya_b1@lab.ntt.co.jp>2013-02-27 05:44:34 -0500
committerMarcelo Tosatti <mtosatti@redhat.com>2013-03-04 18:21:08 -0500
commit7b6195a91d60909a2834ab7181e2b9476e6fe749 (patch)
tree2a3713b45d77bb886e031be65f3ef5f576eeb300
parent74d0727cb7aaaea48a6353209093be26abc8d160 (diff)
KVM: set_memory_region: Refactor prepare_memory_region()
This patch drops the parameter old, a copy of the old memory slot, and adds a new parameter named change to know the change being requested. This not only cleans up the code but also removes extra copying of the memory slot structure. Signed-off-by: Takuya Yoshikawa <yoshikawa_takuya_b1@lab.ntt.co.jp> Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
-rw-r--r--arch/arm/kvm/arm.c4
-rw-r--r--arch/ia64/kvm/kvm-ia64.c4
-rw-r--r--arch/powerpc/kvm/powerpc.c4
-rw-r--r--arch/s390/kvm/kvm-s390.c4
-rw-r--r--arch/x86/kvm/x86.c10
-rw-r--r--include/linux/kvm_host.h4
-rw-r--r--virt/kvm/kvm_main.c2
7 files changed, 15 insertions, 17 deletions
diff --git a/arch/arm/kvm/arm.c b/arch/arm/kvm/arm.c
index 24cb5f66787d..96ebab7a1959 100644
--- a/arch/arm/kvm/arm.c
+++ b/arch/arm/kvm/arm.c
@@ -230,8 +230,8 @@ int kvm_arch_set_memory_region(struct kvm *kvm,
230 230
231int kvm_arch_prepare_memory_region(struct kvm *kvm, 231int kvm_arch_prepare_memory_region(struct kvm *kvm,
232 struct kvm_memory_slot *memslot, 232 struct kvm_memory_slot *memslot,
233 struct kvm_memory_slot old, 233 struct kvm_userspace_memory_region *mem,
234 struct kvm_userspace_memory_region *mem) 234 enum kvm_mr_change change)
235{ 235{
236 return 0; 236 return 0;
237} 237}
diff --git a/arch/ia64/kvm/kvm-ia64.c b/arch/ia64/kvm/kvm-ia64.c
index 43701f0c0f71..5c2b07e8c3d6 100644
--- a/arch/ia64/kvm/kvm-ia64.c
+++ b/arch/ia64/kvm/kvm-ia64.c
@@ -1560,8 +1560,8 @@ int kvm_arch_create_memslot(struct kvm_memory_slot *slot, unsigned long npages)
1560 1560
1561int kvm_arch_prepare_memory_region(struct kvm *kvm, 1561int kvm_arch_prepare_memory_region(struct kvm *kvm,
1562 struct kvm_memory_slot *memslot, 1562 struct kvm_memory_slot *memslot,
1563 struct kvm_memory_slot old, 1563 struct kvm_userspace_memory_region *mem,
1564 struct kvm_userspace_memory_region *mem) 1564 enum kvm_mr_change change)
1565{ 1565{
1566 unsigned long i; 1566 unsigned long i;
1567 unsigned long pfn; 1567 unsigned long pfn;
diff --git a/arch/powerpc/kvm/powerpc.c b/arch/powerpc/kvm/powerpc.c
index 22b33159fbc4..8aa51cd67c28 100644
--- a/arch/powerpc/kvm/powerpc.c
+++ b/arch/powerpc/kvm/powerpc.c
@@ -412,8 +412,8 @@ int kvm_arch_create_memslot(struct kvm_memory_slot *slot, unsigned long npages)
412 412
413int kvm_arch_prepare_memory_region(struct kvm *kvm, 413int kvm_arch_prepare_memory_region(struct kvm *kvm,
414 struct kvm_memory_slot *memslot, 414 struct kvm_memory_slot *memslot,
415 struct kvm_memory_slot old, 415 struct kvm_userspace_memory_region *mem,
416 struct kvm_userspace_memory_region *mem) 416 enum kvm_mr_change change)
417{ 417{
418 return kvmppc_core_prepare_memory_region(kvm, memslot, mem); 418 return kvmppc_core_prepare_memory_region(kvm, memslot, mem);
419} 419}
diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c
index 07ac302ce246..4288780c86b8 100644
--- a/arch/s390/kvm/kvm-s390.c
+++ b/arch/s390/kvm/kvm-s390.c
@@ -974,8 +974,8 @@ int kvm_arch_create_memslot(struct kvm_memory_slot *slot, unsigned long npages)
974/* Section: memory related */ 974/* Section: memory related */
975int kvm_arch_prepare_memory_region(struct kvm *kvm, 975int kvm_arch_prepare_memory_region(struct kvm *kvm,
976 struct kvm_memory_slot *memslot, 976 struct kvm_memory_slot *memslot,
977 struct kvm_memory_slot old, 977 struct kvm_userspace_memory_region *mem,
978 struct kvm_userspace_memory_region *mem) 978 enum kvm_mr_change change)
979{ 979{
980 /* A few sanity checks. We can have exactly one memory slot which has 980 /* A few sanity checks. We can have exactly one memory slot which has
981 to start at guest virtual zero and which has to be located at a 981 to start at guest virtual zero and which has to be located at a
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
index 26216bb4403f..7198234fa088 100644
--- a/arch/x86/kvm/x86.c
+++ b/arch/x86/kvm/x86.c
@@ -6906,23 +6906,21 @@ out_free:
6906 6906
6907int kvm_arch_prepare_memory_region(struct kvm *kvm, 6907int kvm_arch_prepare_memory_region(struct kvm *kvm,
6908 struct kvm_memory_slot *memslot, 6908 struct kvm_memory_slot *memslot,
6909 struct kvm_memory_slot old, 6909 struct kvm_userspace_memory_region *mem,
6910 struct kvm_userspace_memory_region *mem) 6910 enum kvm_mr_change change)
6911{ 6911{
6912 int npages = memslot->npages;
6913
6914 /* 6912 /*
6915 * Only private memory slots need to be mapped here since 6913 * Only private memory slots need to be mapped here since
6916 * KVM_SET_MEMORY_REGION ioctl is no longer supported. 6914 * KVM_SET_MEMORY_REGION ioctl is no longer supported.
6917 */ 6915 */
6918 if ((memslot->id >= KVM_USER_MEM_SLOTS) && npages && !old.npages) { 6916 if ((memslot->id >= KVM_USER_MEM_SLOTS) && (change == KVM_MR_CREATE)) {
6919 unsigned long userspace_addr; 6917 unsigned long userspace_addr;
6920 6918
6921 /* 6919 /*
6922 * MAP_SHARED to prevent internal slot pages from being moved 6920 * MAP_SHARED to prevent internal slot pages from being moved
6923 * by fork()/COW. 6921 * by fork()/COW.
6924 */ 6922 */
6925 userspace_addr = vm_mmap(NULL, 0, npages * PAGE_SIZE, 6923 userspace_addr = vm_mmap(NULL, 0, memslot->npages * PAGE_SIZE,
6926 PROT_READ | PROT_WRITE, 6924 PROT_READ | PROT_WRITE,
6927 MAP_SHARED | MAP_ANONYMOUS, 0); 6925 MAP_SHARED | MAP_ANONYMOUS, 0);
6928 6926
diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h
index 8eaf61f7b02d..caa72cf7e8e7 100644
--- a/include/linux/kvm_host.h
+++ b/include/linux/kvm_host.h
@@ -479,8 +479,8 @@ void kvm_arch_free_memslot(struct kvm_memory_slot *free,
479int kvm_arch_create_memslot(struct kvm_memory_slot *slot, unsigned long npages); 479int kvm_arch_create_memslot(struct kvm_memory_slot *slot, unsigned long npages);
480int kvm_arch_prepare_memory_region(struct kvm *kvm, 480int kvm_arch_prepare_memory_region(struct kvm *kvm,
481 struct kvm_memory_slot *memslot, 481 struct kvm_memory_slot *memslot,
482 struct kvm_memory_slot old, 482 struct kvm_userspace_memory_region *mem,
483 struct kvm_userspace_memory_region *mem); 483 enum kvm_mr_change change);
484void kvm_arch_commit_memory_region(struct kvm *kvm, 484void kvm_arch_commit_memory_region(struct kvm *kvm,
485 struct kvm_userspace_memory_region *mem, 485 struct kvm_userspace_memory_region *mem,
486 struct kvm_memory_slot old); 486 struct kvm_memory_slot old);
diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
index c7979ed41923..8f85bae862c7 100644
--- a/virt/kvm/kvm_main.c
+++ b/virt/kvm/kvm_main.c
@@ -856,7 +856,7 @@ int __kvm_set_memory_region(struct kvm *kvm,
856 slots = old_memslots; 856 slots = old_memslots;
857 } 857 }
858 858
859 r = kvm_arch_prepare_memory_region(kvm, &new, old, mem); 859 r = kvm_arch_prepare_memory_region(kvm, &new, mem, change);
860 if (r) 860 if (r)
861 goto out_slots; 861 goto out_slots;
862 862