[PATCH] KVM: Fix srcu struct leakage

2010-11-09 Thread Jan Kiszka
Clean up the srcu struct on vm destruction.

Signed-off-by: Jan Kiszka jan.kis...@siemens.com
---
 virt/kvm/kvm_main.c |1 +
 1 files changed, 1 insertions(+), 0 deletions(-)

diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
index 4111a4b..6ec58d1 100644
--- a/virt/kvm/kvm_main.c
+++ b/virt/kvm/kvm_main.c
@@ -513,6 +513,7 @@ static void kvm_destroy_vm(struct kvm *kvm)
 #else
kvm_arch_flush_shadow(kvm);
 #endif
+   cleanup_srcu_struct(kvm-srcu);
kvm_arch_destroy_vm(kvm);
hardware_disable_all();
mmdrop(mm);
-- 
1.7.1
--
To unsubscribe from this list: send the line unsubscribe kvm in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH] KVM: Fix srcu struct leakage

2010-11-09 Thread Avi Kivity

On 11/09/2010 01:41 PM, Jan Kiszka wrote:

Clean up the srcu struct on vm destruction.


Applied and queued for 2.6.37; thanks.

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

--
To unsubscribe from this list: send the line unsubscribe kvm in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH] KVM: Fix srcu struct leakage

2010-11-09 Thread Marcelo Tosatti
On Tue, Nov 09, 2010 at 12:41:26PM +0100, Jan Kiszka wrote:
 Clean up the srcu struct on vm destruction.
 
 Signed-off-by: Jan Kiszka jan.kis...@siemens.com
 ---
  virt/kvm/kvm_main.c |1 +
  1 files changed, 1 insertions(+), 0 deletions(-)
 
 diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
 index 4111a4b..6ec58d1 100644
 --- a/virt/kvm/kvm_main.c
 +++ b/virt/kvm/kvm_main.c
 @@ -513,6 +513,7 @@ static void kvm_destroy_vm(struct kvm *kvm)
  #else
   kvm_arch_flush_shadow(kvm);
  #endif
 + cleanup_srcu_struct(kvm-srcu);
   kvm_arch_destroy_vm(kvm);
   hardware_disable_all();
   mmdrop(mm);
 -- 
 1.7.1

kvm_arch_destroy_vm does it.
--
To unsubscribe from this list: send the line unsubscribe kvm in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH] KVM: Fix srcu struct leakage

2010-11-09 Thread Jan Kiszka
Am 09.11.2010 14:53, Marcelo Tosatti wrote:
 On Tue, Nov 09, 2010 at 12:41:26PM +0100, Jan Kiszka wrote:
 Clean up the srcu struct on vm destruction.

 Signed-off-by: Jan Kiszka jan.kis...@siemens.com
 ---
  virt/kvm/kvm_main.c |1 +
  1 files changed, 1 insertions(+), 0 deletions(-)

 diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
 index 4111a4b..6ec58d1 100644
 --- a/virt/kvm/kvm_main.c
 +++ b/virt/kvm/kvm_main.c
 @@ -513,6 +513,7 @@ static void kvm_destroy_vm(struct kvm *kvm)
  #else
  kvm_arch_flush_shadow(kvm);
  #endif
 +cleanup_srcu_struct(kvm-srcu);
  kvm_arch_destroy_vm(kvm);
  hardware_disable_all();
  mmdrop(mm);
 -- 
 1.7.1
 
 kvm_arch_destroy_vm does it.

Oh, indeed.

That I guess it's time to clean up, move generic allocation and release
into generic code. Having kvm_arch_create/destroy_vm manage the kvm
object allocation does not look very nice (and caused this confusion of
mine).

Jan

-- 
Siemens AG, Corporate Technology, CT T DE IT 1
Corporate Competence Center Embedded Linux
--
To unsubscribe from this list: send the line unsubscribe kvm in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH] KVM: Fix srcu struct leakage

2010-11-09 Thread Jan Kiszka
Am 09.11.2010 14:59, Jan Kiszka wrote:
 Am 09.11.2010 14:53, Marcelo Tosatti wrote:
 On Tue, Nov 09, 2010 at 12:41:26PM +0100, Jan Kiszka wrote:
 Clean up the srcu struct on vm destruction.

 Signed-off-by: Jan Kiszka jan.kis...@siemens.com
 ---
  virt/kvm/kvm_main.c |1 +
  1 files changed, 1 insertions(+), 0 deletions(-)

 diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
 index 4111a4b..6ec58d1 100644
 --- a/virt/kvm/kvm_main.c
 +++ b/virt/kvm/kvm_main.c
 @@ -513,6 +513,7 @@ static void kvm_destroy_vm(struct kvm *kvm)
  #else
 kvm_arch_flush_shadow(kvm);
  #endif
 +   cleanup_srcu_struct(kvm-srcu);
 kvm_arch_destroy_vm(kvm);
 hardware_disable_all();
 mmdrop(mm);
 -- 
 1.7.1

 kvm_arch_destroy_vm does it.
 
 Oh, indeed.
 
 That I guess it's time to clean up, move generic allocation and release
 into generic code. Having kvm_arch_create/destroy_vm manage the kvm
 object allocation does not look very nice (and caused this confusion of
 mine).

Oh, the setup/cleanup maze is a tribute to the IA64 zombie. Mmh...

Jan

-- 
Siemens AG, Corporate Technology, CT T DE IT 1
Corporate Competence Center Embedded Linux
--
To unsubscribe from this list: send the line unsubscribe kvm in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH] KVM: Fix srcu struct leakage

2010-11-09 Thread Marcelo Tosatti
On Tue, Nov 09, 2010 at 02:59:45PM +0100, Jan Kiszka wrote:
 Am 09.11.2010 14:53, Marcelo Tosatti wrote:
  On Tue, Nov 09, 2010 at 12:41:26PM +0100, Jan Kiszka wrote:
  Clean up the srcu struct on vm destruction.
 
  Signed-off-by: Jan Kiszka jan.kis...@siemens.com
  ---
   virt/kvm/kvm_main.c |1 +
   1 files changed, 1 insertions(+), 0 deletions(-)
 
  diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
  index 4111a4b..6ec58d1 100644
  --- a/virt/kvm/kvm_main.c
  +++ b/virt/kvm/kvm_main.c
  @@ -513,6 +513,7 @@ static void kvm_destroy_vm(struct kvm *kvm)
   #else
 kvm_arch_flush_shadow(kvm);
   #endif
  +  cleanup_srcu_struct(kvm-srcu);
 kvm_arch_destroy_vm(kvm);
 hardware_disable_all();
 mmdrop(mm);
  -- 
  1.7.1
  
  kvm_arch_destroy_vm does it.
 
 Oh, indeed.
 
 That I guess it's time to clean up, move generic allocation and release
 into generic code. Having kvm_arch_create/destroy_vm manage the kvm
 object allocation does not look very nice (and caused this confusion of
 mine).
 
 Jan

kvm_iommu_unmap_guest enters SRCU critical section, and struct kvm is
freed at the end of kvm_arch_destroy_vm. Thats why its not in generic
code.

But sure, it would be nicer if it could be moved to generic code.

void kvm_arch_destroy_vm(struct kvm *kvm)
{
kvm_iommu_unmap_guest(kvm);
kfree(kvm-arch.vpic);
kfree(kvm-arch.vioapic);
kvm_free_vcpus(kvm);
kvm_free_physmem(kvm);
if (kvm-arch.apic_access_page)
put_page(kvm-arch.apic_access_page);
if (kvm-arch.ept_identity_pagetable)
put_page(kvm-arch.ept_identity_pagetable);
cleanup_srcu_struct(kvm-srcu);
kfree(kvm);
}

--
To unsubscribe from this list: send the line unsubscribe kvm in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH] KVM: Fix srcu struct leakage

2010-11-09 Thread Avi Kivity

On 11/09/2010 04:07 PM, Jan Kiszka wrote:


  kvm_iommu_unmap_guest enters SRCU critical section, and struct kvm is
  freed at the end of kvm_arch_destroy_vm. Thats why its not in generic
  code.

The problem is the arch-specific allocation of the kvm object on IA64.
All others simply call kmalloc/kzalloc for the struct itself, but IA64
embeds it into some larger context. Not sure why, though.


ia64 virt is special - the guest has a virtual address space for host 
data.  This data is shared with the host address space, but on different 
addresses.


