linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 1/2] KVM: nVMX: Fix nested #PF intends to break L1's vmlauch/vmresume
@ 2017-09-13 11:03 Wanpeng Li
  2017-09-13 21:45 ` Paolo Bonzini
  0 siblings, 1 reply; 8+ messages in thread
From: Wanpeng Li @ 2017-09-13 11:03 UTC (permalink / raw)
  To: linux-kernel, kvm; +Cc: Paolo Bonzini, Radim Krčmář, Wanpeng Li

From: Wanpeng Li <wanpeng.li@hotmail.com>

------------[ cut here ]------------
 WARNING: CPU: 4 PID: 5280 at /home/kernel/linux/arch/x86/kvm//vmx.c:11394 nested_vmx_vmexit+0xc2b/0xd70 [kvm_intel]
 CPU: 4 PID: 5280 Comm: qemu-system-x86 Tainted: G        W  OE   4.13.0+ #17
 RIP: 0010:nested_vmx_vmexit+0xc2b/0xd70 [kvm_intel]
 Call Trace:
  ? emulator_read_emulated+0x15/0x20 [kvm]
  ? segmented_read+0xae/0xf0 [kvm]
  vmx_inject_page_fault_nested+0x60/0x70 [kvm_intel]
  ? vmx_inject_page_fault_nested+0x60/0x70 [kvm_intel]
  x86_emulate_instruction+0x733/0x810 [kvm]
  vmx_handle_exit+0x2f4/0xda0 [kvm_intel]
  ? kvm_arch_vcpu_ioctl_run+0xd2f/0x1c60 [kvm]
  kvm_arch_vcpu_ioctl_run+0xdab/0x1c60 [kvm]
  ? kvm_arch_vcpu_load+0x62/0x230 [kvm]
  kvm_vcpu_ioctl+0x340/0x700 [kvm]
  ? kvm_vcpu_ioctl+0x340/0x700 [kvm]
  ? __fget+0xfc/0x210
  do_vfs_ioctl+0xa4/0x6a0
  ? __fget+0x11d/0x210
  SyS_ioctl+0x79/0x90
  entry_SYSCALL_64_fastpath+0x23/0xc2

A nested #PF is triggered during L0 emulating instruction for L2. However, it 
doesn't consider we should not break L1's vmlauch/vmresme. This patch fixes 
it by queuing the #PF exception instead ,requesting an immediate VM exit from 
L2 and keeping the exception for L1 pending for a subsequent nested VM exit.

Cc: Paolo Bonzini <pbonzini@redhat.com>
Cc: Radim Krčmář <rkrcmar@redhat.com>
Signed-off-by: Wanpeng Li <wanpeng.li@hotmail.com>
---
 arch/x86/kvm/vmx.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c
index 4253ade..fda9dd6 100644
--- a/arch/x86/kvm/vmx.c
+++ b/arch/x86/kvm/vmx.c
@@ -9829,7 +9829,8 @@ static void vmx_inject_page_fault_nested(struct kvm_vcpu *vcpu,
 
 	WARN_ON(!is_guest_mode(vcpu));
 
-	if (nested_vmx_is_page_fault_vmexit(vmcs12, fault->error_code)) {
+	if (nested_vmx_is_page_fault_vmexit(vmcs12, fault->error_code) &&
+		!to_vmx(vcpu)->nested.nested_run_pending) {
 		vmcs12->vm_exit_intr_error_code = fault->error_code;
 		nested_vmx_vmexit(vcpu, EXIT_REASON_EXCEPTION_NMI,
 				  PF_VECTOR | INTR_TYPE_HARD_EXCEPTION |
-- 
2.7.4

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

* Re: [PATCH 1/2] KVM: nVMX: Fix nested #PF intends to break L1's vmlauch/vmresume
  2017-09-13 11:03 [PATCH 1/2] KVM: nVMX: Fix nested #PF intends to break L1's vmlauch/vmresume Wanpeng Li
@ 2017-09-13 21:45 ` Paolo Bonzini
  2017-09-13 23:14   ` Wanpeng Li
  2017-09-15  3:48   ` Wanpeng Li
  0 siblings, 2 replies; 8+ messages in thread
From: Paolo Bonzini @ 2017-09-13 21:45 UTC (permalink / raw)
  To: Wanpeng Li, linux-kernel, kvm; +Cc: Radim Krčmář, Wanpeng Li

