• Robert O'Callahan's avatar
    KVM: x86: never specify a sample period for virtualized in_tx_cp counters · bba82fd7
    Robert O'Callahan authored
    pmc_reprogram_counter() always sets a sample period based on the value of
    pmc->counter. However, hsw_hw_config() rejects sample periods less than
    2^31 - 1. So for example, if a KVM guest does
    
        struct perf_event_attr attr;
        memset(&attr, 0, sizeof(attr));
        attr.type = PERF_TYPE_RAW;
        attr.size = sizeof(attr);
        attr.config = 0x2005101c4; // conditional branches retired IN_TXCP
        attr.sample_period = 0;
        int fd = syscall(__NR_perf_event_open, &attr, 0, -1, -1, 0);
        ioctl(fd, PERF_EVENT_IOC_DISABLE, 0);
        ioctl(fd, PERF_EVENT_IOC_ENABLE, 0);
    
    the guest kernel counts some conditional branch events, then updates the
    virtual PMU register with a nonzero count. The host reaches
    pmc_reprogram_counter() with nonzero pmc->counter, triggers EOPNOTSUPP
    in hsw_hw_config(), prints "kvm_pmu: event creation failed" in
    pmc_reprogram_counter(), and silently (from the guest's point of view) stops
    counting events.
    
    We fix event counting by forcing attr.sample_period to always be zero for
    in_tx_cp counters. Sampling doesn't work, but it already didn't work and
    can't be fixed without major changes to the approach in hsw_hw_config().
    Signed-off-by: default avatarRobert O'Callahan <robert@ocallahan.org>
    Signed-off-by: default avatarRadim Krčmář <rkrcmar@redhat.com>
    bba82fd7
pmu.c 8.82 KB