2020-02-11 23:37:13

by Josh Triplett

[permalink] [raw]
Subject: [PATCH 0/2] ACPI: Tiny power button driver

Virtual machines often use an ACPI power button event to tell the
machine to shut down gracefully.

Provide an extremely lightweight "tiny power button" driver to handle
this event by signaling init directly, rather than running a separate
daemon (such as acpid or systemd-logind) that adds to startup time and
VM image complexity.

I originally proposed a change to the ACPI power button driver to
introduce an optional path to signal init, but Rafael expressed a
preference to have this as a separate, mutually exclusive driver
instead. The result did come out much simpler, conceptually, with the
added benefit of being able to disable CONFIG_INPUT entirely for a
kernel that exclusively targets cloud/VM systems.

The first patch in the series just moves HID definitions to
acpi/button.h in preparation for sharing them with the tiny-power-button
driver. The second patch provides the driver itself.

Josh Triplett (2):
acpi: button: move HIDs to acpi/button.h
acpi: Add new tiny-power-button driver to directly signal init

drivers/acpi/Kconfig | 24 +++++++++++++++++
drivers/acpi/Makefile | 1 +
drivers/acpi/button.c | 3 ---
drivers/acpi/tiny-power-button.c | 46 ++++++++++++++++++++++++++++++++
include/acpi/button.h | 4 +++
5 files changed, 75 insertions(+), 3 deletions(-)
create mode 100644 drivers/acpi/tiny-power-button.c

--
2.25.0


2020-02-11 23:38:36

by Josh Triplett

[permalink] [raw]
Subject: [PATCH 1/2] ACPI: button: move HIDs to acpi/button.h

This makes it possible to use ACPI_BUTTON_HID_POWER in another driver.

Signed-off-by: Josh Triplett <[email protected]>
---
drivers/acpi/button.c | 3 ---
include/acpi/button.h | 4 ++++
2 files changed, 4 insertions(+), 3 deletions(-)

diff --git a/drivers/acpi/button.c b/drivers/acpi/button.c
index f6925f16c4a2..00112cf15322 100644
--- a/drivers/acpi/button.c
+++ b/drivers/acpi/button.c
@@ -30,17 +30,14 @@
#define ACPI_BUTTON_NOTIFY_STATUS 0x80

#define ACPI_BUTTON_SUBCLASS_POWER "power"
-#define ACPI_BUTTON_HID_POWER "PNP0C0C"
#define ACPI_BUTTON_DEVICE_NAME_POWER "Power Button"
#define ACPI_BUTTON_TYPE_POWER 0x01

#define ACPI_BUTTON_SUBCLASS_SLEEP "sleep"
-#define ACPI_BUTTON_HID_SLEEP "PNP0C0E"
#define ACPI_BUTTON_DEVICE_NAME_SLEEP "Sleep Button"
#define ACPI_BUTTON_TYPE_SLEEP 0x03

#define ACPI_BUTTON_SUBCLASS_LID "lid"
-#define ACPI_BUTTON_HID_LID "PNP0C0D"
#define ACPI_BUTTON_DEVICE_NAME_LID "Lid Switch"
#define ACPI_BUTTON_TYPE_LID 0x05

diff --git a/include/acpi/button.h b/include/acpi/button.h
index 340da7784cc8..af2fce5d2ee3 100644
--- a/include/acpi/button.h
+++ b/include/acpi/button.h
@@ -2,6 +2,10 @@
#ifndef ACPI_BUTTON_H
#define ACPI_BUTTON_H

+#define ACPI_BUTTON_HID_POWER "PNP0C0C"
+#define ACPI_BUTTON_HID_LID "PNP0C0D"
+#define ACPI_BUTTON_HID_SLEEP "PNP0C0E"
+
#if IS_ENABLED(CONFIG_ACPI_BUTTON)
extern int acpi_lid_open(void);
#else
--
2.25.0

2020-02-11 23:39:30

by Josh Triplett

[permalink] [raw]
Subject: [PATCH 2/2] ACPI: Add new tiny-power-button driver to directly signal init

Virtual machines often use an ACPI power button event to tell the
machine to shut down gracefully.

Provide an extremely lightweight "tiny power button" driver to handle
this event by signaling init directly, rather than running a separate
daemon (such as acpid or systemd-logind) that adds to startup time and
VM image complexity.

The kernel configuration defines the default signal to send init, and
userspace can change this signal via a module parameter.

Suggested-by: "Rafael J. Wysocki" <[email protected]>
Signed-off-by: Josh Triplett <[email protected]>
---
drivers/acpi/Kconfig | 24 +++++++++++++++++
drivers/acpi/Makefile | 1 +
drivers/acpi/tiny-power-button.c | 46 ++++++++++++++++++++++++++++++++
3 files changed, 71 insertions(+)
create mode 100644 drivers/acpi/tiny-power-button.c

diff --git a/drivers/acpi/Kconfig b/drivers/acpi/Kconfig
index cc57bab146b5..ce2730d61a8f 100644
--- a/drivers/acpi/Kconfig
+++ b/drivers/acpi/Kconfig
@@ -190,6 +190,30 @@ config ACPI_BUTTON
To compile this driver as a module, choose M here:
the module will be called button.

