All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] kvm: make mmu_shrink() fit shrinker's requirement
@ 2010-08-04  7:13 Lai Jiangshan
  2010-08-05  9:28 ` Avi Kivity
  0 siblings, 1 reply; 6+ messages in thread
From: Lai Jiangshan @ 2010-08-04  7:13 UTC (permalink / raw)
  To: Avi Kivity, Marcelo Tosatti, LKML, kvm


mmu_shrink() should attempt to free @nr_to_scan entries.

Signed-off-by: Lai Jiangshan <laijs@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 = {

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH] kvm: make mmu_shrink() fit shrinker's requirement
  2010-08-04  7:13 [PATCH] kvm: make mmu_shrink() fit shrinker's requirement Lai Jiangshan
@ 2010-08-05  9:28 ` Avi Kivity
  2010-08-09 16:34   ` Dave Hansen
  2010-08-13 20:10   ` Dave Hansen
  0 siblings, 2 replies; 6+ messages in thread
From: Avi Kivity @ 2010-08-05  9:28 UTC (permalink / raw)
  To: Lai Jiangshan; +Cc: Marcelo Tosatti, LKML, kvm, Dave Hansen

  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 majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html


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


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] kvm: make mmu_shrink() fit shrinker's requirement
  2010-08-05  9:28 ` Avi Kivity
@ 2010-08-09 16:34   ` Dave Hansen
  2010-08-13 20:10   ` Dave Hansen
  1 sibling, 0 replies; 6+ messages in thread
From: Dave Hansen @ 2010-08-09 16:34 UTC (permalink / raw)
  To: Avi Kivity; +Cc: Lai Jiangshan, Marcelo Tosatti, LKML, kvm

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


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] kvm: make mmu_shrink() fit shrinker's requirement
  2010-08-05  9:28 ` Avi Kivity
  2010-08-09 16:34   ` Dave Hansen
@ 2010-08-13 20:10   ` Dave Hansen
  2010-08-15 11:14     ` Avi Kivity
  1 sibling, 1 reply; 6+ messages in thread
From: Dave Hansen @ 2010-08-13 20:10 UTC (permalink / raw)
  To: Avi Kivity; +Cc: Lai Jiangshan, Marcelo Tosatti, LKML, kvm

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


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] kvm: make mmu_shrink() fit shrinker's requirement
  2010-08-13 20:10   ` Dave Hansen
@ 2010-08-15 11:14     ` Avi Kivity
  2010-08-16 23:55       ` Tim Pepper
  0 siblings, 1 reply; 6+ messages in thread
From: Avi Kivity @ 2010-08-15 11:14 UTC (permalink / raw)
  To: Dave Hansen; +Cc: Lai Jiangshan, Marcelo Tosatti, LKML, kvm

  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


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] kvm: make mmu_shrink() fit shrinker's requirement
  2010-08-15 11:14     ` Avi Kivity
@ 2010-08-16 23:55       ` Tim Pepper
  0 siblings, 0 replies; 6+ messages in thread
From: Tim Pepper @ 2010-08-16 23:55 UTC (permalink / raw)
  To: Avi Kivity; +Cc: Dave Hansen, Lai Jiangshan, Marcelo Tosatti, LKML, kvm

On Sun, Aug 15, 2010 at 4:14 AM, Avi Kivity <avi@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

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2010-08-16 23:55 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2010-08-04  7:13 [PATCH] kvm: make mmu_shrink() fit shrinker's requirement Lai Jiangshan
2010-08-05  9:28 ` Avi Kivity
2010-08-09 16:34   ` Dave Hansen
2010-08-13 20:10   ` Dave Hansen
2010-08-15 11:14     ` Avi Kivity
2010-08-16 23:55       ` Tim Pepper

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.