From patchwork Sun Jan 30 23:36:57 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Dmitry Osipenko X-Patchwork-Id: 12730240 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 lists.xenproject.org (lists.xenproject.org [192.237.175.120]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 2839AC35272 for ; Sun, 30 Jan 2022 23:37:49 +0000 (UTC) Received: from list by lists.xenproject.org with outflank-mailman.262555.454801 (Exim 4.92) (envelope-from ) id 1nEJlB-0003lZ-Eu; Sun, 30 Jan 2022 23:37:29 +0000 X-Outflank-Mailman: Message body and most headers restored to incoming version Received: by outflank-mailman (output) from mailman id 262555.454801; Sun, 30 Jan 2022 23:37:29 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1nEJlB-0003lS-BS; Sun, 30 Jan 2022 23:37:29 +0000 Received: by outflank-mailman (input) for mailman id 262555; Sun, 30 Jan 2022 23:37:28 +0000 Received: from se1-gles-flk1-in.inumbo.com ([94.247.172.50] helo=se1-gles-flk1.inumbo.com) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1nEJlA-0003l1-9V for xen-devel@lists.xenproject.org; Sun, 30 Jan 2022 23:37:28 +0000 Received: from mail-lj1-x22c.google.com (mail-lj1-x22c.google.com [2a00:1450:4864:20::22c]) by se1-gles-flk1.inumbo.com (Halon) with ESMTPS id 9476d620-8225-11ec-8f75-fffcc8bd4f1a; Mon, 31 Jan 2022 00:37:26 +0100 (CET) Received: by mail-lj1-x22c.google.com with SMTP id j14so17124319lja.3 for ; Sun, 30 Jan 2022 15:37:25 -0800 (PST) Received: from localhost.localdomain (109-252-138-126.dynamic.spd-mgts.ru. [109.252.138.126]) by smtp.gmail.com with ESMTPSA id a24sm1262950ljp.112.2022.01.30.15.37.23 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 30 Jan 2022 15:37:24 -0800 (PST) X-BeenThere: xen-devel@lists.xenproject.org List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Precedence: list Sender: "Xen-devel" X-Inumbo-ID: 9476d620-8225-11ec-8f75-fffcc8bd4f1a DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=4eoWjq77niO2/5mvubSY6iz+bNrFykDrz7qPLv0XxnA=; b=aD7wXiah9ZF54jblMWRBCwErq130RK7Pi9PDT8VM6wqUjdlxwba0k9nXIKj2nIwI2q 2BkI6ySdk4A+qyq/KTKzS/CudPUIzorZfAiFgswJ1EsPVwYvE1VmTJF4cPL+gn0/bWWB PqRXUkeMMcF3wk6nL4z0PK8tqqiIXijE2MiamX/XzGjOxBWmMmFKK47RCIW00bOP386k e5/sd5VENhhtbSdkGs1xZQDir/QdgCsl7UDXI5I5ZA4xehJlH2bVownc2c4ANaUBXNa9 EDMeb5qScYUE7LFEZLUezhWgkY10X1bDaUJnJ4K2qH0WsMKFCRlJ0k/KGeMWzaIQJ+Qy ARfg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=4eoWjq77niO2/5mvubSY6iz+bNrFykDrz7qPLv0XxnA=; b=jxbAQKKLxkXZB7kkZywbAHlOSG2I329CngacEIpH8W/YiX4As47itiAMCAWuI7Yy9X GVVZEepjKTWV0C44p80R9vvzBlRwbTxEqSAZ5EkO47Ks2gJEEnZOgFsCmVkv+noXvwMI z8LCsSmjMtox0LMbv10+AM6tqdY1DXv38LIDpBAOj7FrHBrAscMK4GIGSLrX6MurV2yj W69qMvmORtVnvbpRc8J8wjycs13La6yr2OTcwgwx4TKQEC9FNf8eXH20tqjZcqM8KDDS 1PvwomEOGwnStDKJfcgLDIDcz6SQoEsF3HXpZxLgYCPLLNHzP0xnQoUZcTdJiWVsFPMy dCMg== X-Gm-Message-State: AOAM533zI1P5vKAGyKy1/aiupQZ1L31gu4VLYLfcIh/EiP5vTfSpa2EH VUSYUcUxnIvIRzCuD11Kyso= X-Google-Smtp-Source: ABdhPJwvbVxnWY1P5cesSOFGUVAdUo3JJV7z5zLcIzapPRoG+0N1cswoemLCcHfWL8nLT/vbuvjCWg== X-Received: by 2002:a05:651c:b0b:: with SMTP id b11mr12655945ljr.481.1643585845329; Sun, 30 Jan 2022 15:37:25 -0800 (PST) From: Dmitry Osipenko To: Thierry Reding , Jonathan Hunter , Russell King , Catalin Marinas , Will Deacon , Guo Ren , Geert Uytterhoeven , Greg Ungerer , Joshua Thompson , Thomas Bogendoerfer , Sebastian Reichel , Linus Walleij , Philipp Zabel , Greentime Hu , Vincent Chen , "James E.J. Bottomley" , Helge Deller , Michael Ellerman , Benjamin Herrenschmidt , Paul Mackerras , Paul Walmsley , Palmer Dabbelt , Albert Ou , Yoshinori Sato , Rich Felker , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, "H. Peter Anvin" , Boris Ostrovsky , Juergen Gross , Stefano Stabellini , "Rafael J. Wysocki" , Len Brown , Santosh Shilimkar , Krzysztof Kozlowski , Liam Girdwood , Mark Brown , Pavel Machek , Lee Jones , Andrew Morton , Guenter Roeck , Daniel Lezcano , Andy Shevchenko , Ulf Hansson , alankao@andestech.com, "K . C . Kuen-Chern Lin" , =?utf-8?b?TWljaGHFgiBNaXJv?= =?utf-8?b?c8WCYXc=?= Cc: linux-kernel@vger.kernel.org, linux-csky@vger.kernel.org, linux-ia64@vger.kernel.org, linux-m68k@lists.linux-m68k.org, linux-mips@vger.kernel.org, linux-parisc@vger.kernel.org, linux-riscv@lists.infradead.org, linux-sh@vger.kernel.org, xen-devel@lists.xenproject.org, linux-acpi@vger.kernel.org, linux-pm@vger.kernel.org, linux-tegra@vger.kernel.org Subject: [PATCH v6 00/21] Introduce power-off+restart call chain API Date: Mon, 31 Jan 2022 02:36:57 +0300 Message-Id: <20220130233718.21544-1-digetx@gmail.com> X-Mailer: git-send-email 2.34.1 MIME-Version: 1.0 Problem ------- SoC devices require power-off call chaining functionality from kernel. We have a widely used restart chaining provided by restart notifier API, but nothing for power-off. Solution -------- Introduce new API that provides both restart and power-off call chains. Why combine restart with power-off? Because drivers often do both. More practical to have API that provides both under the same roof. The new API is designed with simplicity and extensibility in mind. It's built upon the existing restart and reboot APIs. The simplicity is in new helper functions that are convenient for drivers. The extensibility is in the design that doesn't hardcode callback arguments, making easy to add new parameters and remove old. This is a third attempt to introduce the new API. First was made by Guenter Roeck back in 2014, second was made by Thierry Reding in 2017. In fact the work didn't stop and recently arm_pm_restart() was removed from v5.14 kernel, which was a part of preparatory work started by Guenter Roeck. I took into account experience and ideas from the previous attempts, extended and polished them. Adoption plan ------------- This patchset introduces the new API. It also converts multiple drivers and arch code to the new API to demonstrate how it all looks in practice. The plan is: 1. Merge new API (patches 1-8). This API will co-exist with the old APIs. 2. Convert arch code to do_kernel_power_off() (patches 9-21). 3. Convert drivers and platform code to the new API. 4. Remove obsolete pm_power_off and pm_power_off_prepare variables. 5. Make restart-notifier API private to kernel/reboot.c once no users left. 6. Make uniqueness of the handlers' priority a mandatory requirement. It's fully implemented here: [1] https://github.com/grate-driver/linux/commits/sys-off-handler For now I'm sending only the first 25 base patches out of ~180. It's preferable to squash 1-2, partially 3 and 4 points of the plan into a single patchset to ease and speed up applying of the rest of the patches. Majority of drivers and platform patches depend on the base, hence they will come later (and per subsystem), once base will land. All [1] patches are compile-tested. Tegra and x86 ACPI patches are tested on hardware. The remaining should be covered by unit tests (unpublished). Results ------- 1. Devices can be powered off properly. 2. Global variables are removed from drivers. 3. Global pm_power_off and pm_power_off_prepare callback variables are removed once all users are converted to the new API. The latter callback is removed by patch #25 of this series. 4. Ambiguous call chain ordering is prohibited. See patch #5 which adds verification of restart handlers priorities, ensuring that they are unique. Changelog: v6: - Rebased on a recent linux-next. - Made minor couple cosmetic changes. v5: - Dropped patches which cleaned up notifier/reboot headers, as was requested by Rafael Wysocki. - Dropped WARN_ON() from the code, as was requested by Rafael Wysocki. Replaced it with pr_err() appropriately. - Dropped *_notifier_has_unique_priority() functions and added *_notifier_chain_register_unique_prio() instead, as was suggested by Michał Mirosław and Rafael Wysocki. - Dropped export of blocking_notifier_call_chain_is_empty() symbol, as was suggested by Rafael Wysocki. - Michał Mirosław suggested that will be better to split up patch that adds the new API to ease reviewing, but Rafael Wysocki asked not add more patches, so I kept it as a single patch. - Added temporary "weak" stub for pm_power_off() which fixes linkage failure once symbol is removed from arch/* code. Previously I missed this problem because was only compile-testing object files. v4: - Made a very minor improvement to doc comments, clarifying couple default values. - Corrected list of emails recipient by adding Linus, Sebastian, Philipp and more NDS people. Removed bouncing emails. - Added acks that were given to v3. v3: - Renamed power_handler to sys_off_handler as was suggested by Rafael Wysocki. - Improved doc-comments as was suggested by Rafael Wysocki. Added more doc-comments. - Implemented full set of 180 patches which convert whole kernel in accordance to the plan, see link [1] above. Slightly adjusted API to better suit for the remaining converted drivers. * Added unregister_sys_off_handler() that is handy for a couple old platform drivers. * Dropped devm_register_trivial_restart_handler(), 'simple' variant is enough to have. - Improved "Add atomic/blocking_notifier_has_unique_priority()" patch, as was suggested by Andy Shevchenko. Also replaced down_write() with down_read() and factored out common notifier_has_unique_priority(). - Added stop_chain field to struct restart_data and reboot_prep_data after discovering couple drivers wanting that feature. - Added acks that were given to v2. v2: - Replaced standalone power-off call chain demo-API with the combined power-off+restart API because this is what drivers want. It's a more comprehensive solution. - Converted multiple drivers and arch code to the new API. Suggested by Andy Shevchenko. I skimmed through the rest of drivers, verifying that new API suits them. The rest of the drivers will be converted once we will settle on the new API, otherwise will be too many patches here. - v2 API doesn't expose notifier to users and require handlers to have unique priority. Suggested by Guenter Roeck. - v2 API has power-off chaining disabled by default and require drivers to explicitly opt-in to the chaining. This preserves old behaviour for existing drivers once they are converted to the new API. Dmitry Osipenko (21): notifier: Add blocking_notifier_call_chain_is_empty() notifier: Add atomic/blocking_notifier_chain_register_unique_prio() reboot: Print error message if restart handler has duplicated priority kernel: Add combined power-off+restart handler call chain API ARM: Use do_kernel_power_off() csky: Use do_kernel_power_off() riscv: Use do_kernel_power_off() arm64: Use do_kernel_power_off() parisc: Use do_kernel_power_off() xen/x86: Use do_kernel_power_off() powerpc: Use do_kernel_power_off() m68k: Switch to new sys-off handler API sh: Use do_kernel_power_off() x86: Use do_kernel_power_off() ia64: Use do_kernel_power_off() mips: Use do_kernel_power_off() nds32: Use do_kernel_power_off() memory: emif: Use kernel_can_power_off() ACPI: power: Switch to sys-off handler API regulator: pfuze100: Use devm_register_sys_off_handler() reboot: Remove pm_power_off_prepare() arch/arm/kernel/reboot.c | 4 +- arch/arm64/kernel/process.c | 3 +- arch/csky/kernel/power.c | 6 +- arch/ia64/kernel/process.c | 4 +- arch/m68k/emu/natfeat.c | 3 +- arch/m68k/include/asm/machdep.h | 1 - arch/m68k/kernel/process.c | 5 +- arch/m68k/kernel/setup_mm.c | 1 - arch/m68k/kernel/setup_no.c | 1 - arch/m68k/mac/config.c | 4 +- arch/mips/kernel/reset.c | 3 +- arch/nds32/kernel/process.c | 3 +- arch/parisc/kernel/process.c | 4 +- arch/powerpc/kernel/setup-common.c | 4 +- arch/powerpc/xmon/xmon.c | 3 +- arch/riscv/kernel/reset.c | 12 +- arch/sh/kernel/reboot.c | 3 +- arch/x86/kernel/reboot.c | 4 +- arch/x86/xen/enlighten_pv.c | 4 +- drivers/acpi/sleep.c | 25 +- drivers/memory/emif.c | 2 +- drivers/regulator/pfuze100-regulator.c | 38 +- include/linux/notifier.h | 7 + include/linux/pm.h | 1 - include/linux/reboot.h | 265 +++++++++++- kernel/notifier.c | 101 ++++- kernel/power/hibernate.c | 2 +- kernel/reboot.c | 573 ++++++++++++++++++++++++- 28 files changed, 968 insertions(+), 118 deletions(-)