2022-05-09 10:48:28

by Sebastian Ene

[permalink] [raw]
Subject: [PATCH v5 0/2] Detect stalls on guest vCPUS

This adds a mechanism to detect stalls on the guest vCPUS by creating a
per CPU hrtimer which periodically 'pets' the host backend driver.
On a conventional watchdog-core driver, the userspace is responsible for
delivering the 'pet' events by writing to the particular /dev/watchdogN node.
In this case we require a strong thread affinity to be able to
account for lost time on a per vCPU basis.

This device driver acts as a soft lockup detector by relying on the host
backend driver to measure the elapesed time between subsequent 'pet' events.
If the elapsed time doesn't match an expected value, the backend driver
decides that the guest vCPU is locked and resets the guest. The host
backend driver takes into account the time that the guest is not
running. The communication with the backend driver is done through MMIO
and the register layout of the virtual watchdog is described as part of
the backend driver changes.

The host backend driver is implemented as part of:
https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/3548817

Changelog v5:
- fix dt warnings
- rename %s/watchdog/stall_detector/g
- rename the config from Kconfig VM_WATCHDOG -> VCPU_STALL_DETECTOR

Changelog v4:
- rename the source from vm-wdt.c -> vm-watchdog.c
- convert all the error logging calls from pr_* to dev_* calls
- rename the DTS node "clock" to "clock-frequency"

Changelog v3:
- cosmetic fixes, remove pr_info and version information
- improve description in the commit messag
- improve description in the Kconfig help section

Sebastian Ene (2):
dt-bindings: vcpu_stall_detector: Add qemu,vcpu-stall-detector
compatible
misc: Add a mechanism to detect stalls on guest vCPUs

.../bindings/misc/vcpu_stall_detector.yaml | 47 ++++
drivers/misc/Kconfig | 12 +
drivers/misc/Makefile | 1 +
drivers/misc/vcpu_stall_detector.c | 218 ++++++++++++++++++
4 files changed, 278 insertions(+)
create mode 100644 Documentation/devicetree/bindings/misc/vcpu_stall_detector.yaml
create mode 100644 drivers/misc/vcpu_stall_detector.c

--
2.36.0.512.ge40c2bad7a-goog



2022-05-09 10:52:23

by Sebastian Ene

[permalink] [raw]
Subject: [PATCH v5 2/2] misc: Add a mechanism to detect stalls on guest vCPUs

This driver creates per-cpu hrtimers which are required to do the
periodic 'pet' operation. On a conventional watchdog-core driver, the
userspace is responsible for delivering the 'pet' events by writing to
the particular /dev/watchdogN node. In this case we require a strong
thread affinity to be able to account for lost time on a per vCPU and
because of this, the driver does not use the kernel API for watchdog devices.

This part of the driver is the 'frontend' which is reponsible for
delivering the periodic 'pet' events, configuring the virtual peripheral
and listening for cpu hotplug events. The other part of the driver
handles the peripheral emulation and this part accounts for lost time by
looking at the /proc/{}/task/{}/stat entries and is located here:
https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/3548817

Signed-off-by: Sebastian Ene <[email protected]>
---
drivers/misc/Kconfig | 12 ++
drivers/misc/Makefile | 1 +
drivers/misc/vcpu_stall_detector.c | 218 +++++++++++++++++++++++++++++
3 files changed, 231 insertions(+)
create mode 100644 drivers/misc/vcpu_stall_detector.c

diff --git a/drivers/misc/Kconfig b/drivers/misc/Kconfig
index 41d2bb0ae23a..9b3cb5dfd5a7 100644
--- a/drivers/misc/Kconfig
+++ b/drivers/misc/Kconfig
@@ -483,6 +483,18 @@ config OPEN_DICE

If unsure, say N.

