diff options
author | Takuya Yoshikawa <yoshikawa_takuya_b1@lab.ntt.co.jp> | 2013-02-27 05:44:34 -0500 |
---|---|---|
committer | Marcelo Tosatti <mtosatti@redhat.com> | 2013-03-04 18:21:08 -0500 |
commit | 7b6195a91d60909a2834ab7181e2b9476e6fe749 (patch) | |
tree | 2a3713b45d77bb886e031be65f3ef5f576eeb300 | |
parent | 74d0727cb7aaaea48a6353209093be26abc8d160 (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.c | 4 | ||||
-rw-r--r-- | arch/ia64/kvm/kvm-ia64.c | 4 | ||||
-rw-r--r-- | arch/powerpc/kvm/powerpc.c | 4 | ||||
-rw-r--r-- | arch/s390/kvm/kvm-s390.c | 4 | ||||
-rw-r--r-- | arch/x86/kvm/x86.c | 10 | ||||
-rw-r--r-- | include/linux/kvm_host.h | 4 | ||||
-rw-r--r-- | virt/kvm/kvm_main.c | 2 |
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 | ||
231 | int kvm_arch_prepare_memory_region(struct kvm *kvm, | 231 | int 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 | ||
1561 | int kvm_arch_prepare_memory_region(struct kvm *kvm, | 1561 | int 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 | ||
413 | int kvm_arch_prepare_memory_region(struct kvm *kvm, | 413 | int 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 */ |
975 | int kvm_arch_prepare_memory_region(struct kvm *kvm, | 975 | int 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 | ||
6907 | int kvm_arch_prepare_memory_region(struct kvm *kvm, | 6907 | int 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, | |||
479 | int kvm_arch_create_memslot(struct kvm_memory_slot *slot, unsigned long npages); | 479 | int kvm_arch_create_memslot(struct kvm_memory_slot *slot, unsigned long npages); |
480 | int kvm_arch_prepare_memory_region(struct kvm *kvm, | 480 | int 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); |
484 | void kvm_arch_commit_memory_region(struct kvm *kvm, | 484 | void 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 | ||