• Vitaly Kuznetsov's avatar
    KVM: x86: hyper-v: Avoid writing to TSC page without an active vCPU · 42dcbe7d
    Vitaly Kuznetsov authored
    The following WARN is triggered from kvm_vm_ioctl_set_clock():
     WARNING: CPU: 10 PID: 579353 at arch/x86/kvm/../../../virt/kvm/kvm_main.c:3161 mark_page_dirty_in_slot+0x6c/0x80 [kvm]
     ...
     CPU: 10 PID: 579353 Comm: qemu-system-x86 Tainted: G        W  O      5.16.0.stable #20
     Hardware name: LENOVO 20UF001CUS/20UF001CUS, BIOS R1CET65W(1.34 ) 06/17/2021
     RIP: 0010:mark_page_dirty_in_slot+0x6c/0x80 [kvm]
     ...
     Call Trace:
      <TASK>
      ? kvm_write_guest+0x114/0x120 [kvm]
      kvm_hv_invalidate_tsc_page+0x9e/0xf0 [kvm]
      kvm_arch_vm_ioctl+0xa26/0xc50 [kvm]
      ? schedule+0x4e/0xc0
      ? __cond_resched+0x1a/0x50
      ? futex_wait+0x166/0x250
      ? __send_signal+0x1f1/0x3d0
      kvm_vm_ioctl+0x747/0xda0 [kvm]
      ...
    
    The WARN was introduced by commit 03c0304a86bc ("KVM: Warn if
    mark_page_dirty() is called without an active vCPU") but the change seems
    to be correct (unlike Hyper-V TSC page update mechanism). In fact, there's
    no real need to actually write to guest memory to invalidate TSC page, this
    can be done by the first vCPU which goes through kvm_guest_time_update().
    Reported-by: default avatarMaxim Levitsky <mlevitsk@redhat.com>
    Reported-by: default avatarNaresh Kamboju <naresh.kamboju@linaro.org>
    Suggested-by: default avatarSean Christopherson <seanjc@google.com>
    Signed-off-by: default avatarVitaly Kuznetsov <vkuznets@redhat.com>
    Message-Id: <20220407201013.963226-1-vkuznets@redhat.com>
    42dcbe7d
x86.c 340 KB