diff mbox

[v7,1/4] arm: add ARMv7 HYP API to flush VM TLBs without address param

Message ID 1401837567-5527-2-git-send-email-m.smarduch@samsung.com (mailing list archive)
State New, archived
Headers show

Commit Message

Mario Smarduch June 3, 2014, 11:19 p.m. UTC
Patch adds HYP interface for global VM TLB invalidation without address
parameter. Added ARM version of kvm_flush_remote_tlbs(), made the generic
implementation a weak symbol.

Signed-off-by: Mario Smarduch <m.smarduch@samsung.com>
---
 arch/arm/include/asm/kvm_asm.h |    1 +
 arch/arm/kvm/interrupts.S      |   11 +++++++++++
 arch/arm/kvm/mmu.c             |   14 ++++++++++++++
 virt/kvm/kvm_main.c            |    2 +-
 4 files changed, 27 insertions(+), 1 deletion(-)

Comments

Christoffer Dall June 8, 2014, 12:05 p.m. UTC | #1
On Tue, Jun 03, 2014 at 04:19:24PM -0700, Mario Smarduch wrote:
> Patch adds HYP interface for global VM TLB invalidation without address
> parameter. Added ARM version of kvm_flush_remote_tlbs(), made the generic
> implementation a weak symbol.
> 
> Signed-off-by: Mario Smarduch <m.smarduch@samsung.com>
> ---
>  arch/arm/include/asm/kvm_asm.h |    1 +
>  arch/arm/kvm/interrupts.S      |   11 +++++++++++
>  arch/arm/kvm/mmu.c             |   14 ++++++++++++++
>  virt/kvm/kvm_main.c            |    2 +-
>  4 files changed, 27 insertions(+), 1 deletion(-)
> 
> diff --git a/arch/arm/include/asm/kvm_asm.h b/arch/arm/include/asm/kvm_asm.h
> index 53b3c4a..21bc519 100644
> --- a/arch/arm/include/asm/kvm_asm.h
> +++ b/arch/arm/include/asm/kvm_asm.h
> @@ -78,6 +78,7 @@ extern char __kvm_hyp_code_end[];
>  
>  extern void __kvm_flush_vm_context(void);
>  extern void __kvm_tlb_flush_vmid_ipa(struct kvm *kvm, phys_addr_t ipa);
> +extern void __kvm_tlb_flush_vmid(struct kvm *kvm);
>  
>  extern int __kvm_vcpu_run(struct kvm_vcpu *vcpu);
>  #endif
> diff --git a/arch/arm/kvm/interrupts.S b/arch/arm/kvm/interrupts.S
> index 0d68d40..bddc66b 100644
> --- a/arch/arm/kvm/interrupts.S
> +++ b/arch/arm/kvm/interrupts.S
> @@ -66,6 +66,17 @@ ENTRY(__kvm_tlb_flush_vmid_ipa)
>  	bx	lr
>  ENDPROC(__kvm_tlb_flush_vmid_ipa)
>  
> +/**
> + * void __kvm_tlb_flush_vmid(struct kvm *kvm) - Flush per-VMID TLBs
> + *
> + * Reuses __kvm_tlb_flush_vmid_ipa() for ARMv7, without passing address
> + * parameter
> + */
> +
> +ENTRY(__kvm_tlb_flush_vmid)
> +	b	__kvm_tlb_flush_vmid_ipa
> +ENDPROC(__kvm_tlb_flush_vmid)
> +
>  /********************************************************************
>   * Flush TLBs and instruction caches of all CPUs inside the inner-shareable
>   * domain, for all VMIDs
> diff --git a/arch/arm/kvm/mmu.c b/arch/arm/kvm/mmu.c
> index 2ac9588..ef29540 100644
> --- a/arch/arm/kvm/mmu.c
> +++ b/arch/arm/kvm/mmu.c
> @@ -56,6 +56,20 @@ static void kvm_tlb_flush_vmid_ipa(struct kvm *kvm, phys_addr_t ipa)
>  		kvm_call_hyp(__kvm_tlb_flush_vmid_ipa, kvm, ipa);
>  }
>  
> +/**
> + * kvm_flush_remote_tlbs() - flush all VM TLB entries
> + * @kvm:       pointer to kvm structure.
> + *
> + * Interface to HYP function to flush all VM TLB entries without address
> + * parameter. In HYP mode reuses __kvm_tlb_flush_vmid_ipa() function used by
> + * kvm_tlb_flush_vmid_ipa().
> + */
> +void kvm_flush_remote_tlbs(struct kvm *kvm)
> +{
> +	if (kvm)
> +		kvm_call_hyp(__kvm_tlb_flush_vmid, kvm);
> +}
> +
>  static int mmu_topup_memory_cache(struct kvm_mmu_memory_cache *cache,
>  				  int min, int max)
>  {
> diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
> index fa70c6e..ba25765 100644
> --- a/virt/kvm/kvm_main.c
> +++ b/virt/kvm/kvm_main.c
> @@ -184,7 +184,7 @@ static bool make_all_cpus_request(struct kvm *kvm, unsigned int req)
>  	return called;
>  }
>  
> -void kvm_flush_remote_tlbs(struct kvm *kvm)
> +void __weak kvm_flush_remote_tlbs(struct kvm *kvm)
>  {
>  	long dirty_count = kvm->tlbs_dirty;
>  
> -- 
> 1.7.9.5
> 

This doesn't build or link on aarch64 :(

-Christoffer
Mario Smarduch June 9, 2014, 5:06 p.m. UTC | #2
On 06/08/2014 05:05 AM, Christoffer Dall wrote:
> On Tue, Jun 03, 2014 at 04:19:24PM -0700, Mario Smarduch wrote:
>> Patch adds HYP interface for global VM TLB invalidation without address
>> parameter. Added ARM version of kvm_flush_remote_tlbs(), made the generic
>> implementation a weak symbol.
>>
>> Signed-off-by: Mario Smarduch <m.smarduch@samsung.com>
>> ---
>>  arch/arm/include/asm/kvm_asm.h |    1 +
>>  arch/arm/kvm/interrupts.S      |   11 +++++++++++
>>  arch/arm/kvm/mmu.c             |   14 ++++++++++++++
>>  virt/kvm/kvm_main.c            |    2 +-
>>  4 files changed, 27 insertions(+), 1 deletion(-)
>>
>> diff --git a/arch/arm/include/asm/kvm_asm.h b/arch/arm/include/asm/kvm_asm.h
>> index 53b3c4a..21bc519 100644
>> --- a/arch/arm/include/asm/kvm_asm.h
>> +++ b/arch/arm/include/asm/kvm_asm.h
>> @@ -78,6 +78,7 @@ extern char __kvm_hyp_code_end[];
>>  
>>  extern void __kvm_flush_vm_context(void);
>>  extern void __kvm_tlb_flush_vmid_ipa(struct kvm *kvm, phys_addr_t ipa);
>> +extern void __kvm_tlb_flush_vmid(struct kvm *kvm);
>>  
>>  extern int __kvm_vcpu_run(struct kvm_vcpu *vcpu);
>>  #endif
>> diff --git a/arch/arm/kvm/interrupts.S b/arch/arm/kvm/interrupts.S
>> index 0d68d40..bddc66b 100644
>> --- a/arch/arm/kvm/interrupts.S
>> +++ b/arch/arm/kvm/interrupts.S
>> @@ -66,6 +66,17 @@ ENTRY(__kvm_tlb_flush_vmid_ipa)
>>  	bx	lr
>>  ENDPROC(__kvm_tlb_flush_vmid_ipa)
>>  
>> +/**
>> + * void __kvm_tlb_flush_vmid(struct kvm *kvm) - Flush per-VMID TLBs
>> + *
>> + * Reuses __kvm_tlb_flush_vmid_ipa() for ARMv7, without passing address
>> + * parameter
>> + */
>> +
>> +ENTRY(__kvm_tlb_flush_vmid)
>> +	b	__kvm_tlb_flush_vmid_ipa
>> +ENDPROC(__kvm_tlb_flush_vmid)
>> +
>>  /********************************************************************
>>   * Flush TLBs and instruction caches of all CPUs inside the inner-shareable
>>   * domain, for all VMIDs
>> diff --git a/arch/arm/kvm/mmu.c b/arch/arm/kvm/mmu.c
>> index 2ac9588..ef29540 100644
>> --- a/arch/arm/kvm/mmu.c
>> +++ b/arch/arm/kvm/mmu.c
>> @@ -56,6 +56,20 @@ static void kvm_tlb_flush_vmid_ipa(struct kvm *kvm, phys_addr_t ipa)
>>  		kvm_call_hyp(__kvm_tlb_flush_vmid_ipa, kvm, ipa);
>>  }
>>  
>> +/**
>> + * kvm_flush_remote_tlbs() - flush all VM TLB entries
>> + * @kvm:       pointer to kvm structure.
>> + *
>> + * Interface to HYP function to flush all VM TLB entries without address
>> + * parameter. In HYP mode reuses __kvm_tlb_flush_vmid_ipa() function used by
>> + * kvm_tlb_flush_vmid_ipa().
>> + */
>> +void kvm_flush_remote_tlbs(struct kvm *kvm)
>> +{
>> +	if (kvm)
>> +		kvm_call_hyp(__kvm_tlb_flush_vmid, kvm);
>> +}
>> +
>>  static int mmu_topup_memory_cache(struct kvm_mmu_memory_cache *cache,
>>  				  int min, int max)
>>  {
>> diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
>> index fa70c6e..ba25765 100644
>> --- a/virt/kvm/kvm_main.c
>> +++ b/virt/kvm/kvm_main.c
>> @@ -184,7 +184,7 @@ static bool make_all_cpus_request(struct kvm *kvm, unsigned int req)
>>  	return called;
>>  }
>>  
>> -void kvm_flush_remote_tlbs(struct kvm *kvm)
>> +void __weak kvm_flush_remote_tlbs(struct kvm *kvm)
>>  {
>>  	long dirty_count = kvm->tlbs_dirty;
>>  
>> -- 
>> 1.7.9.5
>>
> 
> This doesn't build or link on aarch64 :(
> 
> -Christoffer
> 

I'll recompile and retest the dirty page logging portion on ARMv8 and
resolve these issues, early next week.

In the meantime if it's ok with you, I'' move forward with the
rest of the patches on ARMv7 to get through critical issues.

Would that work?

- Mario
Christoffer Dall June 9, 2014, 5:49 p.m. UTC | #3
On Mon, Jun 09, 2014 at 10:06:29AM -0700, Mario Smarduch wrote:
> On 06/08/2014 05:05 AM, Christoffer Dall wrote:
> > On Tue, Jun 03, 2014 at 04:19:24PM -0700, Mario Smarduch wrote:
> >> Patch adds HYP interface for global VM TLB invalidation without address
> >> parameter. Added ARM version of kvm_flush_remote_tlbs(), made the generic
> >> implementation a weak symbol.
> >>
> >> Signed-off-by: Mario Smarduch <m.smarduch@samsung.com>
> >> ---
> >>  arch/arm/include/asm/kvm_asm.h |    1 +
> >>  arch/arm/kvm/interrupts.S      |   11 +++++++++++
> >>  arch/arm/kvm/mmu.c             |   14 ++++++++++++++
> >>  virt/kvm/kvm_main.c            |    2 +-
> >>  4 files changed, 27 insertions(+), 1 deletion(-)
> >>
> >> diff --git a/arch/arm/include/asm/kvm_asm.h b/arch/arm/include/asm/kvm_asm.h
> >> index 53b3c4a..21bc519 100644
> >> --- a/arch/arm/include/asm/kvm_asm.h
> >> +++ b/arch/arm/include/asm/kvm_asm.h
> >> @@ -78,6 +78,7 @@ extern char __kvm_hyp_code_end[];
> >>  
> >>  extern void __kvm_flush_vm_context(void);
> >>  extern void __kvm_tlb_flush_vmid_ipa(struct kvm *kvm, phys_addr_t ipa);
> >> +extern void __kvm_tlb_flush_vmid(struct kvm *kvm);
> >>  
> >>  extern int __kvm_vcpu_run(struct kvm_vcpu *vcpu);
> >>  #endif
> >> diff --git a/arch/arm/kvm/interrupts.S b/arch/arm/kvm/interrupts.S
> >> index 0d68d40..bddc66b 100644
> >> --- a/arch/arm/kvm/interrupts.S
> >> +++ b/arch/arm/kvm/interrupts.S
> >> @@ -66,6 +66,17 @@ ENTRY(__kvm_tlb_flush_vmid_ipa)
> >>  	bx	lr
> >>  ENDPROC(__kvm_tlb_flush_vmid_ipa)
> >>  
> >> +/**
> >> + * void __kvm_tlb_flush_vmid(struct kvm *kvm) - Flush per-VMID TLBs
> >> + *
> >> + * Reuses __kvm_tlb_flush_vmid_ipa() for ARMv7, without passing address
> >> + * parameter
> >> + */
> >> +
> >> +ENTRY(__kvm_tlb_flush_vmid)
> >> +	b	__kvm_tlb_flush_vmid_ipa
> >> +ENDPROC(__kvm_tlb_flush_vmid)
> >> +
> >>  /********************************************************************
> >>   * Flush TLBs and instruction caches of all CPUs inside the inner-shareable
> >>   * domain, for all VMIDs
> >> diff --git a/arch/arm/kvm/mmu.c b/arch/arm/kvm/mmu.c
> >> index 2ac9588..ef29540 100644
> >> --- a/arch/arm/kvm/mmu.c
> >> +++ b/arch/arm/kvm/mmu.c
> >> @@ -56,6 +56,20 @@ static void kvm_tlb_flush_vmid_ipa(struct kvm *kvm, phys_addr_t ipa)
> >>  		kvm_call_hyp(__kvm_tlb_flush_vmid_ipa, kvm, ipa);
> >>  }
> >>  
> >> +/**
> >> + * kvm_flush_remote_tlbs() - flush all VM TLB entries
> >> + * @kvm:       pointer to kvm structure.
> >> + *
> >> + * Interface to HYP function to flush all VM TLB entries without address
> >> + * parameter. In HYP mode reuses __kvm_tlb_flush_vmid_ipa() function used by
> >> + * kvm_tlb_flush_vmid_ipa().
> >> + */
> >> +void kvm_flush_remote_tlbs(struct kvm *kvm)
> >> +{
> >> +	if (kvm)
> >> +		kvm_call_hyp(__kvm_tlb_flush_vmid, kvm);
> >> +}
> >> +
> >>  static int mmu_topup_memory_cache(struct kvm_mmu_memory_cache *cache,
> >>  				  int min, int max)
> >>  {
> >> diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
> >> index fa70c6e..ba25765 100644
> >> --- a/virt/kvm/kvm_main.c
> >> +++ b/virt/kvm/kvm_main.c
> >> @@ -184,7 +184,7 @@ static bool make_all_cpus_request(struct kvm *kvm, unsigned int req)
> >>  	return called;
> >>  }
> >>  
> >> -void kvm_flush_remote_tlbs(struct kvm *kvm)
> >> +void __weak kvm_flush_remote_tlbs(struct kvm *kvm)
> >>  {
> >>  	long dirty_count = kvm->tlbs_dirty;
> >>  
> >> -- 
> >> 1.7.9.5
> >>
> > 
> > This doesn't build or link on aarch64 :(
> > 
> > -Christoffer
> > 
> 
> I'll recompile and retest the dirty page logging portion on ARMv8 and
> resolve these issues, early next week.
> 
> In the meantime if it's ok with you, I'' move forward with the
> rest of the patches on ARMv7 to get through critical issues.
> 
> Would that work?

Your patches need to at least compile with other architectures, I
suggest fixing that up front.  You also eventually need to somehow test
(or ask maintainers to test) a branch with your patches on the
architectures that your code messes with.  This later point can be
addressed once we're close to a consensus on ARM.

-Christoffer
Mario Smarduch June 9, 2014, 6:36 p.m. UTC | #4
On 06/09/2014 10:49 AM, Christoffer Dall wrote:
> On Mon, Jun 09, 2014 at 10:06:29AM -0700, Mario Smarduch wrote:
>> On 06/08/2014 05:05 AM, Christoffer Dall wrote:
>>> On Tue, Jun 03, 2014 at 04:19:24PM -0700, Mario Smarduch wrote:
>>>> Patch adds HYP interface for global VM TLB invalidation without address
>>>> parameter. Added ARM version of kvm_flush_remote_tlbs(), made the generic
>>>> implementation a weak symbol.
>>>>
>>>> Signed-off-by: Mario Smarduch <m.smarduch@samsung.com>
>>>> ---
>>>>  arch/arm/include/asm/kvm_asm.h |    1 +
>>>>  arch/arm/kvm/interrupts.S      |   11 +++++++++++
>>>>  arch/arm/kvm/mmu.c             |   14 ++++++++++++++
>>>>  virt/kvm/kvm_main.c            |    2 +-
>>>>  4 files changed, 27 insertions(+), 1 deletion(-)
>>>>
>>>> diff --git a/arch/arm/include/asm/kvm_asm.h b/arch/arm/include/asm/kvm_asm.h
>>>> index 53b3c4a..21bc519 100644
>>>> --- a/arch/arm/include/asm/kvm_asm.h
>>>> +++ b/arch/arm/include/asm/kvm_asm.h
>>>> @@ -78,6 +78,7 @@ extern char __kvm_hyp_code_end[];
>>>>  
>>>>  extern void __kvm_flush_vm_context(void);
>>>>  extern void __kvm_tlb_flush_vmid_ipa(struct kvm *kvm, phys_addr_t ipa);
>>>> +extern void __kvm_tlb_flush_vmid(struct kvm *kvm);
>>>>  
>>>>  extern int __kvm_vcpu_run(struct kvm_vcpu *vcpu);
>>>>  #endif
>>>> diff --git a/arch/arm/kvm/interrupts.S b/arch/arm/kvm/interrupts.S
>>>> index 0d68d40..bddc66b 100644
>>>> --- a/arch/arm/kvm/interrupts.S
>>>> +++ b/arch/arm/kvm/interrupts.S
>>>> @@ -66,6 +66,17 @@ ENTRY(__kvm_tlb_flush_vmid_ipa)
>>>>  	bx	lr
>>>>  ENDPROC(__kvm_tlb_flush_vmid_ipa)
>>>>  
>>>> +/**
>>>> + * void __kvm_tlb_flush_vmid(struct kvm *kvm) - Flush per-VMID TLBs
>>>> + *
>>>> + * Reuses __kvm_tlb_flush_vmid_ipa() for ARMv7, without passing address
>>>> + * parameter
>>>> + */
>>>> +
>>>> +ENTRY(__kvm_tlb_flush_vmid)
>>>> +	b	__kvm_tlb_flush_vmid_ipa
>>>> +ENDPROC(__kvm_tlb_flush_vmid)
>>>> +
>>>>  /********************************************************************
>>>>   * Flush TLBs and instruction caches of all CPUs inside the inner-shareable
>>>>   * domain, for all VMIDs
>>>> diff --git a/arch/arm/kvm/mmu.c b/arch/arm/kvm/mmu.c
>>>> index 2ac9588..ef29540 100644
>>>> --- a/arch/arm/kvm/mmu.c
>>>> +++ b/arch/arm/kvm/mmu.c
>>>> @@ -56,6 +56,20 @@ static void kvm_tlb_flush_vmid_ipa(struct kvm *kvm, phys_addr_t ipa)
>>>>  		kvm_call_hyp(__kvm_tlb_flush_vmid_ipa, kvm, ipa);
>>>>  }
>>>>  
>>>> +/**
>>>> + * kvm_flush_remote_tlbs() - flush all VM TLB entries
>>>> + * @kvm:       pointer to kvm structure.
>>>> + *
>>>> + * Interface to HYP function to flush all VM TLB entries without address
>>>> + * parameter. In HYP mode reuses __kvm_tlb_flush_vmid_ipa() function used by
>>>> + * kvm_tlb_flush_vmid_ipa().
>>>> + */
>>>> +void kvm_flush_remote_tlbs(struct kvm *kvm)
>>>> +{
>>>> +	if (kvm)
>>>> +		kvm_call_hyp(__kvm_tlb_flush_vmid, kvm);
>>>> +}
>>>> +
>>>>  static int mmu_topup_memory_cache(struct kvm_mmu_memory_cache *cache,
>>>>  				  int min, int max)
>>>>  {
>>>> diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
>>>> index fa70c6e..ba25765 100644
>>>> --- a/virt/kvm/kvm_main.c
>>>> +++ b/virt/kvm/kvm_main.c
>>>> @@ -184,7 +184,7 @@ static bool make_all_cpus_request(struct kvm *kvm, unsigned int req)
>>>>  	return called;
>>>>  }
>>>>  
>>>> -void kvm_flush_remote_tlbs(struct kvm *kvm)
>>>> +void __weak kvm_flush_remote_tlbs(struct kvm *kvm)
>>>>  {
>>>>  	long dirty_count = kvm->tlbs_dirty;
>>>>  
>>>> -- 
>>>> 1.7.9.5
>>>>
>>>
>>> This doesn't build or link on aarch64 :(
>>>
>>> -Christoffer
>>>
>>
>> I'll recompile and retest the dirty page logging portion on ARMv8 and
>> resolve these issues, early next week.
>>
>> In the meantime if it's ok with you, I'' move forward with the
>> rest of the patches on ARMv7 to get through critical issues.
>>
>> Would that work?
> 
> Your patches need to at least compile with other architectures, I
> suggest fixing that up front.  You also eventually need to somehow test
> (or ask maintainers to test) a branch with your patches on the
> architectures that your code messes with.  This later point can be
> addressed once we're close to a consensus on ARM.

Ok got it. So far I just checked to make sure x86 compiles since
one function is generic and declared __weak, both x86 and ARM
share it now (Xiaos comment).
> 
> -Christoffer
>
diff mbox

Patch

diff --git a/arch/arm/include/asm/kvm_asm.h b/arch/arm/include/asm/kvm_asm.h
index 53b3c4a..21bc519 100644
--- a/arch/arm/include/asm/kvm_asm.h
+++ b/arch/arm/include/asm/kvm_asm.h
@@ -78,6 +78,7 @@  extern char __kvm_hyp_code_end[];
 
 extern void __kvm_flush_vm_context(void);
 extern void __kvm_tlb_flush_vmid_ipa(struct kvm *kvm, phys_addr_t ipa);
+extern void __kvm_tlb_flush_vmid(struct kvm *kvm);
 
 extern int __kvm_vcpu_run(struct kvm_vcpu *vcpu);
 #endif
diff --git a/arch/arm/kvm/interrupts.S b/arch/arm/kvm/interrupts.S
index 0d68d40..bddc66b 100644
--- a/arch/arm/kvm/interrupts.S
+++ b/arch/arm/kvm/interrupts.S
@@ -66,6 +66,17 @@  ENTRY(__kvm_tlb_flush_vmid_ipa)
 	bx	lr
 ENDPROC(__kvm_tlb_flush_vmid_ipa)
 
+/**
+ * void __kvm_tlb_flush_vmid(struct kvm *kvm) - Flush per-VMID TLBs
+ *
+ * Reuses __kvm_tlb_flush_vmid_ipa() for ARMv7, without passing address
+ * parameter
+ */
+
+ENTRY(__kvm_tlb_flush_vmid)
+	b	__kvm_tlb_flush_vmid_ipa
+ENDPROC(__kvm_tlb_flush_vmid)
+
 /********************************************************************
  * Flush TLBs and instruction caches of all CPUs inside the inner-shareable
  * domain, for all VMIDs
diff --git a/arch/arm/kvm/mmu.c b/arch/arm/kvm/mmu.c
index 2ac9588..ef29540 100644
--- a/arch/arm/kvm/mmu.c
+++ b/arch/arm/kvm/mmu.c
@@ -56,6 +56,20 @@  static void kvm_tlb_flush_vmid_ipa(struct kvm *kvm, phys_addr_t ipa)
 		kvm_call_hyp(__kvm_tlb_flush_vmid_ipa, kvm, ipa);
 }
 
+/**
+ * kvm_flush_remote_tlbs() - flush all VM TLB entries
+ * @kvm:       pointer to kvm structure.
+ *
+ * Interface to HYP function to flush all VM TLB entries without address
+ * parameter. In HYP mode reuses __kvm_tlb_flush_vmid_ipa() function used by
+ * kvm_tlb_flush_vmid_ipa().
+ */
+void kvm_flush_remote_tlbs(struct kvm *kvm)
+{
+	if (kvm)
+		kvm_call_hyp(__kvm_tlb_flush_vmid, kvm);
+}
+
 static int mmu_topup_memory_cache(struct kvm_mmu_memory_cache *cache,
 				  int min, int max)
 {
diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
index fa70c6e..ba25765 100644
--- a/virt/kvm/kvm_main.c
+++ b/virt/kvm/kvm_main.c
@@ -184,7 +184,7 @@  static bool make_all_cpus_request(struct kvm *kvm, unsigned int req)
 	return called;
 }
 
-void kvm_flush_remote_tlbs(struct kvm *kvm)
+void __weak kvm_flush_remote_tlbs(struct kvm *kvm)
 {
 	long dirty_count = kvm->tlbs_dirty;