public inbox for kvm@vger.kernel.org
 help / color / mirror / Atom feed
From: Avi Kivity <avi-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
To: Izik Eidus <izike-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
Cc: kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org
Subject: Re: [PATCH 3/3] add support for dynamicly allocation of mmu	pages.
Date: Sun, 19 Aug 2007 11:22:10 +0300	[thread overview]
Message-ID: <46C7FDB2.6040400@qumranet.com> (raw)
In-Reply-To: <1187467798.28221.55.camel-wV29XY6ncz+I84jL4+POOYeT0m0igiSA0E9HWUfgJXw@public.gmane.org>

Izik Eidus wrote:
> this patch all the functions that use the mmu pages
> it teach them how to use the new lists.
>   

> --- mmu.c	2007-08-15 11:37:08.000000000 +0300
> +++ new_mmu.c	2007-08-19 06:27:56.000000000 +0300
> @@ -586,14 +586,25 @@
>  static struct kvm_mmu_page *kvm_mmu_lookup_page(struct kvm_vcpu *vcpu,
>  						gfn_t gfn)
>  {
> -	unsigned index;
> +	unsigned index, index_div_blocks;
>  	struct hlist_head *bucket;
>  	struct kvm_mmu_page *page;
>  	struct hlist_node *node;
> +	struct list_head *block_node;
> +	struct kvm_mmu_hash_block *hash_block;
> +	int i;
>  
>  	pgprintk("%s: looking for gfn %lx\n", __FUNCTION__, gfn);
> -	index = kvm_page_table_hashfn(gfn) % KVM_NUM_MMU_PAGES;
> -	bucket = &vcpu->kvm->mmu_page_hash[index];
> +	index = kvm_page_table_hashfn(gfn) % (KVM_NUM_MMU_PAGES_BLOCK *
> +				vcpu->kvm->n_mmu_page_hash_blocks);
> +	block_node = vcpu->kvm->mmu_page_hash_blocks.next;
> +	index_div_blocks = index / KVM_NUM_MMU_PAGES_BLOCK;
> +	
> +	for (i = 0; i < index_div_blocks; ++i)
> +		block_node = block_node->next;
> +	
> +	hash_block = list_entry(block_node, struct kvm_mmu_hash_block, head);
> +	bucket = &hash_block->mmu_page_hash[index % KVM_NUM_MMU_PAGES_BLOCK];
>   

This is slowing down kvm_mmu_lookup_page() for large memory guests.  
This is a frequently called function!


>  	hlist_for_each_entry(page, node, bucket, hash_link)
>  		if (page->gfn == gfn && !page->role.metaphysical) {
>  			pgprintk("%s: found role %x\n",
> @@ -612,11 +623,14 @@
>  					     u64 *parent_pte)
>  {
>  	union kvm_mmu_page_role role;
> -	unsigned index;
> +	unsigned index, index_div_blocks;
>  	unsigned quadrant;
>  	struct hlist_head *bucket;
>  	struct kvm_mmu_page *page;
>  	struct hlist_node *node;
> +	struct list_head *block_node;
> +	struct kvm_mmu_hash_block *hash_block;
> +	int i;
>  
>  	role.word = 0;
>  	role.glevels = vcpu->mmu.root_level;
> @@ -630,8 +644,16 @@
>  	}
>  	pgprintk("%s: looking gfn %lx role %x\n", __FUNCTION__,
>  		 gfn, role.word);
> -	index = kvm_page_table_hashfn(gfn) % KVM_NUM_MMU_PAGES;
> -	bucket = &vcpu->kvm->mmu_page_hash[index];
> +	index = kvm_page_table_hashfn(gfn) % (KVM_NUM_MMU_PAGES_BLOCK *
> +				vcpu->kvm->n_mmu_page_hash_blocks);
> +	block_node = vcpu->kvm->mmu_page_hash_blocks.next;
> +	index_div_blocks = index / KVM_NUM_MMU_PAGES_BLOCK;
> +	
> +	for (i = 0; i < index_div_blocks; ++i)
> +		block_node = block_node->next;
> +	
> +	hash_block = list_entry(block_node, struct kvm_mmu_hash_block, head);
> +	bucket = &hash_block->mmu_page_hash[index % KVM_NUM_MMU_PAGES_BLOCK];
>   

Code duplication, this is better extracted into a helper.

>  	hlist_for_each_entry(page, node, bucket, hash_link)
>  		if (page->gfn == gfn && page->role.word == role.word) {
>  			mmu_page_add_parent_pte(vcpu, page, parent_pte);
> @@ -716,16 +738,26 @@
>  
>  static int kvm_mmu_unprotect_page(struct kvm_vcpu *vcpu, gfn_t gfn)
>  {
> -	unsigned index;
> +	unsigned index, index_div_blocks;
>  	struct hlist_head *bucket;
>  	struct kvm_mmu_page *page;
>  	struct hlist_node *node, *n;
> -	int r;
> +	struct list_head *block_node;
> +	struct kvm_mmu_hash_block *hash_block;
> +	int r, i;
>  
>  	pgprintk("%s: looking for gfn %lx\n", __FUNCTION__, gfn);
>  	r = 0;
> -	index = kvm_page_table_hashfn(gfn) % KVM_NUM_MMU_PAGES;
> -	bucket = &vcpu->kvm->mmu_page_hash[index];
> +	index = kvm_page_table_hashfn(gfn) % (KVM_NUM_MMU_PAGES_BLOCK *
> +				vcpu->kvm->n_mmu_page_hash_blocks);
> +	block_node = vcpu->kvm->mmu_page_hash_blocks.next;
> +	index_div_blocks = index / KVM_NUM_MMU_PAGES_BLOCK;
> +	
> +	for (i = 0; i < index_div_blocks; ++i)
> +		block_node = block_node->next;
> +	
> +	hash_block = list_entry(block_node, struct kvm_mmu_hash_block, head);
> +	bucket = &hash_block->mmu_page_hash[index % KVM_NUM_MMU_PAGES_BLOCK];
>   

Likewise.

>  	hlist_for_each_entry_safe(page, node, n, bucket, hash_link)
>  		if (page->gfn == gfn && !page->role.metaphysical) {
>  			pgprintk("%s: gfn %lx role %x\n", __FUNCTION__, gfn,
> @@ -1126,7 +1158,9 @@
>  	struct kvm_mmu_page *page;
>  	struct hlist_node *node, *n;
>  	struct hlist_head *bucket;
> -	unsigned index;
> +	struct list_head *block_node;
> +	struct kvm_mmu_hash_block *hash_block;
> +	unsigned index , index_div_blocks;
>  	u64 *spte;
>  	unsigned offset = offset_in_page(gpa);
>  	unsigned pte_size;
> @@ -1136,6 +1170,7 @@
>  	int level;
>  	int flooded = 0;
>  	int npte;
> +	int i;
>  
>  	pgprintk("%s: gpa %llx bytes %d\n", __FUNCTION__, gpa, bytes);
>  	if (gfn == vcpu->last_pt_write_gfn) {
> @@ -1146,8 +1181,16 @@
>  		vcpu->last_pt_write_gfn = gfn;
>  		vcpu->last_pt_write_count = 1;
>  	}
> -	index = kvm_page_table_hashfn(gfn) % KVM_NUM_MMU_PAGES;
> -	bucket = &vcpu->kvm->mmu_page_hash[index];
> +	index = kvm_page_table_hashfn(gfn) % (KVM_NUM_MMU_PAGES_BLOCK *
> +				vcpu->kvm->n_mmu_page_hash_blocks);
> +	block_node = vcpu->kvm->mmu_page_hash_blocks.next;
> +	index_div_blocks = index / KVM_NUM_MMU_PAGES_BLOCK;
> +	
> +	for (i = 0; i < index_div_blocks; ++i)
> +		block_node = block_node->next;
> +	
> +	hash_block = list_entry(block_node, struct kvm_mmu_hash_block, head);
> +	bucket = &hash_block->mmu_page_hash[index % KVM_NUM_MMU_PAGES_BLOCK];
>   

Ditto.


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


-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems?  Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >>  http://get.splunk.com/

  parent reply	other threads:[~2007-08-19  8:22 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-08-18 19:51 [PATCH 0/3] add support for dynamicly allocation of mmu pages Izik Eidus
     [not found] ` <1187466871.28221.39.camel@izike-desktop.qumranet.com>
     [not found]   ` <1187466871.28221.39.camel-wV29XY6ncz+I84jL4+POOYeT0m0igiSA0E9HWUfgJXw@public.gmane.org>
2007-08-18 20:06     ` [PATCH 1/3] " Izik Eidus
     [not found]       ` <1187467612.28221.50.camel-wV29XY6ncz+I84jL4+POOYeT0m0igiSA0E9HWUfgJXw@public.gmane.org>
2007-08-19  8:14         ` Avi Kivity
     [not found] ` <1187467003.28221.42.camel@izike-desktop.qumranet.com>
     [not found]   ` <1187467003.28221.42.camel-wV29XY6ncz+I84jL4+POOYeT0m0igiSA0E9HWUfgJXw@public.gmane.org>
2007-08-18 20:08     ` [PATCH 2/3] " Izik Eidus
     [not found]       ` <1187467694.28221.52.camel-wV29XY6ncz+I84jL4+POOYeT0m0igiSA0E9HWUfgJXw@public.gmane.org>
2007-08-19  8:19         ` Avi Kivity
     [not found] ` <1187467063.28221.44.camel@izike-desktop.qumranet.com>
     [not found]   ` <1187467063.28221.44.camel-wV29XY6ncz+I84jL4+POOYeT0m0igiSA0E9HWUfgJXw@public.gmane.org>
2007-08-18 20:09     ` [PATCH 3/3] " Izik Eidus
     [not found]       ` <1187467798.28221.55.camel-wV29XY6ncz+I84jL4+POOYeT0m0igiSA0E9HWUfgJXw@public.gmane.org>
2007-08-19  8:22         ` Avi Kivity [this message]
     [not found] ` <1187467150.28221.47.camel@izike-desktop.qumranet.com>
     [not found]   ` <1187467150.28221.47.camel-wV29XY6ncz+I84jL4+POOYeT0m0igiSA0E9HWUfgJXw@public.gmane.org>
2007-08-18 20:11     ` [PATCH 0/3] " Izik Eidus
     [not found]       ` <1187467867.28221.57.camel-wV29XY6ncz+I84jL4+POOYeT0m0igiSA0E9HWUfgJXw@public.gmane.org>
2007-08-18 20:35         ` [PATCH 0/3] add support for dynamicly allocation ofmmu pages Dor Laor
     [not found]           ` <64F9B87B6B770947A9F8391472E032160D46464F-yEcIvxbTEBqsx+V+t5oei8rau4O3wl8o3fe8/T/H7NteoWH0uzbU5w@public.gmane.org>
2007-08-19  8:09             ` Avi Kivity
     [not found]               ` <46C7FACA.3020706-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
2007-08-19  8:25                 ` [PATCH 0/3] add support for dynamically " Dor Laor

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=46C7FDB2.6040400@qumranet.com \
    --to=avi-atkuwr5tajbwk0htik3j/w@public.gmane.org \
    --cc=izike-atKUWr5tajBWk0Htik3J/w@public.gmane.org \
    --cc=kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox