Re: exception vs SIGALRM race on core2 CPUs (with fix!)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



26.06.2021 03:15, Jim Mattson пишет:
On Fri, Jun 25, 2021 at 4:35 PM stsp <stsp2@xxxxxxxxx> wrote:
OK, I've finally found that this
fixes the race:

--- x86.c.old   2021-03-20 12:51:14.000000000 +0300
+++ x86.c       2021-06-26 02:28:37.082919492 +0300
@@ -9176,8 +9176,10 @@
                  if (__xfer_to_guest_mode_work_pending()) {
                          srcu_read_unlock(&kvm->srcu, vcpu->srcu_idx);
                          r = xfer_to_guest_mode_handle_work(vcpu);
-                       if (r)
+                       if (r) {
+kvm_clear_exception_queue(vcpu);
                                  return r;
+}
                          vcpu->srcu_idx = srcu_read_lock(&kvm->srcu);
                  }
          }



This is where it returns to user
with the PF exception still pending.
So... any ideas?
If the squashed exception was a trap, it's now lost.

I am not saying this patch is
correct or should be applied.

The more interesting question is:
why KVM doesn't _inject_ the PF,
but is rather setting it pending
and then exits to user-space?

#0  kvm_multiple_exception (vcpu=vcpu@entry=0xffff888005934000, nr=nr@entry=14,     has_error=has_error@entry=true, error_code=6, has_payload=has_payload@entry=true,
    payload=35979264, reinject=false) at ./include/linux/kvm_host.h:1280
#1  0xffffffff8103a13c in kvm_queue_exception_e_p (payload=<optimized out>,
    error_code=<optimized out>, nr=14, vcpu=0xffff888005934000) at arch/x86/kvm/x86.c:641 #2  kvm_inject_page_fault (vcpu=0xffff888005934000, fault=<optimized out>) at arch/x86/kvm/x86.c:641 #3  0xffffffff81031454 in kvm_inject_emulated_page_fault (vcpu=vcpu@entry=0xffff888005934000,
    fault=fault@entry=0xffffc9000031fc60) at arch/x86/kvm/x86.c:665
#4  0xffffffff8106df86 in paging32_page_fault (vcpu=0xffff888005934000, addr=35979264, error_code=6,
    prefault=<optimized out>) at arch/x86/kvm/mmu/paging_tmpl.h:816
#5  0xffffffff8106cdb4 in kvm_mmu_do_page_fault (prefault=false, err=6, cr2_or_gpa=35979264,
    vcpu=0xffff888005934000) at arch/x86/kvm/mmu.h:119
#6  kvm_mmu_page_fault (vcpu=vcpu@entry=0xffff888005934000, cr2_or_gpa=cr2_or_gpa@entry=35979264,     error_code=error_code@entry=6, insn=0x0 <fixed_percpu_data>, insn_len=0)
    at arch/x86/kvm/mmu/mmu.c:5076
#7  0xffffffff8106d090 in kvm_handle_page_fault (insn_len=<optimized out>, insn=<optimized out>,     fault_address=35979264, error_code=6, vcpu=0xffff888005934000) at arch/x86/kvm/mmu/mmu.c:3775 #8  kvm_handle_page_fault (vcpu=0xffff888005934000, error_code=6, fault_address=35979264,     insn=<optimized out>, insn_len=<optimized out>) at arch/x86/kvm/mmu/mmu.c:3757 #9  0xffffffff810443e0 in vcpu_enter_guest (vcpu=0xffff888005934000) at arch/x86/kvm/x86.c:9090
#10 vcpu_run (vcpu=0xffff888005934000) at arch/x86/kvm/x86.c:9156
#11 kvm_arch_vcpu_ioctl_run (vcpu=vcpu@entry=0xffff888005934000) at arch/x86/kvm/x86.c:9385 #12 0xffffffff81020fec in kvm_vcpu_ioctl (filp=<optimized out>, ioctl=44672, arg=0)
    at arch/x86/kvm/../../../virt/kvm/kvm_main.c:3292


This is the stack trace when it
is set pending.




[Index of Archives]     [KVM ARM]     [KVM ia64]     [KVM ppc]     [Virtualization Tools]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Questions]     [Linux Kernel]     [Linux SCSI]     [XFree86]

  Powered by Linux