watchdog/perf: ensure CPU-bound context when creating hardlockup detector event
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>
This commit is contained in:
parent
730211182e
commit
1fafaa7745
|
@ -165,10 +165,16 @@ static void watchdog_overflow_callback(struct perf_event *event,
|
||||||
|
|
||||||
static int hardlockup_detector_event_create(void)
|
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_attr *wd_attr;
|
||||||
struct perf_event *evt;
|
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 = &wd_hw_attr;
|
||||||
wd_attr->sample_period = hw_nmi_get_sample_period(watchdog_thresh);
|
wd_attr->sample_period = hw_nmi_get_sample_period(watchdog_thresh);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue