Commit 494cd11d authored by Jay Zhou's avatar Jay Zhou Committed by Paolo Bonzini
Browse files

kvm: support to get/set dirty log initial-all-set capability



Since the new capability KVM_DIRTY_LOG_INITIALLY_SET of
KVM_CAP_MANUAL_DIRTY_LOG_PROTECT2 has been introduced in the
kernel, tweak the userspace side to detect and enable this
capability.

Signed-off-by: default avatarJay Zhou <jianjay.zhou@huawei.com>
Reviewed-by: default avatarPeter Xu <peterx@redhat.com>
Message-Id: <20200304025554.2159-1-jianjay.zhou@huawei.com>
Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
parent 5acc270a
Loading
Loading
Loading
Loading
+14 −7
Original line number Diff line number Diff line
@@ -101,7 +101,7 @@ struct KVMState
    bool kernel_irqchip_required;
    OnOffAuto kernel_irqchip_split;
    bool sync_mmu;
    bool manual_dirty_log_protect;
    uint64_t manual_dirty_log_protect;
    /* The man page (and posix) say ioctl numbers are signed int, but
     * they're not.  Linux, glibc and *BSD all treat ioctl numbers as
     * unsigned, and treating them as signed here can break things */
@@ -1995,6 +1995,7 @@ static int kvm_init(MachineState *ms)
    int ret;
    int type = 0;
    const char *kvm_type;
    uint64_t dirty_log_manual_caps;

    s = KVM_STATE(ms->accelerator);

@@ -2120,14 +2121,20 @@ static int kvm_init(MachineState *ms)
    s->coalesced_pio = s->coalesced_mmio &&
                       kvm_check_extension(s, KVM_CAP_COALESCED_PIO);

    s->manual_dirty_log_protect =
    dirty_log_manual_caps =
        kvm_check_extension(s, KVM_CAP_MANUAL_DIRTY_LOG_PROTECT2);
    if (s->manual_dirty_log_protect) {
        ret = kvm_vm_enable_cap(s, KVM_CAP_MANUAL_DIRTY_LOG_PROTECT2, 0, 1);
    dirty_log_manual_caps &= (KVM_DIRTY_LOG_MANUAL_PROTECT_ENABLE |
                              KVM_DIRTY_LOG_INITIALLY_SET);
    s->manual_dirty_log_protect = dirty_log_manual_caps;
    if (dirty_log_manual_caps) {
        ret = kvm_vm_enable_cap(s, KVM_CAP_MANUAL_DIRTY_LOG_PROTECT2, 0,
                                   dirty_log_manual_caps);
        if (ret) {
            warn_report("Trying to enable KVM_CAP_MANUAL_DIRTY_LOG_PROTECT2 "
                        "but failed.  Falling back to the legacy mode. ");
            s->manual_dirty_log_protect = false;
            warn_report("Trying to enable capability %"PRIu64" of "
                        "KVM_CAP_MANUAL_DIRTY_LOG_PROTECT2 but failed. "
                        "Falling back to the legacy mode. ",
                        dirty_log_manual_caps);
            s->manual_dirty_log_protect = 0;
        }
    }