diff options
| -rw-r--r-- | arch/x86/kvm/mmu.c | 3 | ||||
| -rw-r--r-- | include/linux/kvm_host.h | 7 | ||||
| -rw-r--r-- | virt/kvm/kvm_main.c | 7 | 
3 files changed, 9 insertions, 8 deletions
| diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c index ae76cc3392e1..37e7f100a0e0 100644 --- a/arch/x86/kvm/mmu.c +++ b/arch/x86/kvm/mmu.c @@ -688,8 +688,7 @@ static struct kvm_lpage_info *lpage_info_slot(gfn_t gfn,  {  	unsigned long idx; -	idx = (gfn >> KVM_HPAGE_GFN_SHIFT(level)) - -	      (slot->base_gfn >> KVM_HPAGE_GFN_SHIFT(level)); +	idx = gfn_to_index(gfn, slot->base_gfn, level);  	return &slot->lpage_info[level - 2][idx];  } diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index 9698080c902b..7a08496b974a 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h @@ -681,6 +681,13 @@ static inline int memslot_id(struct kvm *kvm, gfn_t gfn)  	return gfn_to_memslot(kvm, gfn)->id;  } +static inline gfn_t gfn_to_index(gfn_t gfn, gfn_t base_gfn, int level) +{ +	/* KVM_HPAGE_GFN_SHIFT(PT_PAGE_TABLE_LEVEL) must be 0. */ +	return (gfn >> KVM_HPAGE_GFN_SHIFT(level)) - +		(base_gfn >> KVM_HPAGE_GFN_SHIFT(level)); +} +  static inline unsigned long gfn_to_hva_memslot(struct kvm_memory_slot *slot,  					       gfn_t gfn)  { diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index 470e30520fe8..415fe816fc15 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c @@ -784,15 +784,10 @@ int __kvm_set_memory_region(struct kvm *kvm,  		int lpages;  		int level = i + 2; -		/* Avoid unused variable warning if no large pages */ -		(void)level; -  		if (new.lpage_info[i])  			continue; -		lpages = 1 + ((base_gfn + npages - 1) -			     >> KVM_HPAGE_GFN_SHIFT(level)); -		lpages -= base_gfn >> KVM_HPAGE_GFN_SHIFT(level); +		lpages = gfn_to_index(base_gfn + npages - 1, base_gfn, level) + 1;  		new.lpage_info[i] = vzalloc(lpages * sizeof(*new.lpage_info[i])); | 