I guess to reduce tlb costs ia64 kvm uses a large order allocation for 
both struct kvm and other random data, which is why the allocation is 
different.


It could be refactored to something like

#ifndef CONFIG_HAVE_SPECIAL_KVM_ALLOC

static inline struct kvm *kvm_arch_alloc_vm(void)
{
return kzalloc(...);
}

static inline void kvm_arch_free_vm(struct kvm *kvm)
{
   kfree(kvm);
}

#endif

and have ia64 provide its special stuff.  The practice of duplicating 
common code just because of one outlier is bad, there are better ways.


(and I will accept untested ia64 patches provided kvm-ia64@ is copied).

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

--
To unsubscribe from this list: send the line unsubscribe kvm in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH] KVM: Fix srcu struct leakage

2010-11-09 Thread Jan Kiszka
Am 09.11.2010 15:30, Avi Kivity wrote:
 On 11/09/2010 04:07 PM, Jan Kiszka wrote:

  kvm_iommu_unmap_guest enters SRCU critical section, and struct kvm is
  freed at the end of kvm_arch_destroy_vm. Thats why its not in generic
  code.

 The problem is the arch-specific allocation of the kvm object on IA64.
 All others simply call kmalloc/kzalloc for the struct itself, but IA64
 embeds it into some larger context. Not sure why, though.
 
 ia64 virt is special - the guest has a virtual address space for host 
 data.  This data is shared with the host address space, but on different 
 addresses.
 
 I guess to reduce tlb costs ia64 kvm uses a large order allocation for 
 both struct kvm and other random data, which is why the allocation is 
 different.
 
 It could be refactored to something like
 
 #ifndef CONFIG_HAVE_SPECIAL_KVM_ALLOC
 
 static inline struct kvm *kvm_arch_alloc_vm(void)
 {
  return kzalloc(...);
 }
 
 static inline void kvm_arch_free_vm(struct kvm *kvm)
 {
 kfree(kvm);
 }
 
 #endif

Yep, that's what I'm already working on.

 
 and have ia64 provide its special stuff.  The practice of duplicating 
 common code just because of one outlier is bad, there are better ways.
 
 (and I will accept untested ia64 patches provided kvm-ia64@ is copied).

OK, will come. Refactoring will affect all archs, so all need to test
and ack.

Jan

-- 
Siemens AG, Corporate Technology, CT T DE IT 1
Corporate Competence Center Embedded Linux
--
To unsubscribe from this list: send the line unsubscribe kvm in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH] KVM: Fix srcu struct leakage

2010-11-09 Thread Jan Kiszka
Am 09.11.2010 15:03, Marcelo Tosatti wrote:
 On Tue, Nov 09, 2010 at 02:59:45PM +0100, Jan Kiszka wrote:
 Am 09.11.2010 14:53, Marcelo Tosatti wrote:
 On Tue, Nov 09, 2010 at 12:41:26PM +0100, Jan Kiszka wrote:
 Clean up the srcu struct on vm destruction.

 Signed-off-by: Jan Kiszka jan.kis...@siemens.com
 ---
  virt/kvm/kvm_main.c |1 +
  1 files changed, 1 insertions(+), 0 deletions(-)

 diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
 index 4111a4b..6ec58d1 100644
 --- a/virt/kvm/kvm_main.c
 +++ b/virt/kvm/kvm_main.c
 @@ -513,6 +513,7 @@ static void kvm_destroy_vm(struct kvm *kvm)
  #else
kvm_arch_flush_shadow(kvm);
  #endif
 +  cleanup_srcu_struct(kvm-srcu);
kvm_arch_destroy_vm(kvm);
hardware_disable_all();
mmdrop(mm);
 -- 
 1.7.1

 kvm_arch_destroy_vm does it.

 Oh, indeed.

 That I guess it's time to clean up, move generic allocation and release
 into generic code. Having kvm_arch_create/destroy_vm manage the kvm
 object allocation does not look very nice (and caused this confusion of
 mine).

 Jan
 
 kvm_iommu_unmap_guest enters SRCU critical section, and struct kvm is
 freed at the end of kvm_arch_destroy_vm. Thats why its not in generic
 code.

The problem is the arch-specific allocation of the kvm object on IA64.
All others simply call kmalloc/kzalloc for the struct itself, but IA64
embeds it into some larger context. Not sure why, though.