+config ACPI_TINY_POWER_BUTTON
+ tristate "Tiny Power Button Driver"
+ depends on !ACPI_BUTTON
+ help
+ This driver provides a tiny alternative to the ACPI Button driver.
+ The tiny power button driver only handles the power button. Rather
+ than notifying userspace via the input layer or a netlink event, this
+ driver directly signals the init process to shut down.
+
+ This driver is particularly suitable for cloud and VM environments,
+ which use a simulated power button to initiate a controlled poweroff,
+ but which may not want to run a separate userspace daemon to process
+ input events.
+
+config ACPI_TINY_POWER_BUTTON_SIGNAL
+ int "Tiny Power Button Signal"
+ depends on ACPI_TINY_POWER_BUTTON
+ default 38
+ help
+ Default signal to send to init in response to the power button.
+
+ Likely values here include 38 (SIGRTMIN+4) to power off, or 2
+ (SIGINT) to simulate Ctrl+Alt+Del.
+
config ACPI_VIDEO
tristate "Video"
depends on X86 && BACKLIGHT_CLASS_DEVICE
diff --git a/drivers/acpi/Makefile b/drivers/acpi/Makefile
index 33fdaf67454e..e81e1ebbfb32 100644
--- a/drivers/acpi/Makefile
+++ b/drivers/acpi/Makefile
@@ -71,6 +71,7 @@ obj-$(CONFIG_ACPI_IPMI) += acpi_ipmi.o

obj-$(CONFIG_ACPI_AC) += ac.o
obj-$(CONFIG_ACPI_BUTTON) += button.o
+obj-$(CONFIG_ACPI_TINY_POWER_BUTTON) += tiny-power-button.o
obj-$(CONFIG_ACPI_FAN) += fan.o
obj-$(CONFIG_ACPI_VIDEO) += video.o
obj-$(CONFIG_ACPI_TAD) += acpi_tad.o
diff --git a/drivers/acpi/tiny-power-button.c b/drivers/acpi/tiny-power-button.c
new file mode 100644
index 000000000000..6273d73c0b59
--- /dev/null
+++ b/drivers/acpi/tiny-power-button.c
@@ -0,0 +1,46 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+#include <linux/module.h>
+#include <linux/sched/signal.h>
+#include <linux/acpi.h>
+#include <acpi/button.h>
+
+ACPI_MODULE_NAME("tiny-power-button");
+MODULE_AUTHOR("Josh Triplett");
+MODULE_DESCRIPTION("ACPI Tiny Power Button Driver");
+MODULE_LICENSE("GPL");
+
+static int power_signal __read_mostly = CONFIG_ACPI_TINY_POWER_BUTTON_SIGNAL;
+module_param(power_signal, int, 0644);
+MODULE_PARM_DESC(power_signal, "Power button sends this signal to init");
+
+static const struct acpi_device_id tiny_power_button_device_ids[] = {
+ { ACPI_BUTTON_HID_POWER, 0 },
+ { ACPI_BUTTON_HID_POWERF, 0 },
+ { "", 0 },
+};
+MODULE_DEVICE_TABLE(acpi, tiny_power_button_device_ids);
+
+static int acpi_noop_add_remove(struct acpi_device *device)
+{
+ return 0;
+}
+
+static void acpi_tiny_power_button_notify(struct acpi_device *device, u32 event)
+{
+ kill_cad_pid(power_signal, 1);
+}
+
+static struct acpi_driver acpi_tiny_power_button_driver = {
+ .name = "tiny-power-button",
+ .class = "tiny-power-button",
+ .ids = tiny_power_button_device_ids,
+ .ops = {
+ .add = acpi_noop_add_remove,
+ .remove = acpi_noop_add_remove,
+ .notify = acpi_tiny_power_button_notify,
+ },
+};
+
+module_driver(acpi_tiny_power_button_driver,
+ acpi_bus_register_driver,
+ acpi_bus_unregister_driver);
--
2.25.0

2020-02-13 22:43:46

by Rafael J. Wysocki

[permalink] [raw]
Subject: Re: [PATCH 0/2] ACPI: Tiny power button driver

On Wed, Feb 12, 2020 at 12:36 AM Josh Triplett <[email protected]> wrote:
>
> Virtual machines often use an ACPI power button event to tell the
> machine to shut down gracefully.
>
> Provide an extremely lightweight "tiny power button" driver to handle
> this event by signaling init directly, rather than running a separate
> daemon (such as acpid or systemd-logind) that adds to startup time and
> VM image complexity.
>
> I originally proposed a change to the ACPI power button driver to
> introduce an optional path to signal init, but Rafael expressed a
> preference to have this as a separate, mutually exclusive driver
> instead. The result did come out much simpler, conceptually, with the
> added benefit of being able to disable CONFIG_INPUT entirely for a
> kernel that exclusively targets cloud/VM systems.
>
> The first patch in the series just moves HID definitions to
> acpi/button.h in preparation for sharing them with the tiny-power-button
> driver. The second patch provides the driver itself.
>
> Josh Triplett (2):
> acpi: button: move HIDs to acpi/button.h
> acpi: Add new tiny-power-button driver to directly signal init

Applied as 5.7 material, thanks!