| From: Pingfan Liu <kernelfans@gmail.com> |
| Subject: watchdog/perf: ensure CPU-bound context when creating hardlockup detector event |
| Date: Fri, 19 May 2023 10:18:29 -0700 |
| |
| hardlockup_detector_event_create() should create perf_event on the current |
| CPU. Preemption could not get disabled because |
| perf_event_create_kernel_counter() allocates memory. Instead, the CPU |
| locality is achieved by processing the code in a per-CPU bound kthread. |
| |
| Add a check to prevent mistakes when calling the code in another code |
| path. |
| |
| Link: https://lkml.kernel.org/r/20230519101840.v5.5.I654063e53782b11d53e736a8ad4897ffd207406a@changeid |
| Signed-off-by: Pingfan Liu <kernelfans@gmail.com> |
| Co-developed-by: Lecopzer Chen <lecopzer.chen@mediatek.com> |
| Signed-off-by: Lecopzer Chen <lecopzer.chen@mediatek.com> |
| Signed-off-by: Douglas Anderson <dianders@chromium.org> |
| Reviewed-by: Petr Mladek <pmladek@suse.com> |
| Cc: Andi Kleen <ak@linux.intel.com> |
| Cc: Catalin Marinas <catalin.marinas@arm.com> |
| Cc: Chen-Yu Tsai <wens@csie.org> |
| Cc: Christophe Leroy <christophe.leroy@csgroup.eu> |
| Cc: Colin Cross <ccross@android.com> |
| Cc: Daniel Thompson <daniel.thompson@linaro.org> |
| Cc: "David S. Miller" <davem@davemloft.net> |
| Cc: Guenter Roeck <groeck@chromium.org> |
| Cc: Ian Rogers <irogers@google.com> |
| Cc: Marc Zyngier <maz@kernel.org> |
| Cc: Mark Rutland <mark.rutland@arm.com> |
| Cc: Masayoshi Mizuma <msys.mizuma@gmail.com> |
| Cc: Matthias Kaehlcke <mka@chromium.org> |
| Cc: Michael Ellerman <mpe@ellerman.id.au> |
| Cc: Nicholas Piggin <npiggin@gmail.com> |
| Cc: Randy Dunlap <rdunlap@infradead.org> |
| Cc: "Ravi V. Shankar" <ravi.v.shankar@intel.com> |
| Cc: Ricardo Neri <ricardo.neri@intel.com> |
| Cc: Stephane Eranian <eranian@google.com> |
| Cc: Stephen Boyd <swboyd@chromium.org> |
| Cc: Sumit Garg <sumit.garg@linaro.org> |
| Cc: Tzung-Bi Shih <tzungbi@chromium.org> |
| Cc: Will Deacon <will@kernel.org> |
| Signed-off-by: Andrew Morton <akpm@linux-foundation.org> |
| --- |
| |
| kernel/watchdog_hld.c | 8 +++++++- |
| 1 file changed, 7 insertions(+), 1 deletion(-) |
| |
| --- a/kernel/watchdog_hld.c~watchdog-perf-ensure-cpu-bound-context-when-creating-hardlockup-detector-event |
| +++ a/kernel/watchdog_hld.c |
| @@ -165,10 +165,16 @@ static void watchdog_overflow_callback(s |
| |
| static int hardlockup_detector_event_create(void) |
| { |
| - unsigned int cpu = smp_processor_id(); |
| + unsigned int cpu; |
| struct perf_event_attr *wd_attr; |
| struct perf_event *evt; |
| |
| + /* |
| + * Preemption is not disabled because memory will be allocated. |
| + * Ensure CPU-locality by calling this in per-CPU kthread. |
| + */ |
| + WARN_ON(!is_percpu_thread()); |
| + cpu = raw_smp_processor_id(); |
| wd_attr = &wd_hw_attr; |
| wd_attr->sample_period = hw_nmi_get_sample_period(watchdog_thresh); |
| |
| _ |