• Gavin Shan's avatar
    KVM: Push dirty information unconditionally to backup bitmap · c57351a7
    Gavin Shan authored
    In mark_page_dirty_in_slot(), we bail out when no running vcpu exists
    and a running vcpu context is strictly required by architecture. It may
    cause backwards compatible issue. Currently, saving vgic/its tables is
    the only known case where no running vcpu context is expected. We may
    have other unknown cases where no running vcpu context exists and it's
    reported by the warning message and we bail out without pushing the
    dirty information to the backup bitmap. For this, the application is
    going to enable the backup bitmap for the unknown cases. However, the
    dirty information can't be pushed to the backup bitmap even though the
    backup bitmap is enabled for those unknown cases in the application,
    until the unknown cases are added to the allowed list of non-running
    vcpu context with extra code changes to the host kernel.
    
    In order to make the new application, where the backup bitmap has been
    enabled, to work with the unchanged host, we continue to push the dirty
    information to the backup bitmap instead of bailing out early. With the
    added check on 'memslot->dirty_bitmap' to mark_page_dirty_in_slot(), the
    kernel crash is avoided silently by the combined conditions: no running
    vcpu context, kvm_arch_allow_write_without_running_vcpu() returns 'true',
    and the backup bitmap (KVM_CAP_DIRTY_LOG_RING_WITH_BITMAP) isn't enabled
    yet.
    Suggested-by: default avatarSean Christopherson <seanjc@google.com>
    Signed-off-by: default avatarGavin Shan <gshan@redhat.com>
    Signed-off-by: default avatarMarc Zyngier <maz@kernel.org>
    Link: https://lore.kernel.org/r/20221112094322.21911-1-gshan@redhat.com
    c57351a7
kvm_main.c 151 KB