Re: [PATCH] kvm: make mmu_shrink() fit shrinker's requirement

2010-08-16 Thread Tim Pepper
On Sun, Aug 15, 2010 at 4:14 AM, Avi Kivity a...@redhat.com wrote:
  On 08/13/2010 11:10 PM, Dave Hansen wrote:

 On Thu, 2010-08-05 at 12:28 +0300, Avi Kivity wrote:

 On 08/04/2010 10:13 AM, Lai Jiangshan wrote:

 mmu_shrink() should attempt to free @nr_to_scan entries.

 This conflicts with Dave's patchset.

 Dave, what's going on with those patches?  They're starting to smell.

 These seem to fix the original problem reporter's issue.  They were run
 with 64 guests on a 32GB machine.  No stability problems popped up in
 this testing, or since I last sent the patches to you.  The results from
 both the test with only the first four patches and with the entire set
 of nine looked pretty identical.

 That tells me that we should only push the first four for now:

        abstract kvm x86 mmu-n_free_mmu_pages
        rename x86 kvm-arch.n_alloc_mmu_pages
        replace x86 kvm n_free_mmu_pages with n_used_mmu_pages
        create aggregate kvm_total_used_mmu_pages value

 Well, patches 3 and 4 have unaddressed review comments. Please fix them up.
 If you don't have the time, let me know and I'll do it instead.

Dave's out on vacation now so it's probably best to assume he wont get
those fixups done very quickly.  Marcelo's comment on patch 3 is
simple.  The conversation regarding patch 4 back in June though
doesn't read like it clearly concluded...I'd be happy to work
something up, but if you've got strong preferences on which route to
use for protecting the count maybe I should leave it to you?


Tim
--
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: make mmu_shrink() fit shrinker's requirement

2010-08-15 Thread Avi Kivity

 On 08/13/2010 11:10 PM, Dave Hansen wrote:

On Thu, 2010-08-05 at 12:28 +0300, Avi Kivity wrote:

On 08/04/2010 10:13 AM, Lai Jiangshan wrote:

mmu_shrink() should attempt to free @nr_to_scan entries.

This conflicts with Dave's patchset.

Dave, what's going on with those patches?  They're starting to smell.

These seem to fix the original problem reporter's issue.  They were run
with 64 guests on a 32GB machine.  No stability problems popped up in
this testing, or since I last sent the patches to you.  The results from
both the test with only the first four patches and with the entire set
of nine looked pretty identical.

That tells me that we should only push the first four for now:

abstract kvm x86 mmu-n_free_mmu_pages
rename x86 kvm-arch.n_alloc_mmu_pages
replace x86 kvm n_free_mmu_pages with n_used_mmu_pages
create aggregate kvm_total_used_mmu_pages value


Well, patches 3 and 4 have unaddressed review comments. Please fix them 
up. If you don't have the time, let me know and I'll do it instead.


--
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: make mmu_shrink() fit shrinker's requirement

2010-08-13 Thread Dave Hansen
On Thu, 2010-08-05 at 12:28 +0300, Avi Kivity wrote:
 On 08/04/2010 10:13 AM, Lai Jiangshan wrote:
  mmu_shrink() should attempt to free @nr_to_scan entries.
 
 This conflicts with Dave's patchset.
 
 Dave, what's going on with those patches?  They're starting to smell.

These seem to fix the original problem reporter's issue.  They were run
with 64 guests on a 32GB machine.  No stability problems popped up in
this testing, or since I last sent the patches to you.  The results from
both the test with only the first four patches and with the entire set
of nine looked pretty identical.

That tells me that we should only push the first four for now:

abstract kvm x86 mmu-n_free_mmu_pages
rename x86 kvm-arch.n_alloc_mmu_pages
replace x86 kvm n_free_mmu_pages with n_used_mmu_pages
create aggregate kvm_total_used_mmu_pages value  


-- Dave

--
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: make mmu_shrink() fit shrinker's requirement

2010-08-09 Thread Dave Hansen
On Thu, 2010-08-05 at 12:28 +0300, Avi Kivity wrote:
 On 08/04/2010 10:13 AM, Lai Jiangshan wrote:
  mmu_shrink() should attempt to free @nr_to_scan entries.
 
 
 This conflicts with Dave's patchset.
 
 Dave, what's going on with those patches?  They're starting to smell.

The hardware and test rig that actually found the original scalability
problem is a bit contended with issues at the moment, so I've been
unable to get the original issue reproduced.

But, I think the patches should be able to stand on their own.  Even in
my testing, it's obvious that the shrinker code gets queries (via
nr_to_shrink=0) *way* more often than it's actually called upon to
shrink things.

Even if we have to come back with some more patches than this in the
future for the original problem that was found, we should feel confident
that this patch set is worthwhile and does some real, quantifiable good
on its own.

I'll go and immediately test that the first four patches in the series
are still behaving themselves in the way that I expect.

-- Dave

--
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: make mmu_shrink() fit shrinker's requirement

2010-08-05 Thread Avi Kivity

 On 08/04/2010 10:13 AM, Lai Jiangshan wrote:

