lkml.org 
[lkml]   [2020]   [Mar]   [12]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v9 06/10] KVM: x86/pmu: Tweak kvm_pmu_get_msr to pass 'struct msr_data' in
    Date
    From: Wei Wang <wei.w.wang@intel.com>

    Change kvm_pmu_get_msr() to get the msr_data struct, as the host_initiated
    field from the struct could be used by get_msr. This also makes this API
    consistent with kvm_pmu_set_msr. No functional changes.

    Signed-off-by: Wei Wang <wei.w.wang@intel.com>
    ---
    arch/x86/kvm/pmu.c | 4 ++--
    arch/x86/kvm/pmu.h | 4 ++--
    arch/x86/kvm/pmu_amd.c | 7 ++++---
    arch/x86/kvm/vmx/pmu_intel.c | 19 +++++++++++--------
    arch/x86/kvm/x86.c | 4 ++--
    5 files changed, 21 insertions(+), 17 deletions(-)

    diff --git a/arch/x86/kvm/pmu.c b/arch/x86/kvm/pmu.c
    index 970fb5574402..306a79af0d0e 100644
    --- a/arch/x86/kvm/pmu.c
    +++ b/arch/x86/kvm/pmu.c
    @@ -397,9 +397,9 @@ static void kvm_pmu_mark_pmc_in_use(struct kvm_vcpu *vcpu, u32 msr)
    __set_bit(pmc->idx, pmu->pmc_in_use);
    }

    -int kvm_pmu_get_msr(struct kvm_vcpu *vcpu, u32 msr, u64 *data)
    +int kvm_pmu_get_msr(struct kvm_vcpu *vcpu, struct msr_data *msr_info)
    {
    - return kvm_x86_ops->pmu_ops->get_msr(vcpu, msr, data);
    + return kvm_x86_ops->pmu_ops->get_msr(vcpu, msr_info);
    }

    int kvm_pmu_set_msr(struct kvm_vcpu *vcpu, struct msr_data *msr_info)
    diff --git a/arch/x86/kvm/pmu.h b/arch/x86/kvm/pmu.h
    index 4842a417afe9..c0fb092f985e 100644
    --- a/arch/x86/kvm/pmu.h
    +++ b/arch/x86/kvm/pmu.h
    @@ -32,7 +32,7 @@ struct kvm_pmu_ops {
    struct kvm_pmc *(*msr_idx_to_pmc)(struct kvm_vcpu *vcpu, u32 msr);
    int (*is_valid_rdpmc_ecx)(struct kvm_vcpu *vcpu, unsigned int idx);
    bool (*is_valid_msr)(struct kvm_vcpu *vcpu, u32 msr);
    - int (*get_msr)(struct kvm_vcpu *vcpu, u32 msr, u64 *data);
    + int (*get_msr)(struct kvm_vcpu *vcpu, struct msr_data *msr_info);
    int (*set_msr)(struct kvm_vcpu *vcpu, struct msr_data *msr_info);
    void (*refresh)(struct kvm_vcpu *vcpu);
    void (*init)(struct kvm_vcpu *vcpu);
    @@ -148,7 +148,7 @@ void kvm_pmu_handle_event(struct kvm_vcpu *vcpu);
    int kvm_pmu_rdpmc(struct kvm_vcpu *vcpu, unsigned pmc, u64 *data);
    int kvm_pmu_is_valid_rdpmc_ecx(struct kvm_vcpu *vcpu, unsigned int idx);
    bool kvm_pmu_is_valid_msr(struct kvm_vcpu *vcpu, u32 msr);
    -int kvm_pmu_get_msr(struct kvm_vcpu *vcpu, u32 msr, u64 *data);
    +int kvm_pmu_get_msr(struct kvm_vcpu *vcpu, struct msr_data *msr_info);
    int kvm_pmu_set_msr(struct kvm_vcpu *vcpu, struct msr_data *msr_info);
    void kvm_pmu_refresh(struct kvm_vcpu *vcpu);
    void kvm_pmu_reset(struct kvm_vcpu *vcpu);
    diff --git a/arch/x86/kvm/pmu_amd.c b/arch/x86/kvm/pmu_amd.c
    index ce0b10fe5e2b..62976242bb12 100644
    --- a/arch/x86/kvm/pmu_amd.c
    +++ b/arch/x86/kvm/pmu_amd.c
    @@ -215,21 +215,22 @@ static struct kvm_pmc *amd_msr_idx_to_pmc(struct kvm_vcpu *vcpu, u32 msr)
    return pmc;
    }

    -static int amd_pmu_get_msr(struct kvm_vcpu *vcpu, u32 msr, u64 *data)
    +static int amd_pmu_get_msr(struct kvm_vcpu *vcpu, struct msr_data *msr_info)
    {
    struct kvm_pmu *pmu = vcpu_to_pmu(vcpu);
    struct kvm_pmc *pmc;
    + u32 msr = msr_info->index;

    /* MSR_PERFCTRn */
    pmc = get_gp_pmc_amd(pmu, msr, PMU_TYPE_COUNTER);
    if (pmc) {
    - *data = pmc_read_counter(pmc);
    + msr_info->data = pmc_read_counter(pmc);
    return 0;
    }
    /* MSR_EVNTSELn */
    pmc = get_gp_pmc_amd(pmu, msr, PMU_TYPE_EVNTSEL);
    if (pmc) {
    - *data = pmc->eventsel;
    + msr_info->data = pmc_read_counter(pmc);
    return 0;
    }

    diff --git a/arch/x86/kvm/vmx/pmu_intel.c b/arch/x86/kvm/vmx/pmu_intel.c
    index 4f529e1de5d2..eef11e716570 100644
    --- a/arch/x86/kvm/vmx/pmu_intel.c
    +++ b/arch/x86/kvm/vmx/pmu_intel.c
    @@ -184,35 +184,38 @@ static struct kvm_pmc *intel_msr_idx_to_pmc(struct kvm_vcpu *vcpu, u32 msr)
    return pmc;
    }

    -static int intel_pmu_get_msr(struct kvm_vcpu *vcpu, u32 msr, u64 *data)
    +static int intel_pmu_get_msr(struct kvm_vcpu *vcpu, struct msr_data *msr_info)
    {
    struct kvm_pmu *pmu = vcpu_to_pmu(vcpu);
    struct kvm_pmc *pmc;
    + u32 msr = msr_info->index;

    switch (msr) {
    case MSR_CORE_PERF_FIXED_CTR_CTRL:
    - *data = pmu->fixed_ctr_ctrl;
    + msr_info->data = pmu->fixed_ctr_ctrl;
    return 0;
    case MSR_CORE_PERF_GLOBAL_STATUS:
    - *data = pmu->global_status;
    + msr_info->data = pmu->global_status;
    return 0;
    case MSR_CORE_PERF_GLOBAL_CTRL:
    - *data = pmu->global_ctrl;
    + msr_info->data = pmu->global_ctrl;
    return 0;
    case MSR_CORE_PERF_GLOBAL_OVF_CTRL:
    - *data = pmu->global_ovf_ctrl;
    + msr_info->data = pmu->global_ovf_ctrl;
    return 0;
    default:
    if ((pmc = get_gp_pmc(pmu, msr, MSR_IA32_PERFCTR0))) {
    u64 val = pmc_read_counter(pmc);
    - *data = val & pmu->counter_bitmask[KVM_PMC_GP];
    + msr_info->data =
    + val & pmu->counter_bitmask[KVM_PMC_GP];
    return 0;
    } else if ((pmc = get_fixed_pmc(pmu, msr))) {
    u64 val = pmc_read_counter(pmc);
    - *data = val & pmu->counter_bitmask[KVM_PMC_FIXED];
    + msr_info->data =
    + val & pmu->counter_bitmask[KVM_PMC_FIXED];
    return 0;
    } else if ((pmc = get_gp_pmc(pmu, msr, MSR_P6_EVNTSEL0))) {
    - *data = pmc->eventsel;
    + msr_info->data = pmc->eventsel;
    return 0;
    }
    }
    diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
    index 51c62d14809a..ce6b0326a1ad 100644
    --- a/arch/x86/kvm/x86.c
    +++ b/arch/x86/kvm/x86.c
    @@ -3049,7 +3049,7 @@ int kvm_get_msr_common(struct kvm_vcpu *vcpu, struct msr_data *msr_info)
    case MSR_P6_PERFCTR0 ... MSR_P6_PERFCTR1:
    case MSR_P6_EVNTSEL0 ... MSR_P6_EVNTSEL1:
    if (kvm_pmu_is_valid_msr(vcpu, msr_info->index))
    - return kvm_pmu_get_msr(vcpu, msr_info->index, &msr_info->data);
    + return kvm_pmu_get_msr(vcpu, msr_info);
    msr_info->data = 0;
    break;
    case MSR_IA32_UCODE_REV:
    @@ -3211,7 +3211,7 @@ int kvm_get_msr_common(struct kvm_vcpu *vcpu, struct msr_data *msr_info)
    break;
    default:
    if (kvm_pmu_is_valid_msr(vcpu, msr_info->index))
    - return kvm_pmu_get_msr(vcpu, msr_info->index, &msr_info->data);
    + return kvm_pmu_get_msr(vcpu, msr_info);
    if (!ignore_msrs) {
    vcpu_debug_ratelimited(vcpu, "unhandled rdmsr: 0x%x\n",
    msr_info->index);
    --
    2.21.1
    \
     
     \ /
      Last update: 2020-03-13 03:20    [W:4.352 / U:0.104 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site