On 13/09/2017 13:03, Wanpeng Li wrote:
> From: Wanpeng Li <wanpeng.li@hotmail.com>
> 
> ------------[ cut here ]------------
>  WARNING: CPU: 4 PID: 5280 at /home/kernel/linux/arch/x86/kvm//vmx.c:11394 nested_vmx_vmexit+0xc2b/0xd70 [kvm_intel]
>  CPU: 4 PID: 5280 Comm: qemu-system-x86 Tainted: G        W  OE   4.13.0+ #17
>  RIP: 0010:nested_vmx_vmexit+0xc2b/0xd70 [kvm_intel]
>  Call Trace:
>   ? emulator_read_emulated+0x15/0x20 [kvm]
>   ? segmented_read+0xae/0xf0 [kvm]
>   vmx_inject_page_fault_nested+0x60/0x70 [kvm_intel]
>   ? vmx_inject_page_fault_nested+0x60/0x70 [kvm_intel]
>   x86_emulate_instruction+0x733/0x810 [kvm]
>   vmx_handle_exit+0x2f4/0xda0 [kvm_intel]
>   ? kvm_arch_vcpu_ioctl_run+0xd2f/0x1c60 [kvm]
>   kvm_arch_vcpu_ioctl_run+0xdab/0x1c60 [kvm]
>   ? kvm_arch_vcpu_load+0x62/0x230 [kvm]
>   kvm_vcpu_ioctl+0x340/0x700 [kvm]
>   ? kvm_vcpu_ioctl+0x340/0x700 [kvm]
>   ? __fget+0xfc/0x210
>   do_vfs_ioctl+0xa4/0x6a0
>   ? __fget+0x11d/0x210
>   SyS_ioctl+0x79/0x90
>   entry_SYSCALL_64_fastpath+0x23/0xc2
> 
> A nested #PF is triggered during L0 emulating instruction for L2. However, it 
> doesn't consider we should not break L1's vmlauch/vmresme. This patch fixes 
> it by queuing the #PF exception instead ,requesting an immediate VM exit from 
> L2 and keeping the exception for L1 pending for a subsequent nested VM exit.
> 
> Cc: Paolo Bonzini <pbonzini@redhat.com>
> Cc: Radim Krčmář <rkrcmar@redhat.com>
> Signed-off-by: Wanpeng Li <wanpeng.li@hotmail.com>
> ---
>  arch/x86/kvm/vmx.c | 3 ++-
>  1 file changed, 2 insertions(+), 1 deletion(-)
> 
> diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c
> index 4253ade..fda9dd6 100644
> --- a/arch/x86/kvm/vmx.c
> +++ b/arch/x86/kvm/vmx.c
> @@ -9829,7 +9829,8 @@ static void vmx_inject_page_fault_nested(struct kvm_vcpu *vcpu,
>  
>  	WARN_ON(!is_guest_mode(vcpu));
>  
> -	if (nested_vmx_is_page_fault_vmexit(vmcs12, fault->error_code)) {
> +	if (nested_vmx_is_page_fault_vmexit(vmcs12, fault->error_code) &&
> +		!to_vmx(vcpu)->nested.nested_run_pending) {
>  		vmcs12->vm_exit_intr_error_code = fault->error_code;
>  		nested_vmx_vmexit(vcpu, EXIT_REASON_EXCEPTION_NMI,
>  				  PF_VECTOR | INTR_TYPE_HARD_EXCEPTION |
> 

Is vmx_inject_page_fault_nested even needed at all these days?

kvm_inject_page_fault's call to kvm_queue_exception_e should transform
into an L2->L1 vmexit when vmx_check_nested_events is called.

Paolo

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

* Re: [PATCH 1/2] KVM: nVMX: Fix nested #PF intends to break L1's vmlauch/vmresume
  2017-09-13 21:45 ` Paolo Bonzini
@ 2017-09-13 23:14   ` Wanpeng Li
  2017-09-14 11:58     ` Wanpeng Li
  2017-09-15  3:48   ` Wanpeng Li
  1 sibling, 1 reply; 8+ messages in thread
From: Wanpeng Li @ 2017-09-13 23:14 UTC (permalink / raw)
  To: Paolo Bonzini; +Cc: linux-kernel, kvm, Radim Krčmář, Wanpeng Li

2017-09-14 5:45 GMT+08:00 Paolo Bonzini <pbonzini@redhat.com>:
> On 13/09/2017 13:03, Wanpeng Li wrote:
>> From: Wanpeng Li <wanpeng.li@hotmail.com>
>>
>> ------------[ cut here ]------------
>>  WARNING: CPU: 4 PID: 5280 at /home/kernel/linux/arch/x86/kvm//vmx.c:11394 nested_vmx_vmexit+0xc2b/0xd70 [kvm_intel]
>>  CPU: 4 PID: 5280 Comm: qemu-system-x86 Tainted: G        W  OE   4.13.0+ #17
>>  RIP: 0010:nested_vmx_vmexit+0xc2b/0xd70 [kvm_intel]
>>  Call Trace:
>>   ? emulator_read_emulated+0x15/0x20 [kvm]
>>   ? segmented_read+0xae/0xf0 [kvm]
>>   vmx_inject_page_fault_nested+0x60/0x70 [kvm_intel]
>>   ? vmx_inject_page_fault_nested+0x60/0x70 [kvm_intel]
>>   x86_emulate_instruction+0x733/0x810 [kvm]
>>   vmx_handle_exit+0x2f4/0xda0 [kvm_intel]
>>   ? kvm_arch_vcpu_ioctl_run+0xd2f/0x1c60 [kvm]
>>   kvm_arch_vcpu_ioctl_run+0xdab/0x1c60 [kvm]
>>   ? kvm_arch_vcpu_load+0x62/0x230 [kvm]
>>   kvm_vcpu_ioctl+0x340/0x700 [kvm]
>>   ? kvm_vcpu_ioctl+0x340/0x700 [kvm]
>>   ? __fget+0xfc/0x210
>>   do_vfs_ioctl+0xa4/0x6a0
>>   ? __fget+0x11d/0x210
>>   SyS_ioctl+0x79/0x90
>>   entry_SYSCALL_64_fastpath+0x23/0xc2
>>
>> A nested #PF is triggered during L0 emulating instruction for L2. However, it
>> doesn't consider we should not break L1's vmlauch/vmresme. This patch fixes
>> it by queuing the #PF exception instead ,requesting an immediate VM exit from
>> L2 and keeping the exception for L1 pending for a subsequent nested VM exit.
>>
>> Cc: Paolo Bonzini <pbonzini@redhat.com>
>> Cc: Radim Krčmář <rkrcmar@redhat.com>
>> Signed-off-by: Wanpeng Li <wanpeng.li@hotmail.com>
>> ---
>>  arch/x86/kvm/vmx.c | 3 ++-
>>  1 file changed, 2 insertions(+), 1 deletion(-)
>>
>> diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c
>> index 4253ade..fda9dd6 100644
>> --- a/arch/x86/kvm/vmx.c
>> +++ b/arch/x86/kvm/vmx.c
>> @@ -9829,7 +9829,8 @@ static void vmx_inject_page_fault_nested(struct kvm_vcpu *vcpu,
>>
>>       WARN_ON(!is_guest_mode(vcpu));
>>
>> -     if (nested_vmx_is_page_fault_vmexit(vmcs12, fault->error_code)) {
>> +     if (nested_vmx_is_page_fault_vmexit(vmcs12, fault->error_code) &&
>> +             !to_vmx(vcpu)->nested.nested_run_pending) {
>>               vmcs12->vm_exit_intr_error_code = fault->error_code;
>>               nested_vmx_vmexit(vcpu, EXIT_REASON_EXCEPTION_NMI,
>>                                 PF_VECTOR | INTR_TYPE_HARD_EXCEPTION |
>>
>
> Is vmx_inject_page_fault_nested even needed at all these days?
>
> kvm_inject_page_fault's call to kvm_queue_exception_e should transform
> into an L2->L1 vmexit when vmx_check_nested_events is called.

I saw L0 reboot/hang after do something like below:

diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c
index 4253ade..96b4f6f 100644
--- a/arch/x86/kvm/vmx.c
+++ b/arch/x86/kvm/vmx.c
@@ -9822,24 +9822,6 @@ static bool
nested_vmx_is_page_fault_vmexit(struct vmcs12 *vmcs12,
        return inequality ^ bit;
 }

-static void vmx_inject_page_fault_nested(struct kvm_vcpu *vcpu,
-               struct x86_exception *fault)
-{
-       struct vmcs12 *vmcs12 = get_vmcs12(vcpu);
-
-       WARN_ON(!is_guest_mode(vcpu));
-
-       if (nested_vmx_is_page_fault_vmexit(vmcs12, fault->error_code)) {
-               vmcs12->vm_exit_intr_error_code = fault->error_code;
-               nested_vmx_vmexit(vcpu, EXIT_REASON_EXCEPTION_NMI,
-                                 PF_VECTOR | INTR_TYPE_HARD_EXCEPTION |
-                                 INTR_INFO_DELIVER_CODE_MASK |
INTR_INFO_VALID_MASK,
-                                 fault->address);
-       } else {
-               kvm_inject_page_fault(vcpu, fault);
-       }
-}
-
 static inline bool nested_vmx_merge_msr_bitmap(struct kvm_vcpu *vcpu,
                                               struct vmcs12 *vmcs12);

@@ -10654,7 +10636,7 @@ static int prepare_vmcs02(struct kvm_vcpu
*vcpu, struct vmcs12 *vmcs12,
                return 1;

        if (!enable_ept)
-               vcpu->arch.walk_mmu->inject_page_fault =
vmx_inject_page_fault_nested;
+               vcpu->arch.walk_mmu->inject_page_fault = kvm_inject_page_fault;

        /*

Regards,
Wanpeng Li

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

* Re: [PATCH 1/2] KVM: nVMX: Fix nested #PF intends to break L1's vmlauch/vmresume
  2017-09-13 23:14   ` Wanpeng Li
@ 2017-09-14 11:58     ` Wanpeng Li
  0 siblings, 0 replies; 8+ messages in thread
From: Wanpeng Li @ 2017-09-14 11:58 UTC (permalink / raw)
  To: Paolo Bonzini; +Cc: linux-kernel, kvm, Radim Krčmář, Wanpeng Li

2017-09-14 7:14 GMT+08:00 Wanpeng Li <kernellwp@gmail.com>:
> 2017-09-14 5:45 GMT+08:00 Paolo Bonzini <pbonzini@redhat.com>:
>> On 13/09/2017 13:03, Wanpeng Li wrote:
>>> From: Wanpeng Li <wanpeng.li@hotmail.com>
>>>
>>> ------------[ cut here ]------------
>>>  WARNING: CPU: 4 PID: 5280 at /home/kernel/linux/arch/x86/kvm//vmx.c:11394 nested_vmx_vmexit+0xc2b/0xd70 [kvm_intel]
>>>  CPU: 4 PID: 5280 Comm: qemu-system-x86 Tainted: G        W  OE   4.13.0+ #17
>>>  RIP: 0010:nested_vmx_vmexit+0xc2b/0xd70 [kvm_intel]
>>>  Call Trace:
>>>   ? emulator_read_emulated+0x15/0x20 [kvm]
>>>   ? segmented_read+0xae/0xf0 [kvm]
>>>   vmx_inject_page_fault_nested+0x60/0x70 [kvm_intel]
>>>   ? vmx_inject_page_fault_nested+0x60/0x70 [kvm_intel]
>>>   x86_emulate_instruction+0x733/0x810 [kvm]
>>>   vmx_handle_exit+0x2f4/0xda0 [kvm_intel]
>>>   ? kvm_arch_vcpu_ioctl_run+0xd2f/0x1c60 [kvm]
>>>   kvm_arch_vcpu_ioctl_run+0xdab/0x1c60 [kvm]
>>>   ? kvm_arch_vcpu_load+0x62/0x230 [kvm]
>>>   kvm_vcpu_ioctl+0x340/0x700 [kvm]
>>>   ? kvm_vcpu_ioctl+0x340/0x700 [kvm]
>>>   ? __fget+0xfc/0x210
>>>   do_vfs_ioctl+0xa4/0x6a0
>>>   ? __fget+0x11d/0x210
>>>   SyS_ioctl+0x79/0x90
>>>   entry_SYSCALL_64_fastpath+0x23/0xc2
>>>
>>> A nested #PF is triggered during L0 emulating instruction for L2. However, it
>>> doesn't consider we should not break L1's vmlauch/vmresme. This patch fixes
>>> it by queuing the #PF exception instead ,requesting an immediate VM exit from
>>> L2 and keeping the exception for L1 pending for a subsequent nested VM exit.
>>>
>>> Cc: Paolo Bonzini <pbonzini@redhat.com>
>>> Cc: Radim Krčmář <rkrcmar@redhat.com>
>>> Signed-off-by: Wanpeng Li <wanpeng.li@hotmail.com>
>>> ---
>>>  arch/x86/kvm/vmx.c | 3 ++-
>>>  1 file changed, 2 insertions(+), 1 deletion(-)
>>>
>>> diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c
>>> index 4253ade..fda9dd6 100644
>>> --- a/arch/x86/kvm/vmx.c
>>> +++ b/arch/x86/kvm/vmx.c
>>> @@ -9829,7 +9829,8 @@ static void vmx_inject_page_fault_nested(struct kvm_vcpu *vcpu,
>>>
>>>       WARN_ON(!is_guest_mode(vcpu));
>>>
>>> -     if (nested_vmx_is_page_fault_vmexit(vmcs12, fault->error_code)) {
>>> +     if (nested_vmx_is_page_fault_vmexit(vmcs12, fault->error_code) &&
>>> +             !to_vmx(vcpu)->nested.nested_run_pending) {
>>>               vmcs12->vm_exit_intr_error_code = fault->error_code;
>>>               nested_vmx_vmexit(vcpu, EXIT_REASON_EXCEPTION_NMI,
>>>                                 PF_VECTOR | INTR_TYPE_HARD_EXCEPTION |
>>>
>>
>> Is vmx_inject_page_fault_nested even needed at all these days?
>>
>> kvm_inject_page_fault's call to kvm_queue_exception_e should transform
>> into an L2->L1 vmexit when vmx_check_nested_events is called.
>
> I saw L0 reboot/hang after do something like below:

Maybe something associated with which commit ef54bcfee (KVM: x86: skip
writeback on injection of nested exception) pointed out, IIUC,
fault->nested_page_fault will not be changed in
vmx_inject_page_fault_nested(), so we always return false in the case
of vcpu->arch.nested.mmu.inject_page_fault(), then the issue which the
commit try to avoid is encountered.

Regards,
Wanpeng Li

>
> diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c
> index 4253ade..96b4f6f 100644
> --- a/arch/x86/kvm/vmx.c
> +++ b/arch/x86/kvm/vmx.c
> @@ -9822,24 +9822,6 @@ static bool
> nested_vmx_is_page_fault_vmexit(struct vmcs12 *vmcs12,
>         return inequality ^ bit;
>  }
>
> -static void vmx_inject_page_fault_nested(struct kvm_vcpu *vcpu,
> -               struct x86_exception *fault)
> -{
> -       struct vmcs12 *vmcs12 = get_vmcs12(vcpu);
> -
> -       WARN_ON(!is_guest_mode(vcpu));
> -
> -       if (nested_vmx_is_page_fault_vmexit(vmcs12, fault->error_code)) {
> -               vmcs12->vm_exit_intr_error_code = fault->error_code;
> -               nested_vmx_vmexit(vcpu, EXIT_REASON_EXCEPTION_NMI,
> -                                 PF_VECTOR | INTR_TYPE_HARD_EXCEPTION |
> -                                 INTR_INFO_DELIVER_CODE_MASK |
> INTR_INFO_VALID_MASK,
> -                                 fault->address);
> -       } else {
> -               kvm_inject_page_fault(vcpu, fault);
> -       }
> -}
> -
>  static inline bool nested_vmx_merge_msr_bitmap(struct kvm_vcpu *vcpu,
>                                                struct vmcs12 *vmcs12);
>
> @@ -10654,7 +10636,7 @@ static int prepare_vmcs02(struct kvm_vcpu
> *vcpu, struct vmcs12 *vmcs12,
>                 return 1;
>
>         if (!enable_ept)
> -               vcpu->arch.walk_mmu->inject_page_fault =
> vmx_inject_page_fault_nested;
> +               vcpu->arch.walk_mmu->inject_page_fault = kvm_inject_page_fault;
>
>         /*
>
> Regards,
> Wanpeng Li

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

* Re: [PATCH 1/2] KVM: nVMX: Fix nested #PF intends to break L1's vmlauch/vmresume
  2017-09-13 21:45 ` Paolo Bonzini
  2017-09-13 23:14   ` Wanpeng Li
@ 2017-09-15  3:48   ` Wanpeng Li
  2017-09-15 11:26     ` Paolo Bonzini
  1 sibling, 1 reply; 8+ messages in thread
From: Wanpeng Li @ 2017-09-15  3:48 UTC (permalink / raw)
  To: Paolo Bonzini; +Cc: linux-kernel, kvm, Radim Krčmář, Wanpeng Li

2017-09-14 5:45 GMT+08:00 Paolo Bonzini <pbonzini@redhat.com>:
> On 13/09/2017 13:03, Wanpeng Li wrote:
>> From: Wanpeng Li <wanpeng.li@hotmail.com>
>>
>> ------------[ cut here ]------------
>>  WARNING: CPU: 4 PID: 5280 at /home/kernel/linux/arch/x86/kvm//vmx.c:11394 nested_vmx_vmexit+0xc2b/0xd70 [kvm_intel]
>>  CPU: 4 PID: 5280 Comm: qemu-system-x86 Tainted: G        W  OE   4.13.0+ #17
>>  RIP: 0010:nested_vmx_vmexit+0xc2b/0xd70 [kvm_intel]
>>  Call Trace:
>>   ? emulator_read_emulated+0x15/0x20 [kvm]
>>   ? segmented_read+0xae/0xf0 [kvm]
>>   vmx_inject_page_fault_nested+0x60/0x70 [kvm_intel]
>>   ? vmx_inject_page_fault_nested+0x60/0x70 [kvm_intel]
>>   x86_emulate_instruction+0x733/0x810 [kvm]
>>   vmx_handle_exit+0x2f4/0xda0 [kvm_intel]
>>   ? kvm_arch_vcpu_ioctl_run+0xd2f/0x1c60 [kvm]
>>   kvm_arch_vcpu_ioctl_run+0xdab/0x1c60 [kvm]
>>   ? kvm_arch_vcpu_load+0x62/0x230 [kvm]
>>   kvm_vcpu_ioctl+0x340/0x700 [kvm]
>>   ? kvm_vcpu_ioctl+0x340/0x700 [kvm]
>>   ? __fget+0xfc/0x210
>>   do_vfs_ioctl+0xa4/0x6a0
>>   ? __fget+0x11d/0x210
>>   SyS_ioctl+0x79/0x90
>>   entry_SYSCALL_64_fastpath+0x23/0xc2
>>
>> A nested #PF is triggered during L0 emulating instruction for L2. However, it
>> doesn't consider we should not break L1's vmlauch/vmresme. This patch fixes
>> it by queuing the #PF exception instead ,requesting an immediate VM exit from
>> L2 and keeping the exception for L1 pending for a subsequent nested VM exit.
>>
>> Cc: Paolo Bonzini <pbonzini@redhat.com>
>> Cc: Radim Krčmář <rkrcmar@redhat.com>
>> Signed-off-by: Wanpeng Li <wanpeng.li@hotmail.com>
>> ---
>>  arch/x86/kvm/vmx.c | 3 ++-
>>  1 file changed, 2 insertions(+), 1 deletion(-)
>>
>> diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c
>> index 4253ade..fda9dd6 100644
>> --- a/arch/x86/kvm/vmx.c
>> +++ b/arch/x86/kvm/vmx.c
>> @@ -9829,7 +9829,8 @@ static void vmx_inject_page_fault_nested(struct kvm_vcpu *vcpu,
>>
>>       WARN_ON(!is_guest_mode(vcpu));
>>
>> -     if (nested_vmx_is_page_fault_vmexit(vmcs12, fault->error_code)) {
>> +     if (nested_vmx_is_page_fault_vmexit(vmcs12, fault->error_code) &&
>> +             !to_vmx(vcpu)->nested.nested_run_pending) {
>>               vmcs12->vm_exit_intr_error_code = fault->error_code;
>>               nested_vmx_vmexit(vcpu, EXIT_REASON_EXCEPTION_NMI,
>>                                 PF_VECTOR | INTR_TYPE_HARD_EXCEPTION |
>>
>
> Is vmx_inject_page_fault_nested even needed at all these days?
>
> kvm_inject_page_fault's call to kvm_queue_exception_e should transform
> into an L2->L1 vmexit when vmx_check_nested_events is called.

After more investigation, this will break the original goal of what
vmx_inject_page_fault_nested() tries to fix.
http://www.spinics.net/lists/kvm/msg96579.html

Regards,
Wanpeng Li

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

* Re: [PATCH 1/2] KVM: nVMX: Fix nested #PF intends to break L1's vmlauch/vmresume
  2017-09-15  3:48   ` Wanpeng Li
@ 2017-09-15 11:26     ` Paolo Bonzini
  2017-09-15 11:27       ` Paolo Bonzini
  2017-09-23  0:51       ` Wanpeng Li
  0 siblings, 2 replies; 8+ messages in thread
From: Paolo Bonzini @ 2017-09-15 11:26 UTC (permalink / raw)
  To: Wanpeng Li; +Cc: linux-kernel, kvm, Radim Krčmář, Wanpeng Li

On 15/09/2017 05:48, Wanpeng Li wrote:
> 2017-09-14 5:45 GMT+08:00 Paolo Bonzini <pbonzini@redhat.com>:
>> On 13/09/2017 13:03, Wanpeng Li wrote:
>>> From: Wanpeng Li <wanpeng.li@hotmail.com>
>>>
>>> ------------[ cut here ]------------
>>>  WARNING: CPU: 4 PID: 5280 at /home/kernel/linux/arch/x86/kvm//vmx.c:11394 nested_vmx_vmexit+0xc2b/0xd70 [kvm_intel]
>>>  CPU: 4 PID: 5280 Comm: qemu-system-x86 Tainted: G        W  OE   4.13.0+ #17
>>>  RIP: 0010:nested_vmx_vmexit+0xc2b/0xd70 [kvm_intel]
>>>  Call Trace:
>>>   ? emulator_read_emulated+0x15/0x20 [kvm]
>>>   ? segmented_read+0xae/0xf0 [kvm]
>>>   vmx_inject_page_fault_nested+0x60/0x70 [kvm_intel]
>>>   ? vmx_inject_page_fault_nested+0x60/0x70 [kvm_intel]
>>>   x86_emulate_instruction+0x733/0x810 [kvm]
>>>   vmx_handle_exit+0x2f4/0xda0 [kvm_intel]
>>>   ? kvm_arch_vcpu_ioctl_run+0xd2f/0x1c60 [kvm]
>>>   kvm_arch_vcpu_ioctl_run+0xdab/0x1c60 [kvm]
>>>   ? kvm_arch_vcpu_load+0x62/0x230 [kvm]
>>>   kvm_vcpu_ioctl+0x340/0x700 [kvm]
>>>   ? kvm_vcpu_ioctl+0x340/0x700 [kvm]
>>>   ? __fget+0xfc/0x210
>>>   do_vfs_ioctl+0xa4/0x6a0
>>>   ? __fget+0x11d/0x210
>>>   SyS_ioctl+0x79/0x90
>>>   entry_SYSCALL_64_fastpath+0x23/0xc2
>>>
>>> A nested #PF is triggered during L0 emulating instruction for L2. However, it
>>> doesn't consider we should not break L1's vmlauch/vmresme. This patch fixes
>>> it by queuing the #PF exception instead ,requesting an immediate VM exit from
>>> L2 and keeping the exception for L1 pending for a subsequent nested VM exit.
>>>
>>> Cc: Paolo Bonzini <pbonzini@redhat.com>
>>> Cc: Radim Krčmář <rkrcmar@redhat.com>
>>> Signed-off-by: Wanpeng Li <wanpeng.li@hotmail.com>
>>> ---
>>>  arch/x86/kvm/vmx.c | 3 ++-
>>>  1 file changed, 2 insertions(+), 1 deletion(-)
>>>
>>> diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c
>>> index 4253ade..fda9dd6 100644
>>> --- a/arch/x86/kvm/vmx.c
>>> +++ b/arch/x86/kvm/vmx.c
>>> @@ -9829,7 +9829,8 @@ static void vmx_inject_page_fault_nested(struct kvm_vcpu *vcpu,
>>>
>>>       WARN_ON(!is_guest_mode(vcpu));
>>>
>>> -     if (nested_vmx_is_page_fault_vmexit(vmcs12, fault->error_code)) {
>>> +     if (nested_vmx_is_page_fault_vmexit(vmcs12, fault->error_code) &&
>>> +             !to_vmx(vcpu)->nested.nested_run_pending) {
>>>               vmcs12->vm_exit_intr_error_code = fault->error_code;
>>>               nested_vmx_vmexit(vcpu, EXIT_REASON_EXCEPTION_NMI,
>>>                                 PF_VECTOR | INTR_TYPE_HARD_EXCEPTION |
>>>
>>
>> Is vmx_inject_page_fault_nested even needed at all these days?
>>
>> kvm_inject_page_fault's call to kvm_queue_exception_e should transform
>> into an L2->L1 vmexit when vmx_check_nested_events is called.
> 
> After more investigation, this will break the original goal of what
> vmx_inject_page_fault_nested() tries to fix.
> http://www.spinics.net/lists/kvm/msg96579.html

Right!  I think I have a generic patch for the same issue that Gleb
solved there.  We can fill in the IDT vectoring info early in the
vmexit, so that the L1 vmexit can overwrite the L2 exception easily.

Thanks,

Paolo

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

* Re: [PATCH 1/2] KVM: nVMX: Fix nested #PF intends to break L1's vmlauch/vmresume
  2017-09-15 11:26     ` Paolo Bonzini
@ 2017-09-15 11:27       ` Paolo Bonzini
  2017-09-23  0:51       ` Wanpeng Li
  1 sibling, 0 replies; 8+ messages in thread
From: Paolo Bonzini @ 2017-09-15 11:27 UTC (permalink / raw)
  To: Wanpeng Li; +Cc: linux-kernel, kvm, Radim Krčmář, Wanpeng Li

On 15/09/2017 13:26, Paolo Bonzini wrote:
> On 15/09/2017 05:48, Wanpeng Li wrote:
>> 2017-09-14 5:45 GMT+08:00 Paolo Bonzini <pbonzini@redhat.com>:
>>> On 13/09/2017 13:03, Wanpeng Li wrote:
>>>> From: Wanpeng Li <wanpeng.li@hotmail.com>
>>>>
>>>> ------------[ cut here ]------------
>>>>  WARNING: CPU: 4 PID: 5280 at /home/kernel/linux/arch/x86/kvm//vmx.c:11394 nested_vmx_vmexit+0xc2b/0xd70 [kvm_intel]
>>>>  CPU: 4 PID: 5280 Comm: qemu-system-x86 Tainted: G        W  OE   4.13.0+ #17
>>>>  RIP: 0010:nested_vmx_vmexit+0xc2b/0xd70 [kvm_intel]
>>>>  Call Trace:
>>>>   ? emulator_read_emulated+0x15/0x20 [kvm]
>>>>   ? segmented_read+0xae/0xf0 [kvm]
>>>>   vmx_inject_page_fault_nested+0x60/0x70 [kvm_intel]
>>>>   ? vmx_inject_page_fault_nested+0x60/0x70 [kvm_intel]
>>>>   x86_emulate_instruction+0x733/0x810 [kvm]
>>>>   vmx_handle_exit+0x2f4/0xda0 [kvm_intel]
>>>>   ? kvm_arch_vcpu_ioctl_run+0xd2f/0x1c60 [kvm]
>>>>   kvm_arch_vcpu_ioctl_run+0xdab/0x1c60 [kvm]
>>>>   ? kvm_arch_vcpu_load+0x62/0x230 [kvm]
>>>>   kvm_vcpu_ioctl+0x340/0x700 [kvm]
>>>>   ? kvm_vcpu_ioctl+0x340/0x700 [kvm]
>>>>   ? __fget+0xfc/0x210
>>>>   do_vfs_ioctl+0xa4/0x6a0
>>>>   ? __fget+0x11d/0x210
>>>>   SyS_ioctl+0x79/0x90
>>>>   entry_SYSCALL_64_fastpath+0x23/0xc2
>>>>
>>>> A nested #PF is triggered during L0 emulating instruction for L2. However, it
>>>> doesn't consider we should not break L1's vmlauch/vmresme. This patch fixes
>>>> it by queuing the #PF exception instead ,requesting an immediate VM exit from
>>>> L2 and keeping the exception for L1 pending for a subsequent nested VM exit.
>>>>
>>>> Cc: Paolo Bonzini <pbonzini@redhat.com>
>>>> Cc: Radim Krčmář <rkrcmar@redhat.com>
>>>> Signed-off-by: Wanpeng Li <wanpeng.li@hotmail.com>
>>>> ---
>>>>  arch/x86/kvm/vmx.c | 3 ++-
>>>>  1 file changed, 2 insertions(+), 1 deletion(-)
>>>>
>>>> diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c
>>>> index 4253ade..fda9dd6 100644
>>>> --- a/arch/x86/kvm/vmx.c
>>>> +++ b/arch/x86/kvm/vmx.c
>>>> @@ -9829,7 +9829,8 @@ static void vmx_inject_page_fault_nested(struct kvm_vcpu *vcpu,
>>>>
>>>>       WARN_ON(!is_guest_mode(vcpu));
>>>>
>>>> -     if (nested_vmx_is_page_fault_vmexit(vmcs12, fault->error_code)) {
>>>> +     if (nested_vmx_is_page_fault_vmexit(vmcs12, fault->error_code) &&
>>>> +             !to_vmx(vcpu)->nested.nested_run_pending) {
>>>>               vmcs12->vm_exit_intr_error_code = fault->error_code;
>>>>               nested_vmx_vmexit(vcpu, EXIT_REASON_EXCEPTION_NMI,
>>>>                                 PF_VECTOR | INTR_TYPE_HARD_EXCEPTION |
>>>>
>>>
>>> Is vmx_inject_page_fault_nested even needed at all these days?
>>>
>>> kvm_inject_page_fault's call to kvm_queue_exception_e should transform
>>> into an L2->L1 vmexit when vmx_check_nested_events is called.
>>
>> After more investigation, this will break the original goal of what
>> vmx_inject_page_fault_nested() tries to fix.
>> http://www.spinics.net/lists/kvm/msg96579.html
> 
> Right!  I think I have a generic patch for the same issue that Gleb
> solved there.  We can fill in the IDT vectoring info early in the
> vmexit, so that the L1 vmexit can overwrite the L2 exception easily.

https://www.spinics.net/lists/kvm/msg154640.html

Paolo

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

* Re: [PATCH 1/2] KVM: nVMX: Fix nested #PF intends to break L1's vmlauch/vmresume
  2017-09-15 11:26     ` Paolo Bonzini
  2017-09-15 11:27       ` Paolo Bonzini
@ 2017-09-23  0:51       ` Wanpeng Li
  1 sibling, 0 replies; 8+ messages in thread
From: Wanpeng Li @ 2017-09-23  0:51 UTC (permalink / raw)
  To: Paolo Bonzini; +Cc: linux-kernel, kvm, Radim Krčmář, Wanpeng Li

2017-09-15 19:26 GMT+08:00 Paolo Bonzini <pbonzini@redhat.com>:
> On 15/09/2017 05:48, Wanpeng Li wrote:
>> 2017-09-14 5:45 GMT+08:00 Paolo Bonzini <pbonzini@redhat.com>:
>>> On 13/09/2017 13:03, Wanpeng Li wrote:
>>>> From: Wanpeng Li <wanpeng.li@hotmail.com>
>>>>
>>>> ------------[ cut here ]------------
>>>>  WARNING: CPU: 4 PID: 5280 at /home/kernel/linux/arch/x86/kvm//vmx.c:11394 nested_vmx_vmexit+0xc2b/0xd70 [kvm_intel]
>>>>  CPU: 4 PID: 5280 Comm: qemu-system-x86 Tainted: G        W  OE   4.13.0+ #17
>>>>  RIP: 0010:nested_vmx_vmexit+0xc2b/0xd70 [kvm_intel]
>>>>  Call Trace:
>>>>   ? emulator_read_emulated+0x15/0x20 [kvm]
>>>>   ? segmented_read+0xae/0xf0 [kvm]
>>>>   vmx_inject_page_fault_nested+0x60/0x70 [kvm_intel]
>>>>   ? vmx_inject_page_fault_nested+0x60/0x70 [kvm_intel]
>>>>   x86_emulate_instruction+0x733/0x810 [kvm]
>>>>   vmx_handle_exit+0x2f4/0xda0 [kvm_intel]
>>>>   ? kvm_arch_vcpu_ioctl_run+0xd2f/0x1c60 [kvm]
>>>>   kvm_arch_vcpu_ioctl_run+0xdab/0x1c60 [kvm]
>>>>   ? kvm_arch_vcpu_load+0x62/0x230 [kvm]
>>>>   kvm_vcpu_ioctl+0x340/0x700 [kvm]
>>>>   ? kvm_vcpu_ioctl+0x340/0x700 [kvm]
>>>>   ? __fget+0xfc/0x210
>>>>   do_vfs_ioctl+0xa4/0x6a0
>>>>   ? __fget+0x11d/0x210
>>>>   SyS_ioctl+0x79/0x90
>>>>   entry_SYSCALL_64_fastpath+0x23/0xc2
>>>>
>>>> A nested #PF is triggered during L0 emulating instruction for L2. However, it
>>>> doesn't consider we should not break L1's vmlauch/vmresme. This patch fixes
>>>> it by queuing the #PF exception instead ,requesting an immediate VM exit from
>>>> L2 and keeping the exception for L1 pending for a subsequent nested VM exit.
>>>>
>>>> Cc: Paolo Bonzini <pbonzini@redhat.com>
>>>> Cc: Radim Krčmář <rkrcmar@redhat.com>
>>>> Signed-off-by: Wanpeng Li <wanpeng.li@hotmail.com>
>>>> ---
>>>>  arch/x86/kvm/vmx.c | 3 ++-
>>>>  1 file changed, 2 insertions(+), 1 deletion(-)
>>>>
>>>> diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c
>>>> index 4253ade..fda9dd6 100644
>>>> --- a/arch/x86/kvm/vmx.c
>>>> +++ b/arch/x86/kvm/vmx.c
>>>> @@ -9829,7 +9829,8 @@ static void vmx_inject_page_fault_nested(struct kvm_vcpu *vcpu,
>>>>
>>>>       WARN_ON(!is_guest_mode(vcpu));
>>>>
>>>> -     if (nested_vmx_is_page_fault_vmexit(vmcs12, fault->error_code)) {
>>>> +     if (nested_vmx_is_page_fault_vmexit(vmcs12, fault->error_code) &&
>>>> +             !to_vmx(vcpu)->nested.nested_run_pending) {
>>>>               vmcs12->vm_exit_intr_error_code = fault->error_code;
>>>>               nested_vmx_vmexit(vcpu, EXIT_REASON_EXCEPTION_NMI,
>>>>                                 PF_VECTOR | INTR_TYPE_HARD_EXCEPTION |
>>>>
>>>
>>> Is vmx_inject_page_fault_nested even needed at all these days?
>>>
>>> kvm_inject_page_fault's call to kvm_queue_exception_e should transform
>>> into an L2->L1 vmexit when vmx_check_nested_events is called.
>>
>> After more investigation, this will break the original goal of what
>> vmx_inject_page_fault_nested() tries to fix.
>> http://www.spinics.net/lists/kvm/msg96579.html
>
> Right!  I think I have a generic patch for the same issue that Gleb
> solved there.  We can fill in the IDT vectoring info early in the
> vmexit, so that the L1 vmexit can overwrite the L2 exception easily.

Maybe my commit can be merged for the moment I think.

Regards,
Wanpeng Li

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

end of thread, other threads:[~2017-09-23  0:51 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-09-13 11:03 [PATCH 1/2] KVM: nVMX: Fix nested #PF intends to break L1's vmlauch/vmresume Wanpeng Li
2017-09-13 21:45 ` Paolo Bonzini
2017-09-13 23:14   ` Wanpeng Li
2017-09-14 11:58     ` Wanpeng Li
2017-09-15  3:48   ` Wanpeng Li
2017-09-15 11:26     ` Paolo Bonzini
2017-09-15 11:27       ` Paolo Bonzini
2017-09-23  0:51       ` Wanpeng Li

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).