mmu_shrink() should attempt to free @nr_to_scan entries.



This conflicts with Dave's patchset.

Dave, what's going on with those patches?  They're starting to smell.


@@ -3138,37 +3138,51 @@ static int mmu_shrink(struct shrinker *shrink, int 
nr_to_scan, gfp_t gfp_mask)
  {
struct kvm *kvm;
struct kvm *kvm_freed = NULL;
+   struct kvm *kvm_last;
int cache_count = 0;

spin_lock(kvm_lock);

-   list_for_each_entry(kvm,vm_list, vm_list) {
+   if (list_empty(vm_list))
+   goto out;
+
+   kvm_last = list_entry(vm_list.prev, struct kvm, vm_list);
+
+   for (;;) {
int npages, idx, freed_pages;
LIST_HEAD(invalid_list);

+   kvm = list_first_entry(vm_list, struct kvm, vm_list);
idx = srcu_read_lock(kvm-srcu);
spin_lock(kvm-mmu_lock);
npages = kvm-arch.n_alloc_mmu_pages -
 kvm-arch.n_free_mmu_pages;
-   cache_count += npages;
-   if (!kvm_freed  nr_to_scan  0  npages  0) {
+   if (kvm_last)
+   cache_count += npages;
+   if (nr_to_scan  0  npages  0) {
freed_pages = kvm_mmu_remove_some_alloc_mmu_pages(kvm,
invalid_list);
+   kvm_mmu_commit_zap_page(kvm,invalid_list);
cache_count -= freed_pages;
kvm_freed = kvm;
-   }
-   nr_to_scan--;
+   nr_to_scan -= freed_pages;
+   } else if (kvm == kvm_freed)
+   nr_to_scan = 0; /* no more page to be freed, break */

-   kvm_mmu_commit_zap_page(kvm,invalid_list);
spin_unlock(kvm-mmu_lock);
srcu_read_unlock(kvm-srcu, idx);
-   }
-   if (kvm_freed)
list_move_tail(kvm_freed-vm_list,vm_list);

+   if (kvm == kvm_last) /* just scaned all vms */
+   kvm_last = NULL;
+   if (!kvm_last  (nr_to_scan= 0 || !kvm_freed))
+   break;
+   }
+
+out:
spin_unlock(kvm_lock);

-   return cache_count;
+   return cache_count  0 ? 0 : cache_count;
  }

  static struct shrinker mmu_shrinker = {
--
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



--
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


[PATCH] kvm: make mmu_shrink() fit shrinker's requirement

2010-08-04 Thread Lai Jiangshan

mmu_shrink() should attempt to free @nr_to_scan entries.

Signed-off-by: Lai Jiangshan la...@cn.fujitsu.com
---
diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c
index 9c69725..1034373 100644
--- a/arch/x86/kvm/mmu.c
+++ b/arch/x86/kvm/mmu.c
@@ -3138,37 +3138,51 @@ static int mmu_shrink(struct shrinker *shrink, int 
nr_to_scan, gfp_t gfp_mask)
 {
struct kvm *kvm;
struct kvm *kvm_freed = NULL;
+   struct kvm *kvm_last;
int cache_count = 0;
 
spin_lock(kvm_lock);
 
-   list_for_each_entry(kvm, vm_list, vm_list) {
+   if (list_empty(vm_list))
+   goto out;
+
+   kvm_last = list_entry(vm_list.prev, struct kvm, vm_list);
+
+   for (;;) {
int npages, idx, freed_pages;
LIST_HEAD(invalid_list);
 
+   kvm = list_first_entry(vm_list, struct kvm, vm_list);
idx = srcu_read_lock(kvm-srcu);
spin_lock(kvm-mmu_lock);
npages = kvm-arch.n_alloc_mmu_pages -
 kvm-arch.n_free_mmu_pages;
-   cache_count += npages;
-   if (!kvm_freed  nr_to_scan  0  npages  0) {
+   if (kvm_last)
+   cache_count += npages;
+   if (nr_to_scan  0  npages  0) {
freed_pages = kvm_mmu_remove_some_alloc_mmu_pages(kvm,
  invalid_list);
+   kvm_mmu_commit_zap_page(kvm, invalid_list);
cache_count -= freed_pages;
kvm_freed = kvm;
-   }
-   nr_to_scan--;
+   nr_to_scan -= freed_pages;
+   } else if (kvm == kvm_freed)
+   nr_to_scan = 0; /* no more page to be freed, break */
 
-   kvm_mmu_commit_zap_page(kvm, invalid_list);
spin_unlock(kvm-mmu_lock);
srcu_read_unlock(kvm-srcu, idx);
-   }
-   if (kvm_freed)
list_move_tail(kvm_freed-vm_list, vm_list);
 
+   if (kvm == kvm_last) /* just scaned all vms */
+   kvm_last = NULL;
+   if (!kvm_last  (nr_to_scan = 0 || !kvm_freed))
+   break;
+   }
+
+out:
spin_unlock(kvm_lock);
 
-   return cache_count;
+   return cache_count  0 ? 0 : cache_count;
 }
 
 static struct shrinker mmu_shrinker = {
--
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