[PATCH] KVM: arm64: build perf support only when enabled

From: Arnd Bergmann
Date: Wed Apr 21 2021 - 09:49:32 EST


From: Arnd Bergmann <arnd@xxxxxxxx>

The perf_num_counters() function is only defined when CONFIG_PERF_EVENTS
is enabled:

arch/arm64/kvm/perf.c: In function 'kvm_perf_init':
arch/arm64/kvm/perf.c:58:43: error: implicit declaration of function 'perf_num_counters'; did you mean 'dec_mm_counter'? [-Werror=implicit-function-declaration]
58 | if (IS_ENABLED(CONFIG_ARM_PMU) && perf_num_counters() > 0
| ^~~~~~~~~~~~~~~~~

Use conditional compilation to disable this feature entirely when
CONFIG_PERF_EVENTS is disabled in the host.

Fixes: 6b5b368fccd7 ("KVM: arm64: Turn kvm_arm_support_pmu_v3() into a static key")
Signed-off-by: Arnd Bergmann <arnd@xxxxxxxx>
---
Not sure if this is the correct symbol to check for, but this is
one way to avoid the build failure.
---
arch/arm64/kvm/Makefile | 4 +++-
arch/arm64/kvm/arm.c | 8 +++++---
include/kvm/arm_pmu.h | 7 +++++++
3 files changed, 15 insertions(+), 4 deletions(-)

diff --git a/arch/arm64/kvm/Makefile b/arch/arm64/kvm/Makefile
index 589921392cb1..9adf12ba5047 100644
--- a/arch/arm64/kvm/Makefile
+++ b/arch/arm64/kvm/Makefile
@@ -12,7 +12,7 @@ obj-$(CONFIG_KVM) += hyp/

kvm-y := $(KVM)/kvm_main.o $(KVM)/coalesced_mmio.o $(KVM)/eventfd.o \
$(KVM)/vfio.o $(KVM)/irqchip.o \
- arm.o mmu.o mmio.o psci.o perf.o hypercalls.o pvtime.o \
+ 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 \
@@ -24,4 +24,6 @@ kvm-y := $(KVM)/kvm_main.o $(KVM)/coalesced_mmio.o $(KVM)/eventfd.o \
vgic/vgic-mmio-v3.o vgic/vgic-kvm-device.o \
vgic/vgic-its.o vgic/vgic-debug.o

+kvm-$(CONFIG_PERF_EVENTS) += perf.o
+
kvm-$(CONFIG_HW_PERF_EVENTS) += pmu-emul.o
diff --git a/arch/arm64/kvm/arm.c b/arch/arm64/kvm/arm.c
index 4808aca8c87c..720e075c70f9 100644
--- a/arch/arm64/kvm/arm.c
+++ b/arch/arm64/kvm/arm.c
@@ -1694,7 +1694,8 @@ static int init_subsystems(void)
if (err)
goto out;

- kvm_perf_init();
+ if (IS_ENABLED(CONFIG_PERF_EVENTS))
+ kvm_perf_init();
kvm_sys_reg_table_init();

out:
@@ -1899,7 +1900,8 @@ static int init_hyp_mode(void)
return 0;

out_err:
- teardown_hyp_mode();
+ if (IS_ENABLED(CONFIG_PERF_EVENTS))
+ teardown_hyp_mode();
kvm_err("error initializing Hyp mode: %d\n", err);
return err;
}
@@ -2101,7 +2103,7 @@ int kvm_arch_init(void *opaque)

out_hyp:
hyp_cpu_pm_exit();
- if (!in_hyp_mode)
+ if (!IS_ENABLED(CONFIG_PERF_EVENTS) && in_hyp_mode)
teardown_hyp_mode();
out_err:
return err;
diff --git a/include/kvm/arm_pmu.h b/include/kvm/arm_pmu.h
index 6fd3cda608e4..d84307a1ebd5 100644
--- a/include/kvm/arm_pmu.h
+++ b/include/kvm/arm_pmu.h
@@ -13,12 +13,19 @@
#define ARMV8_PMU_CYCLE_IDX (ARMV8_PMU_MAX_COUNTERS - 1)
#define ARMV8_PMU_MAX_COUNTER_PAIRS ((ARMV8_PMU_MAX_COUNTERS + 1) >> 1)

+#ifdef CONFIG_PERF_EVENTS
DECLARE_STATIC_KEY_FALSE(kvm_arm_pmu_available);

static __always_inline bool kvm_arm_support_pmu_v3(void)
{
return static_branch_likely(&kvm_arm_pmu_available);
}
+#else
+static __always_inline bool kvm_arm_support_pmu_v3(void)
+{
+ return 0;
+}
+#endif

#ifdef CONFIG_HW_PERF_EVENTS

--
2.29.2