KVM: split kvm_arch_flush_shadow
Introducing kvm_arch_flush_shadow_memslot, to invalidate the translations of a single memory slot. Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com> Signed-off-by: Avi Kivity <avi@redhat.com>
This commit is contained in:
		
					parent
					
						
							
								09941fbb71
							
						
					
				
			
			
				commit
				
					
						2df72e9bc4
					
				
			
		
					 6 changed files with 34 additions and 9 deletions
				
			
		| 
						 | 
					@ -1613,11 +1613,17 @@ void kvm_arch_commit_memory_region(struct kvm *kvm,
 | 
				
			||||||
	return;
 | 
						return;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void kvm_arch_flush_shadow(struct kvm *kvm)
 | 
					void kvm_arch_flush_shadow_all(struct kvm *kvm)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	kvm_flush_remote_tlbs(kvm);
 | 
						kvm_flush_remote_tlbs(kvm);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void kvm_arch_flush_shadow_memslot(struct kvm *kvm,
 | 
				
			||||||
 | 
									   struct kvm_memory_slot *slot)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						kvm_arch_flush_shadow_all();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
long kvm_arch_dev_ioctl(struct file *filp,
 | 
					long kvm_arch_dev_ioctl(struct file *filp,
 | 
				
			||||||
			unsigned int ioctl, unsigned long arg)
 | 
								unsigned int ioctl, unsigned long arg)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -334,8 +334,12 @@ void kvm_arch_commit_memory_region(struct kvm *kvm,
 | 
				
			||||||
	kvmppc_core_commit_memory_region(kvm, mem);
 | 
						kvmppc_core_commit_memory_region(kvm, mem);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void kvm_arch_flush_shadow_all(struct kvm *kvm)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void kvm_arch_flush_shadow(struct kvm *kvm)
 | 
					void kvm_arch_flush_shadow_memslot(struct kvm *kvm,
 | 
				
			||||||
 | 
									   struct kvm_memory_slot *slot)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -969,7 +969,12 @@ void kvm_arch_commit_memory_region(struct kvm *kvm,
 | 
				
			||||||
	return;
 | 
						return;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void kvm_arch_flush_shadow(struct kvm *kvm)
 | 
					void kvm_arch_flush_shadow_all(struct kvm *kvm)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void kvm_arch_flush_shadow_memslot(struct kvm *kvm,
 | 
				
			||||||
 | 
									   struct kvm_memory_slot *slot)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -6447,12 +6447,18 @@ void kvm_arch_commit_memory_region(struct kvm *kvm,
 | 
				
			||||||
	spin_unlock(&kvm->mmu_lock);
 | 
						spin_unlock(&kvm->mmu_lock);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void kvm_arch_flush_shadow(struct kvm *kvm)
 | 
					void kvm_arch_flush_shadow_all(struct kvm *kvm)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	kvm_mmu_zap_all(kvm);
 | 
						kvm_mmu_zap_all(kvm);
 | 
				
			||||||
	kvm_reload_remote_mmus(kvm);
 | 
						kvm_reload_remote_mmus(kvm);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void kvm_arch_flush_shadow_memslot(struct kvm *kvm,
 | 
				
			||||||
 | 
									   struct kvm_memory_slot *slot)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						kvm_arch_flush_shadow_all(kvm);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int kvm_arch_vcpu_runnable(struct kvm_vcpu *vcpu)
 | 
					int kvm_arch_vcpu_runnable(struct kvm_vcpu *vcpu)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	return (vcpu->arch.mp_state == KVM_MP_STATE_RUNNABLE &&
 | 
						return (vcpu->arch.mp_state == KVM_MP_STATE_RUNNABLE &&
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -458,7 +458,11 @@ void kvm_arch_commit_memory_region(struct kvm *kvm,
 | 
				
			||||||
				int user_alloc);
 | 
									int user_alloc);
 | 
				
			||||||
bool kvm_largepages_enabled(void);
 | 
					bool kvm_largepages_enabled(void);
 | 
				
			||||||
void kvm_disable_largepages(void);
 | 
					void kvm_disable_largepages(void);
 | 
				
			||||||
void kvm_arch_flush_shadow(struct kvm *kvm);
 | 
					/* flush all memory translations */
 | 
				
			||||||
 | 
					void kvm_arch_flush_shadow_all(struct kvm *kvm);
 | 
				
			||||||
 | 
					/* flush memory translations pointing to 'slot' */
 | 
				
			||||||
 | 
					void kvm_arch_flush_shadow_memslot(struct kvm *kvm,
 | 
				
			||||||
 | 
									   struct kvm_memory_slot *slot);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int gfn_to_page_many_atomic(struct kvm *kvm, gfn_t gfn, struct page **pages,
 | 
					int gfn_to_page_many_atomic(struct kvm *kvm, gfn_t gfn, struct page **pages,
 | 
				
			||||||
			    int nr_pages);
 | 
								    int nr_pages);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -408,7 +408,7 @@ static void kvm_mmu_notifier_release(struct mmu_notifier *mn,
 | 
				
			||||||
	int idx;
 | 
						int idx;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	idx = srcu_read_lock(&kvm->srcu);
 | 
						idx = srcu_read_lock(&kvm->srcu);
 | 
				
			||||||
	kvm_arch_flush_shadow(kvm);
 | 
						kvm_arch_flush_shadow_all(kvm);
 | 
				
			||||||
	srcu_read_unlock(&kvm->srcu, idx);
 | 
						srcu_read_unlock(&kvm->srcu, idx);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -582,7 +582,7 @@ static void kvm_destroy_vm(struct kvm *kvm)
 | 
				
			||||||
#if defined(CONFIG_MMU_NOTIFIER) && defined(KVM_ARCH_WANT_MMU_NOTIFIER)
 | 
					#if defined(CONFIG_MMU_NOTIFIER) && defined(KVM_ARCH_WANT_MMU_NOTIFIER)
 | 
				
			||||||
	mmu_notifier_unregister(&kvm->mmu_notifier, kvm->mm);
 | 
						mmu_notifier_unregister(&kvm->mmu_notifier, kvm->mm);
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
	kvm_arch_flush_shadow(kvm);
 | 
						kvm_arch_flush_shadow_all(kvm);
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
	kvm_arch_destroy_vm(kvm);
 | 
						kvm_arch_destroy_vm(kvm);
 | 
				
			||||||
	kvm_free_physmem(kvm);
 | 
						kvm_free_physmem(kvm);
 | 
				
			||||||
| 
						 | 
					@ -814,7 +814,7 @@ int __kvm_set_memory_region(struct kvm *kvm,
 | 
				
			||||||
		 * 	- gfn_to_hva (kvm_read_guest, gfn_to_pfn)
 | 
							 * 	- gfn_to_hva (kvm_read_guest, gfn_to_pfn)
 | 
				
			||||||
		 * 	- kvm_is_visible_gfn (mmu_check_roots)
 | 
							 * 	- kvm_is_visible_gfn (mmu_check_roots)
 | 
				
			||||||
		 */
 | 
							 */
 | 
				
			||||||
		kvm_arch_flush_shadow(kvm);
 | 
							kvm_arch_flush_shadow_memslot(kvm, slot);
 | 
				
			||||||
		kfree(old_memslots);
 | 
							kfree(old_memslots);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -854,7 +854,7 @@ int __kvm_set_memory_region(struct kvm *kvm,
 | 
				
			||||||
	 * mmio sptes.
 | 
						 * mmio sptes.
 | 
				
			||||||
	 */
 | 
						 */
 | 
				
			||||||
	if (npages && old.base_gfn != mem->guest_phys_addr >> PAGE_SHIFT)
 | 
						if (npages && old.base_gfn != mem->guest_phys_addr >> PAGE_SHIFT)
 | 
				
			||||||
		kvm_arch_flush_shadow(kvm);
 | 
							kvm_arch_flush_shadow_all(kvm);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	kvm_free_physmem_slot(&old, &new);
 | 
						kvm_free_physmem_slot(&old, &new);
 | 
				
			||||||
	kfree(old_memslots);
 | 
						kfree(old_memslots);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue