Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751362AbdFZG1V (ORCPT ); Mon, 26 Jun 2017 02:27:21 -0400 Received: from smtp.nue.novell.com ([195.135.221.5]:40656 "EHLO smtp.nue.novell.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751008AbdFZG1M (ORCPT ); Mon, 26 Jun 2017 02:27:12 -0400 Date: Mon, 26 Jun 2017 14:26:57 +0800 From: joeyli To: linux-acpi@vger.kernel.org Cc: linux-kernel@vger.kernel.org, "Rafael J. Wysocki" , Yasuaki Ishimatsu , Michal Hocko Subject: A udev rule to serve the change event of ACPI container? Message-ID: <20170626062657.GE4229@linux-l9pv.suse> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.24 (2015-08-30) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 3668 Lines: 92 Hi all, If ACPI received ejection request for a ACPI container, kernel emits KOBJ_CHANGE uevent when it found online children devices below the acpi container. Base on the description of caa73ea15 kernel patch, user space is expected to offline all devices below the container and the container itself. Then, user space can finalize the removal of the container with the help of its ACPI device object's eject attribute in sysfs. That means that kernel relies on users space to peform the offline and ejection jobs to acpi container and children devices. The discussion is here: https://lkml.org/lkml/2013/11/28/520 The mail loop didn't explain why the userspace is responsible for the whole container offlining. Is it possible to do that transparently from the kernel? What's the difference between offlining memory and processors which happends without any cleanup and container which does essentially the same except it happens at once? - After a couple of years, can we let the container hot-remove process transparently? - Except udev rule, does there have any other mechanism to trigger auto offline/ejection? The attached patch is a udev rule that it's used to perform the offlien/ejection jobs on user space. I want to send it to systemd. Thanks a lot! Joey Lee >From 6c95d4858e0e7c280e490491c1a00c1b5226a029 Mon Sep 17 00:00:00 2001 From: "Lee, Chun-Yi" Date: Mon, 26 Jun 2017 11:40:03 +0800 Subject: [PATCH] rules: handle the change event of ACPI container Currently the ACPI in kernel emits KOBJ_CHANGE uevent when there have online children devices below the acpi container. Base on the description of caa73ea15 kernel patch, user space is expected to offline all devices below the container and the container itself. Then, user space can finalize the removal of the container with the help of its ACPI device object's eject attribute in sysfs. This udev rule can be a default user space application to meet kernel's expectations. This rule walks through the sysfs tree to trigger the offline of each child device then ejects the container. The ACPI_CONTAINER_EJECT environoment variable can be used to turn off the the ejection logic of container if the ejection will be triggered by other ways, e.g. BIOS or other user space application. Reference: https://lkml.org/lkml/2013/11/28/520 Cc: Yasuaki Ishimatsu Cc: Rafael J. Wysocki Cc: Michal Hocko Signed-off-by: "Lee, Chun-Yi" --- rules/80-acpi-container-hotremove.rules | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 rules/80-acpi-container-hotremove.rules diff --git a/rules/80-acpi-container-hotremove.rules b/rules/80-acpi-container-hotremove.rules new file mode 100644 index 000000000..ef4ceb5fb --- /dev/null +++ b/rules/80-acpi-container-hotremove.rules @@ -0,0 +1,16 @@ +# do not edit this file, it will be overwritten on update + +SUBSYSTEM=="container", ACTION=="change", DEVPATH=="*/ACPI0004:??", ENV{ACPI_CONTAINER_EJECT}="1"\ +RUN+="/bin/sh -c ' \ +if [ $(cat /sys/$env{DEVPATH}/online) -eq 1 ]; then \ + find -L /sys/$env{DEVPATH}/firmware_node/*/physical_node* -maxdepth 1 -name online | \ + while read line; do \ + if [ $(cat $line) -eq 1 ]; then \ + /bin/echo 0 > $line; \ + fi \ + done; \ + /bin/echo 0 > /sys/$env{DEVPATH}/online; \ + if [$env{ACPI_CONTAINER_EJECT} -eq 1] && [ $(cat /sys/$env{DEVPATH}/online) -eq 0 ]; then \ + /bin/echo 1 > /sys/$env{DEVPATH}/firmware_node/eject; \ + fi \ +fi'" -- 2.12.0