On Tue, Oct 08, 2019 at 05:01:26PM +0100, Marc Zyngier wrote: > The current convention for KVM to request a chained event from the > host PMU is to set bit[0] in attr.config1 (PERF_ATTR_CFG1_KVM_PMU_CHAINED). > > But as it turns out, this bit gets set *after* we create the kernel > event that backs our virtual counter, meaning that we never get > a 64bit counter. > > Moving the setting to an earlier point solves the problem. > > Fixes: 80f393a23be6 ("KVM: arm/arm64: Support chained PMU counters") > Signed-off-by: Marc Zyngier <maz@xxxxxxxxxx> Reviewed-by: Andrew Murray <andrew.murray@xxxxxxx> > --- > virt/kvm/arm/pmu.c | 6 +++--- > 1 file changed, 3 insertions(+), 3 deletions(-) > > diff --git a/virt/kvm/arm/pmu.c b/virt/kvm/arm/pmu.c > index c30c3a74fc7f..f291d4ac3519 100644 > --- a/virt/kvm/arm/pmu.c > +++ b/virt/kvm/arm/pmu.c > @@ -569,12 +569,12 @@ static void kvm_pmu_create_perf_event(struct kvm_vcpu *vcpu, u64 select_idx) > * high counter. > */ > attr.sample_period = (-counter) & GENMASK(63, 0); > + if (kvm_pmu_counter_is_enabled(vcpu, pmc->idx + 1)) > + attr.config1 |= PERF_ATTR_CFG1_KVM_PMU_CHAINED; > + > event = perf_event_create_kernel_counter(&attr, -1, current, > kvm_pmu_perf_overflow, > pmc + 1); > - > - if (kvm_pmu_counter_is_enabled(vcpu, pmc->idx + 1)) > - attr.config1 |= PERF_ATTR_CFG1_KVM_PMU_CHAINED; > } else { > /* The initial sample period (overflow count) of an event. */ > if (kvm_pmu_idx_is_64bit(vcpu, pmc->idx)) > -- > 2.20.1 >