[arm-platforms:kvm-arm64/per-vcpu-host-pmu-data 3/4] arch/arm64/kvm/arm.c:764:23: error: 'struct kvm_pmu' has no member named 'events'

Fuad Tabba tabba at google.com
Mon May 16 05:37:00 PDT 2022


Hi Marc,



On Mon, May 16, 2022 at 1:25 PM Marc Zyngier <maz at kernel.org> wrote:
>
> On Mon, 16 May 2022 11:42:33 +0100,
> kernel test robot <lkp at intel.com> wrote:
> >
> > tree:   https://git.kernel.org/pub/scm/linux/kernel/git/maz/arm-platforms.git kvm-arm64/per-vcpu-host-pmu-data
> > head:   722625c6f4c5b6a9953d6af04c7bb1a6e12830b3
> > commit: 84d751a019a9792f5b4884e1d598b603c360ec22 [3/4] KVM: arm64: Pass pmu events to hyp via vcpu
> > config: arm64-randconfig-r022-20220516 (https://download.01.org/0day-ci/archive/20220516/202205161814.KQHpOzsJ-lkp@intel.com/config)
> > compiler: aarch64-linux-gcc (GCC) 11.3.0
> > reproduce (this is a W=1 build):
> >         wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
> >         chmod +x ~/bin/make.cross
> >         # https://git.kernel.org/pub/scm/linux/kernel/git/maz/arm-platforms.git/commit/?id=84d751a019a9792f5b4884e1d598b603c360ec22
> >         git remote add arm-platforms https://git.kernel.org/pub/scm/linux/kernel/git/maz/arm-platforms.git
> >         git fetch --no-tags arm-platforms kvm-arm64/per-vcpu-host-pmu-data
> >         git checkout 84d751a019a9792f5b4884e1d598b603c360ec22
> >         # save the config file
> >         mkdir build_dir && cp config build_dir/.config
> >         COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-11.3.0 make.cross W=1 O=build_dir ARCH=arm64 SHELL=/bin/bash arch/arm64/kvm/
> >
> > If you fix the issue, kindly add following tag as appropriate
> > Reported-by: kernel test robot <lkp at intel.com>
> >
> > All errors (new ones prefixed by >>):
> >
> >    arch/arm64/kvm/arm.c: In function 'kvm_pmu_update_vcpu_events':
> > >> arch/arm64/kvm/arm.c:764:23: error: 'struct kvm_pmu' has no member named 'events'
> >      764 |         vcpu->arch.pmu.events = *kvm_get_pmu_events();
> >          |                       ^
> > >> arch/arm64/kvm/arm.c:764:33: error: invalid use of undefined type 'struct kvm_pmu_events'
> >      764 |         vcpu->arch.pmu.events = *kvm_get_pmu_events();
> >          |                                 ^
>
> [...]
>
> Thanks for the heads up. That's the result of ARM_PMU not being
> selected, which results in HW_PERF_EVENTS not being selected
> either. From there, everything falls apart.
>
> That's the result of really bad hygiene that has been going on
> since... almost forever, with bits of code accessing the internals of
> the PMU structures without much care. Let's pull things together and
> allow the whole of the PMU code (with the exception of the sysreg
> accessors) to be compiled out.
>
> Fuad, can you please eyeball the patch below? If you're OK with it,
> I'll slap that onto the branch.

LGTM. Thanks for fixing that.

Reviewed-by: Fuad Tabba <tabba at google.com>

Cheers,
/fuad

>
> Thanks,
>
>         M.
>
> From b25d64c6f4c9d266706a45dcd0a14ee4ca2d7d16 Mon Sep 17 00:00:00 2001
> From: Marc Zyngier <maz at kernel.org>
> Date: Mon, 16 May 2022 13:02:24 +0100
> Subject: [PATCH] KVM: arm64: pmu: Restore compilation when HW_PERF_EVENTS
>  isn't selected
>
> Moving kvm_pmu_events into the vcpu (and refering to it) broke the
> somewhat unusual case where the kernel has no support for a PMU
> at all.
>
> In order to solve this, move things around a bit so that we can
> easily avoid refering to the pmu structure outside of PMU-aware
> code. As a bonus, pmu.c isn't compiled in when HW_PERF_EVENTS
> isn't selected.
>
> Cc: Fuad Tabba <tabba at google.com>
> Reported-by: kernel test robot <lkp at intel.com>
> Signed-off-by: Marc Zyngier <maz at kernel.org>
> Link: https://lore.kernel.org/r/202205161814.KQHpOzsJ-lkp@intel.com
> ---
>  arch/arm64/include/asm/kvm_host.h |  6 ------
>  arch/arm64/kvm/Makefile           |  4 ++--
>  arch/arm64/kvm/arm.c              | 13 -------------
>  arch/arm64/kvm/hyp/nvhe/switch.c  |  5 +++++
>  include/kvm/arm_pmu.h             | 24 ++++++++++++++++++++++++
>  5 files changed, 31 insertions(+), 21 deletions(-)
>
> diff --git a/arch/arm64/include/asm/kvm_host.h b/arch/arm64/include/asm/kvm_host.h
> index efca5a63bdaf..ef774b8955bc 100644
> --- a/arch/arm64/include/asm/kvm_host.h
> +++ b/arch/arm64/include/asm/kvm_host.h
> @@ -789,10 +789,6 @@ void kvm_arch_vcpu_put_debug_state_flags(struct kvm_vcpu *vcpu);
>  #ifdef CONFIG_KVM
>  void kvm_set_pmu_events(u32 set, struct perf_event_attr *attr);
>  void kvm_clr_pmu_events(u32 clr);
> -
> -struct kvm_pmu_events *kvm_get_pmu_events(void);
> -void kvm_vcpu_pmu_restore_guest(struct kvm_vcpu *vcpu);
> -void kvm_vcpu_pmu_restore_host(struct kvm_vcpu *vcpu);
>  #else
>  static inline void kvm_set_pmu_events(u32 set, struct perf_event_attr *attr) {}
>  static inline void kvm_clr_pmu_events(u32 clr) {}
> @@ -824,8 +820,6 @@ bool kvm_arm_vcpu_is_finalized(struct kvm_vcpu *vcpu);
>  #define kvm_has_mte(kvm)                                       \
>         (system_supports_mte() &&                               \
>          test_bit(KVM_ARCH_FLAG_MTE_ENABLED, &(kvm)->arch.flags))
> -#define kvm_vcpu_has_pmu(vcpu)                                 \
> -       (test_bit(KVM_ARM_VCPU_PMU_V3, (vcpu)->arch.features))
>
>  int kvm_trng_call(struct kvm_vcpu *vcpu);
>  #ifdef CONFIG_KVM
> diff --git a/arch/arm64/kvm/Makefile b/arch/arm64/kvm/Makefile
> index 261644b1a6bb..aa127ae9f675 100644
> --- a/arch/arm64/kvm/Makefile
> +++ b/arch/arm64/kvm/Makefile
> @@ -13,7 +13,7 @@ obj-$(CONFIG_KVM) += hyp/
>  kvm-y += arm.o mmu.o mmio.o psci.o hypercalls.o pvtime.o \
>          inject_fault.o va_layout.o handle_exit.o \
>          guest.o debug.o reset.o sys_regs.o \
> -        vgic-sys-reg-v3.o fpsimd.o pmu.o pkvm.o \
> +        vgic-sys-reg-v3.o fpsimd.o pkvm.o \
>          arch_timer.o trng.o vmid.o \
>          vgic/vgic.o vgic/vgic-init.o \
>          vgic/vgic-irqfd.o vgic/vgic-v2.o \
> @@ -22,7 +22,7 @@ kvm-y += arm.o mmu.o mmio.o psci.o hypercalls.o pvtime.o \
>          vgic/vgic-mmio-v3.o vgic/vgic-kvm-device.o \
>          vgic/vgic-its.o vgic/vgic-debug.o
>
> -kvm-$(CONFIG_HW_PERF_EVENTS)  += pmu-emul.o
> +kvm-$(CONFIG_HW_PERF_EVENTS)  += pmu-emul.o pmu.o
>
>  always-y := hyp_constants.h hyp-constants.s
>
> diff --git a/arch/arm64/kvm/arm.c b/arch/arm64/kvm/arm.c
> index aa1b15e9d5d9..b3821c430ec9 100644
> --- a/arch/arm64/kvm/arm.c
> +++ b/arch/arm64/kvm/arm.c
> @@ -751,19 +751,6 @@ static int noinstr kvm_arm_vcpu_enter_exit(struct kvm_vcpu *vcpu)
>         return ret;
>  }
>
> -/*
> - * Updates the vcpu's view of the pmu events for this cpu.
> - * Must be called before every vcpu run after disabling interrupts, to ensure
> - * that an interrupt cannot fire and update the structure.
> - */
> -static void kvm_pmu_update_vcpu_events(struct kvm_vcpu *vcpu)
> -{
> -       if (has_vhe() || !kvm_vcpu_has_pmu(vcpu))
> -               return;
> -
> -       vcpu->arch.pmu.events = *kvm_get_pmu_events();
> -}
> -
>  /**
>   * kvm_arch_vcpu_ioctl_run - the main VCPU run function to execute guest code
>   * @vcpu:      The VCPU pointer
> diff --git a/arch/arm64/kvm/hyp/nvhe/switch.c b/arch/arm64/kvm/hyp/nvhe/switch.c
> index ff7b29fb9787..c7cd2036a75e 100644
> --- a/arch/arm64/kvm/hyp/nvhe/switch.c
> +++ b/arch/arm64/kvm/hyp/nvhe/switch.c
> @@ -123,6 +123,7 @@ static void __hyp_vgic_restore_state(struct kvm_vcpu *vcpu)
>  /**
>   * Disable host events, enable guest events
>   */
> +#ifdef CONFIG_HW_PERF_EVENTS
>  static bool __pmu_switch_to_guest(struct kvm_vcpu *vcpu)
>  {
>         struct kvm_pmu_events *pmu = &vcpu->arch.pmu.events;
> @@ -149,6 +150,10 @@ static void __pmu_switch_to_host(struct kvm_vcpu *vcpu)
>         if (pmu->events_host)
>                 write_sysreg(pmu->events_host, pmcntenset_el0);
>  }
> +#else
> +#define __pmu_switch_to_guest(v)       ({ false; })
> +#define __pmu_switch_to_host(v)                do {} while (0)
> +#endif
>
>  /**
>   * Handler for protected VM MSR, MRS or System instruction execution in AArch64.
> diff --git a/include/kvm/arm_pmu.h b/include/kvm/arm_pmu.h
> index 35a0903cae32..c0b868ce6a8f 100644
> --- a/include/kvm/arm_pmu.h
> +++ b/include/kvm/arm_pmu.h
> @@ -72,6 +72,25 @@ int kvm_arm_pmu_v3_get_attr(struct kvm_vcpu *vcpu,
>  int kvm_arm_pmu_v3_has_attr(struct kvm_vcpu *vcpu,
>                             struct kvm_device_attr *attr);
>  int kvm_arm_pmu_v3_enable(struct kvm_vcpu *vcpu);
> +
> +struct kvm_pmu_events *kvm_get_pmu_events(void);
> +void kvm_vcpu_pmu_restore_guest(struct kvm_vcpu *vcpu);
> +void kvm_vcpu_pmu_restore_host(struct kvm_vcpu *vcpu);
> +
> +#define kvm_vcpu_has_pmu(vcpu)                                 \
> +       (test_bit(KVM_ARM_VCPU_PMU_V3, (vcpu)->arch.features))
> +
> +/*
> + * Updates the vcpu's view of the pmu events for this cpu.
> + * Must be called before every vcpu run after disabling interrupts, to ensure
> + * that an interrupt cannot fire and update the structure.
> + */
> +#define kvm_pmu_update_vcpu_events(vcpu)                               \
> +       do {                                                            \
> +               if (!has_vhe() && kvm_vcpu_has_pmu(vcpu))               \
> +                       vcpu->arch.pmu.events = *kvm_get_pmu_events();  \
> +       } while (0)
> +
>  #else
>  struct kvm_pmu {
>  };
> @@ -133,6 +152,11 @@ static inline u64 kvm_pmu_get_pmceid(struct kvm_vcpu *vcpu, bool pmceid1)
>         return 0;
>  }
>
> +#define kvm_vcpu_has_pmu(vcpu)         ({ false; })
> +static inline void kvm_pmu_update_vcpu_events(struct kvm_vcpu *vcpu) {}
> +static inline void kvm_vcpu_pmu_restore_guest(struct kvm_vcpu *vcpu) {}
> +static inline void kvm_vcpu_pmu_restore_host(struct kvm_vcpu *vcpu) {}
> +
>  #endif
>
>  #endif
> --
> 2.34.1
>
>
> --
> Without deviation from the norm, progress is not possible.



More information about the linux-arm-kernel mailing list