From nobody Thu May 7 19:51:04 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 1E94DC433EF for ; Thu, 19 May 2022 15:44:16 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S239990AbiESPoL (ORCPT ); Thu, 19 May 2022 11:44:11 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:51004 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S241336AbiESPnp (ORCPT ); Thu, 19 May 2022 11:43:45 -0400 Received: from mail-wm1-x34a.google.com (mail-wm1-x34a.google.com [IPv6:2a00:1450:4864:20::34a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 73151689B8 for ; Thu, 19 May 2022 08:43:13 -0700 (PDT) Received: by mail-wm1-x34a.google.com with SMTP id p24-20020a1c5458000000b003945d2ffc6eso2180780wmi.5 for ; Thu, 19 May 2022 08:43:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=date:message-id:mime-version:subject:from:to:cc; bh=LDnjINTdrLmSbH/oDg0tv0BqLkkxPNd2bF0UCJnpHSE=; b=dOziocArW4d3s7LtNCyzgr0YXDIQVWYBCOJ5hB2qeEDLDQ/DzUQhZQFjI/tqddYJtR jtHCMwDRr2I4bNb04T+vcaCM5XsfIc5XvU1uOBM6XRUiLcS9jsl3pj3GD1ex/wPFbHpu P3V+rKn9GasA1agX/1Xhdh1Dk8MkwUdItgvHQdVsY4sTNvmBxMR7weI9jVgxvS/l+rcJ BWKnq5n8G+EAwMlOkSMvSR6Cj9jqQkPPOwfwH4pa8oNk+9hsp8g2RILfGqpvJ6H88OTo 2MggzQg6WWuHubYWrY1qxbI6og4vYwiW1T57XPN9QFQcs7ca81tyK02UZ1Q9kafsYFta BHeA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:date:message-id:mime-version:subject:from:to:cc; bh=LDnjINTdrLmSbH/oDg0tv0BqLkkxPNd2bF0UCJnpHSE=; b=fe5I+58OsmzqCikXZO0RkT6wj8LikbheeR1My4zlRBzhVpZwDKOLv/wANya1J4FB7Q /dhkORreidY16jVV6Ajjw7v0INoFXd6x3J0o4xzfhNZF1R7nyCoi9Zy1SGTFm5amSDfD SwWZiQk87Spk39xNcGnWMG4/2C3MdTYX+CuZcgF4RIS00d9IpGa1nG20e/nWtsWzabUj yE2ujFBD6oq37yYjMZ0BA8s68/cExCV8KqQv32GBkp2WAfpj5sXHfvazpF3D3NWYndv0 VVUNJxA0Wf3nwThd3ZpaXkIdER91tK+grafPngYr/knjF6X0a2mDv4a5g2a+n8kzzO8R a1mg== X-Gm-Message-State: AOAM533YzhsQiM/g2TnSnQ2jZ4wxhx7WCMeZTgHOoG74+p92bCcHlpa2 X45OMQAaOTVH7fdYDU26rEXxN7kENicGFqm8 X-Google-Smtp-Source: ABdhPJzjwtHaUMLATeXxDzeE6kaNW9goZVfjjcn0eLsTT4A/aPfTFC8UriyZVRyooLFZDR6awuVQAD+gq2kDj6/s X-Received: from vdonnefort.c.googlers.com ([fda3:e722:ac3:cc00:28:9cb1:c0a8:2eea]) (user=vdonnefort job=sendgmr) by 2002:a5d:618f:0:b0:20c:ffa0:95a8 with SMTP id j15-20020a5d618f000000b0020cffa095a8mr4591604wru.306.1652974991948; Thu, 19 May 2022 08:43:11 -0700 (PDT) Date: Thu, 19 May 2022 16:42:57 +0100 Message-Id: <20220519154257.1464081-1-vdonnefort@google.com> Mime-Version: 1.0 X-Mailer: git-send-email 2.36.1.124.g0e6072fb45-goog Subject: [PATCH] cpu/hotplug: Do not bail-out during DYING/STARTING sections From: Vincent Donnefort To: peterz@infradead.org, tglx@linutronix.de Cc: linux-kernel@vger.kernel.org, vschneid@redhat.com, kernel-team@android.com, Vincent Donnefort , Derek Dolney Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The DYING/STARTING callbacks are not expected to fail. However, callbacks registered in those sections can still report errors. There's nothing the hotplug machinery can do, so let's just proceed and log the failures. Fixes: 453e41085183 (cpu/hotplug: Add cpuhp_invoke_callback_range()) Reported-by: Derek Dolney Signed-off-by: Vincent Donnefort diff --git a/kernel/cpu.c b/kernel/cpu.c index bbad5e375d3b..b23a83d869a9 100644 --- a/kernel/cpu.c +++ b/kernel/cpu.c @@ -663,21 +663,52 @@ static bool cpuhp_next_state(bool bringup, return true; } =20 -static int cpuhp_invoke_callback_range(bool bringup, - unsigned int cpu, - struct cpuhp_cpu_state *st, - enum cpuhp_state target) +static int _cpuhp_invoke_callback_range(bool bringup, + unsigned int cpu, + struct cpuhp_cpu_state *st, + enum cpuhp_state target, + bool no_fail) { enum cpuhp_state state; - int err =3D 0; + int ret =3D 0; =20 while (cpuhp_next_state(bringup, &state, st, target)) { + int err; + err =3D cpuhp_invoke_callback(cpu, state, bringup, NULL, NULL); - if (err) + if (!err) + continue; + + if (no_fail) { + pr_warn("CPU %u %s state %s (%d) failed (%d)\n", + cpu, bringup ? "UP" : "DOWN", + cpuhp_get_step(st->state)->name, + st->state, err); + ret =3D -1; + } else { + ret =3D err; break; + } } =20 - return err; + return ret; +} + +static inline int cpuhp_invoke_callback_range(bool bringup, + unsigned int cpu, + struct cpuhp_cpu_state *st, + enum cpuhp_state target) +{ + return _cpuhp_invoke_callback_range(bringup, cpu, st, target, false); +} + +static inline void +cpuhp_invoke_callback_range_nofail(bool bringup, + unsigned int cpu, + struct cpuhp_cpu_state *st, + enum cpuhp_state target) +{ + WARN_ON_ONCE(_cpuhp_invoke_callback_range(bringup, cpu, st, target, true)= ); } =20 static inline bool can_rollback_cpu(struct cpuhp_cpu_state *st) @@ -999,7 +1030,6 @@ static int take_cpu_down(void *_param) struct cpuhp_cpu_state *st =3D this_cpu_ptr(&cpuhp_state); enum cpuhp_state target =3D max((int)st->target, CPUHP_AP_OFFLINE); int err, cpu =3D smp_processor_id(); - int ret; =20 /* Ensure this CPU doesn't handle any more interrupts. */ err =3D __cpu_disable(); @@ -1012,13 +1042,11 @@ static int take_cpu_down(void *_param) */ WARN_ON(st->state !=3D (CPUHP_TEARDOWN_CPU - 1)); =20 - /* Invoke the former CPU_DYING callbacks */ - ret =3D cpuhp_invoke_callback_range(false, cpu, st, target); - /* + * Invoke the former CPU_DYING callbacks * DYING must not fail! */ - WARN_ON_ONCE(ret); + cpuhp_invoke_callback_range_nofail(false, cpu, st, target); =20 /* Give up timekeeping duties */ tick_handover_do_timer(); @@ -1296,16 +1324,14 @@ void notify_cpu_starting(unsigned int cpu) { struct cpuhp_cpu_state *st =3D per_cpu_ptr(&cpuhp_state, cpu); enum cpuhp_state target =3D min((int)st->target, CPUHP_AP_ONLINE); - int ret; =20 rcu_cpu_starting(cpu); /* Enables RCU usage on this CPU. */ cpumask_set_cpu(cpu, &cpus_booted_once_mask); - ret =3D cpuhp_invoke_callback_range(true, cpu, st, target); =20 /* * STARTING must not fail! */ - WARN_ON_ONCE(ret); + cpuhp_invoke_callback_range_nofail(true, cpu, st, target); } =20 /* --=20 2.36.1.124.g0e6072fb45-goog