From nobody Thu Apr 30 09:29:48 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 12ECCC433EF for ; Tue, 31 May 2022 22:11:26 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1348338AbiEaWLY (ORCPT ); Tue, 31 May 2022 18:11:24 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:60292 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1348321AbiEaWLT (ORCPT ); Tue, 31 May 2022 18:11:19 -0400 Received: from bhuna.collabora.co.uk (bhuna.collabora.co.uk [46.235.227.227]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id A6B409CF68 for ; Tue, 31 May 2022 15:11:17 -0700 (PDT) Received: from [127.0.0.1] (localhost [127.0.0.1]) (Authenticated sender: dmitry.osipenko) with ESMTPSA id 161E41F43F19 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1654035076; bh=7GkhGIgV6QxRJDZgvtuGPS8ymaPjeq6xkkd4vKksEos=; h=From:To:Cc:Subject:Date:From; b=nDxiGTMUmfSXuFXfDArQSK0bds+vw1O/iEsc1PF/dQpm5vwb56tsUdKVWPk6fos8q gltGapAkgry+Dld+Me3Rv4MeYPSQ3waYyDh08vkpoLCxxfJbIHOqrLXvjTZij7UZsd UvJh+Dr9gNe3yroDrvTy4dVRKdzVeaPmAs9r0NuTh80dw6TPUH5dTOa1Z06vgIZZpv ZrxeiZwl6JxWG58gor4iQQvaKoAmdId2KRfrEGaUfScF8WLDtUXdE3h6/caMs9Ofua E/Ort45uUwNOiVWi1bP3LV2YajdeRZPZpG8zvtHN+GsAGtxzBof3KDRjPTvBiJloFz Hfvf47u5t22gg== From: Dmitry Osipenko To: "Rafael J . Wysocki" , Geert Uytterhoeven Cc: linux-kernel@vger.kernel.org Subject: [PATCH v1] kernel/reboot: Use static handler for register_platform_power_off() Date: Wed, 1 Jun 2022 01:11:02 +0300 Message-Id: <20220531221102.1112968-1-dmitry.osipenko@collabora.com> X-Mailer: git-send-email 2.35.3 MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" The register_platform_power_off() fails on m68k platform due to the memory allocation error that happens at a very early boot time when memory allocator isn't available yet. Fix it by using a static sys-off handler for the platform-level power-off handlers. Fixes: f0f7e5265b3b ("m68k: Switch to new sys-off handler API") Reported-by: Geert Uytterhoeven Signed-off-by: Dmitry Osipenko Reviewed-by: Geert Uytterhoeven Tested-by: Geert Uytterhoeven --- kernel/reboot.c | 43 +++++++++++++++++++++++++++++++++++++------ 1 file changed, 37 insertions(+), 6 deletions(-) diff --git a/kernel/reboot.c b/kernel/reboot.c index a091145ee710..3b19b123efec 100644 --- a/kernel/reboot.c +++ b/kernel/reboot.c @@ -315,6 +315,37 @@ static int sys_off_notify(struct notifier_block *nb, return handler->sys_off_cb(&data); } =20 +static struct sys_off_handler platform_sys_off_handler; + +static struct sys_off_handler *alloc_sys_off_handler(int priority) +{ + struct sys_off_handler *handler; + + /* + * Platforms like m68k can't allocate sys_off handler dynamically + * at the early boot time because memory allocator isn't available yet. + */ + if (priority =3D=3D SYS_OFF_PRIO_PLATFORM) { + handler =3D &platform_sys_off_handler; + if (handler->cb_data) + return ERR_PTR(-EBUSY); + } else { + handler =3D kzalloc(sizeof(*handler), GFP_KERNEL); + if (!handler) + return ERR_PTR(-ENOMEM); + } + + return handler; +} + +static void free_sys_off_handler(struct sys_off_handler *handler) +{ + if (handler =3D=3D &platform_sys_off_handler) + memset(handler, 0, sizeof(*handler)); + else + kfree(handler); +} + /** * register_sys_off_handler - Register sys-off handler * @mode: Sys-off mode @@ -345,9 +376,9 @@ register_sys_off_handler(enum sys_off_mode mode, struct sys_off_handler *handler; int err; =20 - handler =3D kzalloc(sizeof(*handler), GFP_KERNEL); - if (!handler) - return ERR_PTR(-ENOMEM); + handler =3D alloc_sys_off_handler(priority); + if (IS_ERR(handler)) + return handler; =20 switch (mode) { case SYS_OFF_MODE_POWER_OFF_PREPARE: @@ -364,7 +395,7 @@ register_sys_off_handler(enum sys_off_mode mode, break; =20 default: - kfree(handler); + free_sys_off_handler(handler); return ERR_PTR(-EINVAL); } =20 @@ -391,7 +422,7 @@ register_sys_off_handler(enum sys_off_mode mode, } =20 if (err) { - kfree(handler); + free_sys_off_handler(handler); return ERR_PTR(err); } =20 @@ -422,7 +453,7 @@ void unregister_sys_off_handler(struct sys_off_handler = *handler) /* sanity check, shall never happen */ WARN_ON(err); =20 - kfree(handler); + free_sys_off_handler(handler); } EXPORT_SYMBOL_GPL(unregister_sys_off_handler); =20 --=20 2.35.3