Re: [kvm-devel] [PATCH] KVM Portability : Spliting kvm_set_memory_region.

2007-11-20 Thread Carsten Otte
Zhang, Xiantao wrote:
> From: Zhang Xiantao <[EMAIL PROTECTED]>
> Date: Tue, 20 Nov 2007 16:25:04 +0800
> Subject: [PATCH] KVM Portability : Spliting kvm_set_memory_region.
> Moving !user_alloc case to kvm_arch to avoid unnecessary
> code logic in non-x86 platform.
> Signed-off-by: Zhang Xiantao <[EMAIL PROTECTED]>
> ---
>  drivers/kvm/kvm.h  |4 +++
>  drivers/kvm/kvm_main.c |   38 ---
>  drivers/kvm/x86.c  |   51
> 
>  3 files changed, 60 insertions(+), 33 deletions(-)

I don't think we'll want the rmap part in common for s390, but I am 
not sure just yet. If it turns out to be the case, I might submit an 
add on patch that moves it to arch on day. Other then that, this split 
looks good to me. Well done, Xiantao!

Acked-by: Carsten Otte <[EMAIL PROTECTED]>

-
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2005.
http://clk.atdmt.com/MRT/go/vse012070mrt/direct/01/
___
kvm-devel mailing list
kvm-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/kvm-devel


Re: [kvm-devel] [PATCH] KVM Portability : Spliting kvm_set_memory_region.

2007-11-20 Thread Avi Kivity
Zhang, Xiantao wrote:
> From: Zhang Xiantao <[EMAIL PROTECTED]>
> Date: Tue, 20 Nov 2007 16:25:04 +0800
> Subject: [PATCH] KVM Portability : Spliting kvm_set_memory_region.
> Moving !user_alloc case to kvm_arch to avoid unnecessary
> code logic in non-x86 platform.
> Signed-off-by: Zhang Xiantao <[EMAIL PROTECTED]>
>   

Applied this and the previous patch; thanks.

-- 
error compiling committee.c: too many arguments to function


-
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2005.
http://clk.atdmt.com/MRT/go/vse012070mrt/direct/01/
___
kvm-devel mailing list
kvm-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/kvm-devel


[kvm-devel] [PATCH] KVM Portability : Spliting kvm_set_memory_region.

2007-11-20 Thread Zhang, Xiantao
From: Zhang Xiantao <[EMAIL PROTECTED]>
Date: Tue, 20 Nov 2007 16:25:04 +0800
Subject: [PATCH] KVM Portability : Spliting kvm_set_memory_region.
Moving !user_alloc case to kvm_arch to avoid unnecessary
code logic in non-x86 platform.
Signed-off-by: Zhang Xiantao <[EMAIL PROTECTED]>
---
 drivers/kvm/kvm.h  |4 +++
 drivers/kvm/kvm_main.c |   38 ---
 drivers/kvm/x86.c  |   51

 3 files changed, 60 insertions(+), 33 deletions(-)

diff --git a/drivers/kvm/kvm.h b/drivers/kvm/kvm.h
index 1901456..9b8bd9d 100644
--- a/drivers/kvm/kvm.h
+++ b/drivers/kvm/kvm.h
@@ -392,6 +392,10 @@ int kvm_set_memory_region(struct kvm *kvm,
 int __kvm_set_memory_region(struct kvm *kvm,
struct kvm_userspace_memory_region *mem,
int user_alloc);
+int kvm_arch_set_memory_region(struct kvm *kvm,
+   struct kvm_userspace_memory_region *mem,
+   struct kvm_memory_slot old,
+   int user_alloc);
 gfn_t unalias_gfn(struct kvm *kvm, gfn_t gfn);
 struct page *gfn_to_page(struct kvm *kvm, gfn_t gfn);
 void kvm_release_page(struct page *page);
diff --git a/drivers/kvm/kvm_main.c b/drivers/kvm/kvm_main.c
index 8a90f7d..4624761 100644
--- a/drivers/kvm/kvm_main.c
+++ b/drivers/kvm/kvm_main.c
@@ -290,33 +290,7 @@ int __kvm_set_memory_region(struct kvm *kvm,
memset(new.rmap, 0, npages * sizeof(*new.rmap));
 
new.user_alloc = user_alloc;
-   if (user_alloc)
-   new.userspace_addr = mem->userspace_addr;
-   else {
-   down_write(¤t->mm->mmap_sem);
-   new.userspace_addr = do_mmap(NULL, 0,
-npages * PAGE_SIZE,
-PROT_READ |
PROT_WRITE,
-MAP_SHARED |
MAP_ANONYMOUS,
-0);
-   up_write(¤t->mm->mmap_sem);
-
-   if (IS_ERR((void *)new.userspace_addr))
-   goto out_free;
-   }
-   } else {
-   if (!old.user_alloc && old.rmap) {
-   int ret;
-
-   down_write(¤t->mm->mmap_sem);
-   ret = do_munmap(current->mm, old.userspace_addr,
-   old.npages * PAGE_SIZE);
-   up_write(¤t->mm->mmap_sem);
-   if (ret < 0)
-   printk(KERN_WARNING
-  "kvm_vm_ioctl_set_memory_region:
"
-  "failed to munmap memory\n");
-   }
+   new.userspace_addr = mem->userspace_addr;
}
 
/* Allocate page dirty bitmap if needed */
@@ -334,14 +308,12 @@ int __kvm_set_memory_region(struct kvm *kvm,
 
*memslot = new;
 
-   if (!kvm->n_requested_mmu_pages) {
-   unsigned int nr_mmu_pages =
kvm_mmu_calculate_mmu_pages(kvm);
-   kvm_mmu_change_mmu_pages(kvm, nr_mmu_pages);
+   r = kvm_arch_set_memory_region(kvm, mem, old, user_alloc);
+   if (r){
+   *memslot = old;
+   goto out_free;
}
 
-   kvm_mmu_slot_remove_write_access(kvm, mem->slot);
-   kvm_flush_remote_tlbs(kvm);
-
kvm_free_physmem_slot(&old, &new);
return 0;
 
diff --git a/drivers/kvm/x86.c b/drivers/kvm/x86.c
index 40871b5..6864d18 100644
--- a/drivers/kvm/x86.c
+++ b/drivers/kvm/x86.c
@@ -24,6 +24,7 @@
 #include 
 #include 
 #include 
+#include 
 
 #include 
 #include 
@@ -2647,3 +2648,53 @@ void kvm_arch_destroy_vm(struct kvm *kvm)
kvm_free_physmem(kvm);
kfree(kvm);
 }
+
+int kvm_arch_set_memory_region(struct kvm *kvm,
+   struct kvm_userspace_memory_region *mem,
+   struct kvm_memory_slot old,
+   int user_alloc)
+{
+   int npages = mem->memory_size >> PAGE_SHIFT;
+   struct kvm_memory_slot *memslot = &kvm->memslots[mem->slot];
+
+   /*To keep backward compatibility with older userspace,
+*x86 needs to hanlde !user_alloc case.
+*/
+   if (!user_alloc) {
+   if (npages && !old.rmap) {
+   down_write(¤t->mm->mmap_sem);
+   memslot->userspace_addr = do_mmap(NULL, 0,
+npages * PAGE_SIZE,
+PROT_READ |
PROT_WRITE,
+MAP_SHARED |
MAP_ANONYMOUS,
+0);
+   up_write(¤t->mm->mmap_sem);
+
+   if (IS_ERR((void *)memslot-