+config VCPU_STALL_DETECTOR
+ tristate "VCPU stall detector"
+ select LOCKUP_DETECTOR
+ help
+ Detect CPU locks on the virtual machine. This driver relies on the
+ hrtimers which are CPU-binded to do the 'pet' operation. When a vCPU
+ has to do a 'pet', it exits the guest through MMIO write and the
+ backend driver takes into account the lost ticks for this particular
+ CPU.
+ To compile this driver as a module, choose M here: the
+ module will be called vcpu_stall_detector.
+
source "drivers/misc/c2port/Kconfig"
source "drivers/misc/eeprom/Kconfig"
source "drivers/misc/cb710/Kconfig"
diff --git a/drivers/misc/Makefile b/drivers/misc/Makefile
index 70e800e9127f..2be8542616dd 100644
--- a/drivers/misc/Makefile
+++ b/drivers/misc/Makefile
@@ -60,3 +60,4 @@ obj-$(CONFIG_XILINX_SDFEC) += xilinx_sdfec.o
obj-$(CONFIG_HISI_HIKEY_USB) += hisi_hikey_usb.o
obj-$(CONFIG_HI6421V600_IRQ) += hi6421v600-irq.o
obj-$(CONFIG_OPEN_DICE) += open-dice.o
+obj-$(CONFIG_VCPU_STALL_DETECTOR) += vcpu_stall_detector.o
\ No newline at end of file
diff --git a/drivers/misc/vcpu_stall_detector.c b/drivers/misc/vcpu_stall_detector.c
new file mode 100644
index 000000000000..e36ee734f8b3
--- /dev/null
+++ b/drivers/misc/vcpu_stall_detector.c
@@ -0,0 +1,218 @@
+// SPDX-License-Identifier: GPL-2.0
+//
+// VCPU stall detector.
+// Copyright (C) Google, 2022
+
+#include <linux/cpu.h>
+#include <linux/init.h>
+#include <linux/io.h>
+#include <linux/kernel.h>
+
+#include <linux/device.h>
+#include <linux/interrupt.h>
+#include <linux/module.h>
+#include <linux/nmi.h>
+#include <linux/of.h>
+#include <linux/of_device.h>
+#include <linux/param.h>
+#include <linux/percpu.h>
+#include <linux/platform_device.h>
+#include <linux/slab.h>
+
+#define REG_STATUS (0x00)
+#define REG_LOAD_CNT (0x04)
+#define REG_CURRENT_CNT (0x08)
+#define REG_CLOCK_FREQ_HZ (0x0C)
+#define REG_LEN (0x10)
+
+#define DEFAULT_CLOCK_HZ (10)
+#define DEFAULT_TIMEOT_SEC (8)
+
+struct vm_stall_detect_s {
+ void __iomem *membase;
+ u32 clock_freq;
+ u32 expiration_sec;
+ u32 ping_timeout_ms;
+ struct hrtimer per_cpu_hrtimer;
+ struct platform_device *dev;
+};
+
+#define vcpu_stall_detect_reg_write(stall_detect, reg, value) \
+ iowrite32((value), (stall_detect)->membase + (reg))
+#define vcpu_stall_detect_reg_read(stall_detect, reg) \
+ io32read((stall_detect)->membase + (reg))
+
+static struct platform_device *virt_dev;
+
+static enum hrtimer_restart
+vcpu_stall_detect_timer_fn(struct hrtimer *hrtimer)
+{
+ struct vm_stall_detect_s *cpu_stall_detect;
+ u32 ticks;
+
+ cpu_stall_detect = container_of(hrtimer, struct vm_stall_detect_s,
+ per_cpu_hrtimer);
+ ticks = cpu_stall_detect->clock_freq *
+ cpu_stall_detect->expiration_sec;
+ vcpu_stall_detect_reg_write(cpu_stall_detect, REG_LOAD_CNT, ticks);
+ hrtimer_forward_now(hrtimer,
+ ms_to_ktime(cpu_stall_detect->ping_timeout_ms));
+
+ return HRTIMER_RESTART;
+}
+
+static void vcpu_stall_detect_start(void *arg)
+{
+ u32 ticks;
+ struct vm_stall_detect_s *cpu_stall_detect = arg;
+ struct hrtimer *hrtimer = &cpu_stall_detect->per_cpu_hrtimer;
+
+ vcpu_stall_detect_reg_write(cpu_stall_detect, REG_CLOCK_FREQ_HZ,
+ cpu_stall_detect->clock_freq);
+
+ /* Compute the number of ticks required for the stall detector counter
+ * register based on the internal clock frequency and the timeout
+ * value given from the device tree.
+ */
+ ticks = cpu_stall_detect->clock_freq *
+ cpu_stall_detect->expiration_sec;
+ vcpu_stall_detect_reg_write(cpu_stall_detect, REG_LOAD_CNT, ticks);
+
+ /* Enable the internal clock and start the stall detector */
+ vcpu_stall_detect_reg_write(cpu_stall_detect, REG_STATUS, 1);
+
+ hrtimer_init(hrtimer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
+ hrtimer->function = vcpu_stall_detect_timer_fn;
+ hrtimer_start(hrtimer, ms_to_ktime(cpu_stall_detect->ping_timeout_ms),
+ HRTIMER_MODE_REL_PINNED);
+}
+
+static void vcpu_stall_detect_stop(void *arg)
+{
+ struct vm_stall_detect_s *cpu_stall_detect = arg;
+ struct hrtimer *hrtimer = &cpu_stall_detect->per_cpu_hrtimer;
+
+ hrtimer_cancel(hrtimer);
+
+ /* Disable the stall detector */
+ vcpu_stall_detect_reg_write(cpu_stall_detect, REG_STATUS, 0);
+}
+
+static int start_stall_detector_on_cpu(unsigned int cpu)
+{
+ struct vm_stall_detect_s *vm_stall_detect;
+
+ vm_stall_detect = platform_get_drvdata(virt_dev);
+ vcpu_stall_detect_start(this_cpu_ptr(vm_stall_detect));
+ return 0;
+}
+
+static int stop_stall_detector_on_cpu(unsigned int cpu)
+{
+ struct vm_stall_detect_s *vm_stall_detect;
+
+ vm_stall_detect = platform_get_drvdata(virt_dev);
+ vcpu_stall_detect_stop(this_cpu_ptr(vm_stall_detect));
+ return 0;
+}
+
+static int vcpu_stall_detect_probe(struct platform_device *dev)
+{
+ int cpu, ret, err;
+ void __iomem *membase;
+ struct resource *r;
+ struct vm_stall_detect_s *vm_stall_detect;
+ u32 stall_detect_clock, stall_detect_timeout_sec = 0;
+
+ r = platform_get_resource(dev, IORESOURCE_MEM, 0);
+ if (r == NULL)
+ return -ENOENT;
+
+ vm_stall_detect = alloc_percpu(typeof(struct vm_stall_detect_s));
+ if (!vm_stall_detect)
+ return -ENOMEM;
+
+ membase = ioremap(r->start, resource_size(r));
+ if (!membase) {
+ ret = -ENXIO;
+ goto err_withmem;
+ }
+
+ virt_dev = dev;
+ platform_set_drvdata(dev, vm_stall_detect);
+ if (of_property_read_u32(dev->dev.of_node, "clock-frequency",
+ &stall_detect_clock))
+ stall_detect_clock = DEFAULT_CLOCK_HZ;
+
+ if (of_property_read_u32(dev->dev.of_node, "timeout-sec",
+ &stall_detect_timeout_sec))
+ stall_detect_timeout_sec = DEFAULT_TIMEOT_SEC;
+
+ for_each_cpu_and(cpu, cpu_online_mask, &watchdog_cpumask) {
+ struct vm_stall_detect_s *cpu_stall_detect;
+
+ cpu_stall_detect = per_cpu_ptr(vm_stall_detect, cpu);
+ cpu_stall_detect->membase = membase + cpu * REG_LEN;
+ cpu_stall_detect->clock_freq = stall_detect_clock;
+ cpu_stall_detect->expiration_sec = stall_detect_timeout_sec;
+ cpu_stall_detect->ping_timeout_ms = stall_detect_timeout_sec *
+ MSEC_PER_SEC / 2;
+ smp_call_function_single(cpu, vcpu_stall_detect_start,
+ cpu_stall_detect, true);
+ }
+
+ err = cpuhp_setup_state_nocalls(CPUHP_AP_ONLINE_DYN,
+ "virt/vcpu_stall_detector:online",
+ start_stall_detector_on_cpu,
+ stop_stall_detector_on_cpu);
+ if (err < 0) {
+ dev_warn(&dev->dev, "failed to install cpu hotplug");
+ ret = err;
+ goto err_withmem;
+ }
+
+ return 0;
+
+err_withmem:
+ free_percpu(vm_stall_detect);
+ return ret;
+}
+
+static int vcpu_stall_detect_remove(struct platform_device *dev)
+{
+ int cpu;
+ struct vm_stall_detect_s *vm_stall_detect = platform_get_drvdata(dev);
+
+ for_each_cpu_and(cpu, cpu_online_mask, &watchdog_cpumask) {
+ struct vm_stall_detect_s *cpu_stall_detect;
+
+ cpu_stall_detect = per_cpu_ptr(vm_stall_detect, cpu);
+ smp_call_function_single(cpu, vcpu_stall_detect_stop,
+ cpu_stall_detect, true);
+ }
+
+ free_percpu(vm_stall_detect);
+ return 0;
+}
+
+static const struct of_device_id vcpu_stall_detect_of_match[] = {
+ { .compatible = "qemu,vcpu-stall-detector", },
+ {}
+};
+
+MODULE_DEVICE_TABLE(of, vcpu_stall_detector_of_match);
+
+static struct platform_driver vcpu_stall_detect_driver = {
+ .probe = vcpu_stall_detect_probe,
+ .remove = vcpu_stall_detect_remove,
+ .driver = {
+ .name = KBUILD_MODNAME,
+ .of_match_table = vcpu_stall_detect_of_match,
+ },
+};
+
+module_platform_driver(vcpu_stall_detect_driver);
+
+MODULE_LICENSE("GPL");
+MODULE_AUTHOR("Sebastian Ene <[email protected]>");
+MODULE_DESCRIPTION("VCPU stall detector");
--
2.36.0.512.ge40c2bad7a-goog


2022-05-09 21:14:49

by kernel test robot

[permalink] [raw]
Subject: Re: [PATCH v5 2/2] misc: Add a mechanism to detect stalls on guest vCPUs

Hi Sebastian,

Thank you for the patch! Perhaps something to improve:

[auto build test WARNING on robh/for-next]
[also build test WARNING on char-misc/char-misc-testing soc/for-next v5.18-rc6]
[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/intel-lab-lkp/linux/commits/Sebastian-Ene/Detect-stalls-on-guest-vCPUS/20220509-174959
base: https://git.kernel.org/pub/scm/linux/kernel/git/robh/linux.git for-next
config: h8300-randconfig-s032-20220509 (https://download.01.org/0day-ci/archive/20220510/[email protected]/config)
compiler: h8300-linux-gcc (GCC) 11.3.0
reproduce:
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# apt-get install sparse
# sparse version: v0.6.4-dirty
# https://github.com/intel-lab-lkp/linux/commit/d3152372fdd19448b32806c0bffd78d8729d02e4
git remote add linux-review https://github.com/intel-lab-lkp/linux
git fetch --no-tags linux-review Sebastian-Ene/Detect-stalls-on-guest-vCPUS/20220509-174959
git checkout d3152372fdd19448b32806c0bffd78d8729d02e4
# save the config file
mkdir build_dir && cp config build_dir/.config
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-11.3.0 make.cross C=1 CF='-fdiagnostic-prefix -D__CHECK_ENDIAN__' O=build_dir ARCH=h8300 SHELL=/bin/bash drivers/misc/

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <[email protected]>


sparse warnings: (new ones prefixed by >>)
>> drivers/misc/vcpu_stall_detector.c:106:33: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected void const [noderef] __percpu *__vpp_verify @@ got struct vm_stall_detect_s * @@
drivers/misc/vcpu_stall_detector.c:106:33: sparse: expected void const [noderef] __percpu *__vpp_verify
drivers/misc/vcpu_stall_detector.c:106:33: sparse: got struct vm_stall_detect_s *
drivers/misc/vcpu_stall_detector.c:115:32: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected void const [noderef] __percpu *__vpp_verify @@ got struct vm_stall_detect_s * @@
drivers/misc/vcpu_stall_detector.c:115:32: sparse: expected void const [noderef] __percpu *__vpp_verify
drivers/misc/vcpu_stall_detector.c:115:32: sparse: got struct vm_stall_detect_s *
>> drivers/misc/vcpu_stall_detector.c:131:25: sparse: sparse: incorrect type in assignment (different address spaces) @@ expected struct vm_stall_detect_s *vm_stall_detect @@ got struct vm_stall_detect_s [noderef] __percpu * @@
drivers/misc/vcpu_stall_detector.c:131:25: sparse: expected struct vm_stall_detect_s *vm_stall_detect
drivers/misc/vcpu_stall_detector.c:131:25: sparse: got struct vm_stall_detect_s [noderef] __percpu *
drivers/misc/vcpu_stall_detector.c:154:36: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected void const [noderef] __percpu *__vpp_verify @@ got struct vm_stall_detect_s * @@
drivers/misc/vcpu_stall_detector.c:154:36: sparse: expected void const [noderef] __percpu *__vpp_verify
drivers/misc/vcpu_stall_detector.c:154:36: sparse: got struct vm_stall_detect_s *
>> drivers/misc/vcpu_stall_detector.c:177:21: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void [noderef] __percpu *__pdata @@ got struct vm_stall_detect_s *vm_stall_detect @@
drivers/misc/vcpu_stall_detector.c:177:21: sparse: expected void [noderef] __percpu *__pdata
drivers/misc/vcpu_stall_detector.c:177:21: sparse: got struct vm_stall_detect_s *vm_stall_detect
drivers/misc/vcpu_stall_detector.c:189:36: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected void const [noderef] __percpu *__vpp_verify @@ got struct vm_stall_detect_s * @@
drivers/misc/vcpu_stall_detector.c:189:36: sparse: expected void const [noderef] __percpu *__vpp_verify
drivers/misc/vcpu_stall_detector.c:189:36: sparse: got struct vm_stall_detect_s *
drivers/misc/vcpu_stall_detector.c:194:21: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void [noderef] __percpu *__pdata @@ got struct vm_stall_detect_s *vm_stall_detect @@
drivers/misc/vcpu_stall_detector.c:194:21: sparse: expected void [noderef] __percpu *__pdata
drivers/misc/vcpu_stall_detector.c:194:21: sparse: got struct vm_stall_detect_s *vm_stall_detect
drivers/misc/vcpu_stall_detector.c: note: in included file (through include/linux/io.h):
arch/h8300/include/asm/io.h:44:11: sparse: sparse: cast removes address space '__iomem' of expression
arch/h8300/include/asm/io.h:44:11: sparse: sparse: cast removes address space '__iomem' of expression
arch/h8300/include/asm/io.h:44:11: sparse: sparse: cast removes address space '__iomem' of expression
arch/h8300/include/asm/io.h:44:11: sparse: sparse: cast removes address space '__iomem' of expression
arch/h8300/include/asm/io.h:44:11: sparse: sparse: cast removes address space '__iomem' of expression

vim +106 drivers/misc/vcpu_stall_detector.c

100
101 static int start_stall_detector_on_cpu(unsigned int cpu)
102 {
103 struct vm_stall_detect_s *vm_stall_detect;
104
105 vm_stall_detect = platform_get_drvdata(virt_dev);
> 106 vcpu_stall_detect_start(this_cpu_ptr(vm_stall_detect));
107 return 0;
108 }
109
110 static int stop_stall_detector_on_cpu(unsigned int cpu)
111 {
112 struct vm_stall_detect_s *vm_stall_detect;
113
114 vm_stall_detect = platform_get_drvdata(virt_dev);
115 vcpu_stall_detect_stop(this_cpu_ptr(vm_stall_detect));
116 return 0;
117 }
118
119 static int vcpu_stall_detect_probe(struct platform_device *dev)
120 {
121 int cpu, ret, err;
122 void __iomem *membase;
123 struct resource *r;
124 struct vm_stall_detect_s *vm_stall_detect;
125 u32 stall_detect_clock, stall_detect_timeout_sec = 0;
126
127 r = platform_get_resource(dev, IORESOURCE_MEM, 0);
128 if (r == NULL)
129 return -ENOENT;
130
> 131 vm_stall_detect = alloc_percpu(typeof(struct vm_stall_detect_s));
132 if (!vm_stall_detect)
133 return -ENOMEM;
134
135 membase = ioremap(r->start, resource_size(r));
136 if (!membase) {
137 ret = -ENXIO;
138 goto err_withmem;
139 }
140
141 virt_dev = dev;
142 platform_set_drvdata(dev, vm_stall_detect);
143 if (of_property_read_u32(dev->dev.of_node, "clock-frequency",
144 &stall_detect_clock))
145 stall_detect_clock = DEFAULT_CLOCK_HZ;
146
147 if (of_property_read_u32(dev->dev.of_node, "timeout-sec",
148 &stall_detect_timeout_sec))
149 stall_detect_timeout_sec = DEFAULT_TIMEOT_SEC;
150
151 for_each_cpu_and(cpu, cpu_online_mask, &watchdog_cpumask) {
152 struct vm_stall_detect_s *cpu_stall_detect;
153
154 cpu_stall_detect = per_cpu_ptr(vm_stall_detect, cpu);
155 cpu_stall_detect->membase = membase + cpu * REG_LEN;
156 cpu_stall_detect->clock_freq = stall_detect_clock;
157 cpu_stall_detect->expiration_sec = stall_detect_timeout_sec;
158 cpu_stall_detect->ping_timeout_ms = stall_detect_timeout_sec *
159 MSEC_PER_SEC / 2;
160 smp_call_function_single(cpu, vcpu_stall_detect_start,
161 cpu_stall_detect, true);
162 }
163
164 err = cpuhp_setup_state_nocalls(CPUHP_AP_ONLINE_DYN,
165 "virt/vcpu_stall_detector:online",
166 start_stall_detector_on_cpu,
167 stop_stall_detector_on_cpu);
168 if (err < 0) {
169 dev_warn(&dev->dev, "failed to install cpu hotplug");
170 ret = err;
171 goto err_withmem;
172 }
173
174 return 0;
175
176 err_withmem:
> 177 free_percpu(vm_stall_detect);
178 return ret;
179 }
180

--
0-DAY CI Kernel Test Service
https://01.org/lkp

2022-05-10 09:46:15

by kernel test robot

[permalink] [raw]
Subject: Re: [PATCH v5 2/2] misc: Add a mechanism to detect stalls on guest vCPUs

Hi Sebastian,

Thank you for the patch! Yet something to improve:

[auto build test ERROR on robh/for-next]
[also build test ERROR on char-misc/char-misc-testing soc/for-next v5.18-rc6 next-20220509]
[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/intel-lab-lkp/linux/commits/Sebastian-Ene/Detect-stalls-on-guest-vCPUS/20220509-174959
base: https://git.kernel.org/pub/scm/linux/kernel/git/robh/linux.git for-next
config: sh-allmodconfig (https://download.01.org/0day-ci/archive/20220510/[email protected]/config)
compiler: sh4-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://github.com/intel-lab-lkp/linux/commit/d3152372fdd19448b32806c0bffd78d8729d02e4
git remote add linux-review https://github.com/intel-lab-lkp/linux
git fetch --no-tags linux-review Sebastian-Ene/Detect-stalls-on-guest-vCPUS/20220509-174959
git checkout d3152372fdd19448b32806c0bffd78d8729d02e4
# 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=sh SHELL=/bin/bash drivers/misc/

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <[email protected]>

All errors (new ones prefixed by >>):

In file included from include/linux/device/driver.h:21,
from include/linux/device.h:32,
from include/linux/node.h:18,
from include/linux/cpu.h:17,
from drivers/misc/vcpu_stall_detector.c:6:
>> drivers/misc/vcpu_stall_detector.c:203:25: error: 'vcpu_stall_detector_of_match' undeclared here (not in a function); did you mean 'vcpu_stall_detect_of_match'?
203 | MODULE_DEVICE_TABLE(of, vcpu_stall_detector_of_match);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
include/linux/module.h:244:15: note: in definition of macro 'MODULE_DEVICE_TABLE'
244 | extern typeof(name) __mod_##type##__##name##_device_table \
| ^~~~
>> include/linux/module.h:244:21: error: '__mod_of__vcpu_stall_detector_of_match_device_table' aliased to undefined symbol 'vcpu_stall_detector_of_match'
244 | extern typeof(name) __mod_##type##__##name##_device_table \
| ^~~~~~
drivers/misc/vcpu_stall_detector.c:203:1: note: in expansion of macro 'MODULE_DEVICE_TABLE'
203 | MODULE_DEVICE_TABLE(of, vcpu_stall_detector_of_match);
| ^~~~~~~~~~~~~~~~~~~


vim +203 drivers/misc/vcpu_stall_detector.c

202
> 203 MODULE_DEVICE_TABLE(of, vcpu_stall_detector_of_match);
204

--
0-DAY CI Kernel Test Service
https://01.org/lkp