Message ID | 20211014024155.15253-5-kernelfans@gmail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | watchdog_hld cleanup and async model for arm64 | expand |
Hi Pingfan, I love your patch! Yet something to improve: [auto build test ERROR on soc/for-next] [also build test ERROR on kvmarm/next linus/master v5.15-rc7] [cannot apply to arm64/for-next/core arm/for-next xilinx-xlnx/master] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in https://git-scm.com/docs/git-format-patch] url: https://github.com/0day-ci/linux/commits/Pingfan-Liu/watchdog_hld-cleanup-and-async-model-for-arm64/20211014-104443 base: https://git.kernel.org/pub/scm/linux/kernel/git/soc/soc.git for-next config: arm64-randconfig-p001-20211016 (attached as .config) compiler: aarch64-linux-gcc (GCC) 11.2.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://github.com/0day-ci/linux/commit/4c319c41e49036be58068395965bd33a5de02396 git remote add linux-review https://github.com/0day-ci/linux git fetch --no-tags linux-review Pingfan-Liu/watchdog_hld-cleanup-and-async-model-for-arm64/20211014-104443 git checkout 4c319c41e49036be58068395965bd33a5de02396 # save the attached .config to linux build tree mkdir build_dir COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-11.2.0 make.cross O=build_dir ARCH=arm64 SHELL=/bin/bash If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot <lkp@intel.com> All errors (new ones prefixed by >>): aarch64-linux-ld: arch/arm64/kernel/perf_event.o: in function `armv8_pmu_driver_init': >> perf_event.c:(.init.text+0x20): undefined reference to `detector_delay_init_state' aarch64-linux-ld: arch/arm64/kernel/perf_event.o: relocation R_AARCH64_ADR_PREL_PG_HI21 against symbol `detector_delay_init_state' which may bind externally can not be used when making a shared object; recompile with -fPIC perf_event.c:(.init.text+0x20): dangerous relocation: unsupported relocation >> aarch64-linux-ld: perf_event.c:(.init.text+0x30): undefined reference to `detector_delay_init_state' >> aarch64-linux-ld: perf_event.c:(.init.text+0x34): undefined reference to `hld_detector_wait' aarch64-linux-ld: arch/arm64/kernel/perf_event.o: relocation R_AARCH64_ADR_PREL_PG_HI21 against symbol `hld_detector_wait' which may bind externally can not be used when making a shared object; recompile with -fPIC perf_event.c:(.init.text+0x34): dangerous relocation: unsupported relocation aarch64-linux-ld: perf_event.c:(.init.text+0x3c): undefined reference to `hld_detector_wait' --- 0-DAY CI Kernel Test Service, Intel Corporation https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
Hi Pingfan, I love your patch! Yet something to improve: [auto build test ERROR on soc/for-next] [also build test ERROR on kvmarm/next linus/master v5.15-rc7 next-20211025] [cannot apply to arm64/for-next/core arm/for-next xilinx-xlnx/master] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in https://git-scm.com/docs/git-format-patch] url: https://github.com/0day-ci/linux/commits/Pingfan-Liu/watchdog_hld-cleanup-and-async-model-for-arm64/20211014-104443 base: https://git.kernel.org/pub/scm/linux/kernel/git/soc/soc.git for-next config: arm64-randconfig-r012-20211025 (attached as .config) compiler: aarch64-linux-gcc (GCC) 11.2.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://github.com/0day-ci/linux/commit/4c319c41e49036be58068395965bd33a5de02396 git remote add linux-review https://github.com/0day-ci/linux git fetch --no-tags linux-review Pingfan-Liu/watchdog_hld-cleanup-and-async-model-for-arm64/20211014-104443 git checkout 4c319c41e49036be58068395965bd33a5de02396 # save the attached .config to linux build tree COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-11.2.0 make.cross ARCH=arm64 If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot <lkp@intel.com> All errors (new ones prefixed by >>): arch/arm64/kernel/watchdog_hld.c: In function 'watchdog_nmi_probe': >> arch/arm64/kernel/watchdog_hld.c:32:19: error: implicit declaration of function 'arm_pmu_irq_is_nmi' [-Werror=implicit-function-declaration] 32 | else if (!arm_pmu_irq_is_nmi()) | ^~~~~~~~~~~~~~~~~~ cc1: some warnings being treated as errors vim +/arm_pmu_irq_is_nmi +32 arch/arm64/kernel/watchdog_hld.c 27 28 int __init watchdog_nmi_probe(void) 29 { 30 if (detector_delay_init_state != DELAY_INIT_READY) 31 return -EBUSY; > 32 else if (!arm_pmu_irq_is_nmi()) --- 0-DAY CI Kernel Test Service, Intel Corporation https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig index fee914c716aa..762500f27aec 100644 --- a/arch/arm64/Kconfig +++ b/arch/arm64/Kconfig @@ -189,6 +189,8 @@ config ARM64 select HAVE_NMI select HAVE_PATA_PLATFORM select HAVE_PERF_EVENTS + select HAVE_PERF_EVENTS_NMI if ARM64_PSEUDO_NMI + select HAVE_HARDLOCKUP_DETECTOR_PERF if PERF_EVENTS && HAVE_PERF_EVENTS_NMI select HAVE_PERF_REGS select HAVE_PERF_USER_STACK_DUMP select HAVE_REGS_AND_STACK_ACCESS_API diff --git a/arch/arm64/kernel/Makefile b/arch/arm64/kernel/Makefile index 3f1490bfb938..789c2fe5bb90 100644 --- a/arch/arm64/kernel/Makefile +++ b/arch/arm64/kernel/Makefile @@ -46,6 +46,7 @@ obj-$(CONFIG_MODULES) += module.o obj-$(CONFIG_ARM64_MODULE_PLTS) += module-plts.o obj-$(CONFIG_PERF_EVENTS) += perf_regs.o perf_callchain.o obj-$(CONFIG_HW_PERF_EVENTS) += perf_event.o +obj-$(CONFIG_HARDLOCKUP_DETECTOR_PERF) += watchdog_hld.o obj-$(CONFIG_HAVE_HW_BREAKPOINT) += hw_breakpoint.o obj-$(CONFIG_CPU_PM) += sleep.o suspend.o obj-$(CONFIG_CPU_IDLE) += cpuidle.o diff --git a/arch/arm64/kernel/perf_event.c b/arch/arm64/kernel/perf_event.c index b4044469527e..8e4c39f1db52 100644 --- a/arch/arm64/kernel/perf_event.c +++ b/arch/arm64/kernel/perf_event.c @@ -23,6 +23,7 @@ #include <linux/platform_device.h> #include <linux/sched_clock.h> #include <linux/smp.h> +#include <linux/nmi.h> /* ARMv8 Cortex-A53 specific event types. */ #define ARMV8_A53_PERFCTR_PREF_LINEFILL 0xC2 @@ -1284,10 +1285,16 @@ static struct platform_driver armv8_pmu_driver = { static int __init armv8_pmu_driver_init(void) { + int ret; + if (acpi_disabled) - return platform_driver_register(&armv8_pmu_driver); + ret = platform_driver_register(&armv8_pmu_driver); else - return arm_pmu_acpi_probe(armv8_pmuv3_init); + ret = arm_pmu_acpi_probe(armv8_pmuv3_init); + + detector_delay_init_state = DELAY_INIT_READY; + wake_up(&hld_detector_wait); + return ret; } device_initcall(armv8_pmu_driver_init) diff --git a/arch/arm64/kernel/watchdog_hld.c b/arch/arm64/kernel/watchdog_hld.c new file mode 100644 index 000000000000..85536906a186 --- /dev/null +++ b/arch/arm64/kernel/watchdog_hld.c @@ -0,0 +1,36 @@ +// SPDX-License-Identifier: GPL-2.0 +#include <linux/nmi.h> +#include <linux/cpufreq.h> +#include <linux/perf/arm_pmu.h> + +/* + * Safe maximum CPU frequency in case a particular platform doesn't implement + * cpufreq driver. Although, architecture doesn't put any restrictions on + * maximum frequency but 5 GHz seems to be safe maximum given the available + * Arm CPUs in the market which are clocked much less than 5 GHz. On the other + * hand, we can't make it much higher as it would lead to a large hard-lockup + * detection timeout on parts which are running slower (eg. 1GHz on + * Developerbox) and doesn't possess a cpufreq driver. + */ +#define SAFE_MAX_CPU_FREQ 5000000000UL // 5 GHz +u64 hw_nmi_get_sample_period(int watchdog_thresh) +{ + unsigned int cpu = smp_processor_id(); + unsigned long max_cpu_freq; + + max_cpu_freq = cpufreq_get_hw_max_freq(cpu) * 1000UL; + if (!max_cpu_freq) + max_cpu_freq = SAFE_MAX_CPU_FREQ; + + return (u64)max_cpu_freq * watchdog_thresh; +} + +int __init watchdog_nmi_probe(void) +{ + if (detector_delay_init_state != DELAY_INIT_READY) + return -EBUSY; + else if (!arm_pmu_irq_is_nmi()) + return -ENODEV; + + return hardlockup_detector_perf_init(); +} diff --git a/drivers/perf/arm_pmu.c b/drivers/perf/arm_pmu.c index 295cc7952d0e..e77f4897fca2 100644 --- a/drivers/perf/arm_pmu.c +++ b/drivers/perf/arm_pmu.c @@ -697,6 +697,11 @@ static int armpmu_get_cpu_irq(struct arm_pmu *pmu, int cpu) return per_cpu(hw_events->irq, cpu); } +bool arm_pmu_irq_is_nmi(void) +{ + return has_nmi; +} + /* * PMU hardware loses all context when a CPU goes offline. * When a CPU is hotplugged back in, since some hardware registers are diff --git a/include/linux/perf/arm_pmu.h b/include/linux/perf/arm_pmu.h index 2512e2f9cd4e..9325d01adc3e 100644 --- a/include/linux/perf/arm_pmu.h +++ b/include/linux/perf/arm_pmu.h @@ -169,6 +169,8 @@ void kvm_host_pmu_init(struct arm_pmu *pmu); #define kvm_host_pmu_init(x) do { } while(0) #endif +bool arm_pmu_irq_is_nmi(void); + /* Internal functions only for core arm_pmu code */ struct arm_pmu *armpmu_alloc(void); struct arm_pmu *armpmu_alloc_atomic(void);