Jan

-- 
Siemens AG, Corporate Technology, CT T DE IT 1
Corporate Competence Center Embedded Linux
--
To unsubscribe from this list: send the line unsubscribe kvm in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH] KVM: Fix srcu struct leakage

2010-11-09 Thread Avi Kivity

On 11/09/2010 03:53 PM, Marcelo Tosatti wrote:

On Tue, Nov 09, 2010 at 12:41:26PM +0100, Jan Kiszka wrote:
  Clean up the srcu struct on vm destruction.

  Signed-off-by: Jan Kiszkajan.kis...@siemens.com
  ---
   virt/kvm/kvm_main.c |1 +
   1 files changed, 1 insertions(+), 0 deletions(-)

  diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
  index 4111a4b..6ec58d1 100644
  --- a/virt/kvm/kvm_main.c
  +++ b/virt/kvm/kvm_main.c
  @@ -513,6 +513,7 @@ static void kvm_destroy_vm(struct kvm *kvm)
   #else
kvm_arch_flush_shadow(kvm);
   #endif
  + cleanup_srcu_struct(kvm-srcu);
kvm_arch_destroy_vm(kvm);
hardware_disable_all();
mmdrop(mm);
  -- 
  1.7.1


kvm_arch_destroy_vm does it.


True.  Dropped.

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

--
To unsubscribe from this list: send the line unsubscribe kvm in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH] KVM: Fix srcu struct leakage

2010-11-09 Thread Avi Kivity

 On 11/09/2010 04:36 PM, Jan Kiszka wrote:



and have ia64 provide its special stuff.  The practice of duplicating
common code just because of one outlier is bad, there are better ways.

(and I will accept untested ia64 patches provided kvm-ia64@ is copied).

OK, will come. Refactoring will affect all archs, so all need to test
and ack.


I can at least build on all of them.  Should set up a buildbot...
--
To unsubscribe from this list: send the line unsubscribe kvm in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH] KVM: Fix srcu struct leakage

2010-11-07 Thread Jan Kiszka
From: Jan Kiszka jan.kis...@siemens.com

Clean up the srcu struct and refactor its release on early errors.

Signed-off-by: Jan Kiszka jan.kis...@siemens.com
---
 virt/kvm/kvm_main.c |   15 +++
 1 files changed, 7 insertions(+), 8 deletions(-)

diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
index 4111a4b..c80a44a 100644
--- a/virt/kvm/kvm_main.c
+++ b/virt/kvm/kvm_main.c
@@ -401,23 +401,19 @@ static struct kvm *kvm_create_vm(void)
r = -ENOMEM;
kvm-memslots = kzalloc(sizeof(struct kvm_memslots), GFP_KERNEL);
if (!kvm-memslots)
-   goto out_err;
+   goto out_err_nosrcu;
if (init_srcu_struct(kvm-srcu))
-   goto out_err;
+   goto out_err_nosrcu;
for (i = 0; i  KVM_NR_BUSES; i++) {
kvm-buses[i] = kzalloc(sizeof(struct kvm_io_bus),
GFP_KERNEL);
-   if (!kvm-buses[i]) {
-   cleanup_srcu_struct(kvm-srcu);
+   if (!kvm-buses[i])
goto out_err;
-   }
}
 
r = kvm_init_mmu_notifier(kvm);
-   if (r) {
-   cleanup_srcu_struct(kvm-srcu);
+   if (r)
goto out_err;
-   }
 
kvm-mm = current-mm;
atomic_inc(kvm-mm-mm_count);
@@ -435,6 +431,8 @@ out:
return kvm;
 
 out_err:
+   cleanup_srcu_struct(kvm-srcu);
+out_err_nosrcu:
hardware_disable_all();
 out_err_nodisable:
for (i = 0; i  KVM_NR_BUSES; i++)
@@ -516,6 +514,7 @@ static void kvm_destroy_vm(struct kvm *kvm)
kvm_arch_destroy_vm(kvm);
hardware_disable_all();
mmdrop(mm);
+   cleanup_srcu_struct(kvm-srcu);
 }
 
 void kvm_get_kvm(struct kvm *kvm)
-- 
1.7.1
--
To unsubscribe from this list: send the line unsubscribe kvm in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html