From: "Arve Hjønnevåg" <arve@android.com>
To: linux-pm@lists.linux-foundation.org, linux-kernel@vger.kernel.org
Cc: Len Brown <len.brown@intel.com>,
linux-doc@vger.kernel.org,
Jesse Barnes <jbarnes@virtuousgeek.org>,
Magnus Damm <damm@igel.co.jp>
Subject: [PATCH 2/9] PM: suspend_block: Add driver to access suspend blockers from user-space
Date: Thu, 22 Apr 2010 18:08:51 -0700 [thread overview]
Message-ID: <1271984938-13920-3-git-send-email-arve@android.com> (raw)
In-Reply-To: <1271984938-13920-2-git-send-email-arve@android.com>
Add a misc device, "suspend_blocker", that allows user-space processes
to block auto suspend. The device has ioctls to create a suspend_blocker,
and to block and unblock suspend. To delete the suspend_blocker, close
the device.
Signed-off-by: Arve Hjønnevåg <arve@android.com>
---
Documentation/power/suspend-blockers.txt | 17 ++++
include/linux/suspend_block_dev.h | 25 ++++++
kernel/power/Kconfig | 9 ++
kernel/power/Makefile | 1 +
kernel/power/user_suspend_blocker.c | 128 ++++++++++++++++++++++++++++++
5 files changed, 180 insertions(+), 0 deletions(-)
create mode 100644 include/linux/suspend_block_dev.h
create mode 100644 kernel/power/user_suspend_blocker.c
diff --git a/Documentation/power/suspend-blockers.txt b/Documentation/power/suspend-blockers.txt
index 1c48514..877bd8c 100644
--- a/Documentation/power/suspend-blockers.txt
+++ b/Documentation/power/suspend-blockers.txt
@@ -95,3 +95,20 @@ if (list_empty(&state->pending_work))
else
suspend_block(&state->suspend_blocker);
+User-space API
+==============
+
+To create a suspend_blocker from user-space, open the suspend_blocker device:
+ fd = open("/dev/suspend_blocker", O_RDWR | O_CLOEXEC);
+then call:
+ ioctl(fd, SUSPEND_BLOCKER_IOCTL_INIT(strlen(name)), name);
+
+To activate a suspend_blocker call:
+ ioctl(fd, SUSPEND_BLOCKER_IOCTL_BLOCK);
+
+To unblock call:
+ ioctl(fd, SUSPEND_BLOCKER_IOCTL_UNBLOCK);
+
+To destroy the suspend_blocker, close the device:
+ close(fd);
+
diff --git a/include/linux/suspend_block_dev.h b/include/linux/suspend_block_dev.h
new file mode 100644
index 0000000..24bc5c7
--- /dev/null
+++ b/include/linux/suspend_block_dev.h
@@ -0,0 +1,25 @@
+/* include/linux/suspend_block_dev.h
+ *
+ * Copyright (C) 2009 Google, Inc.
+ *
+ * This software is licensed under the terms of the GNU General Public
+ * License version 2, as published by the Free Software Foundation, and
+ * may be copied, distributed, and modified under those terms.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ */
+
+#ifndef _LINUX_SUSPEND_BLOCK_DEV_H
+#define _LINUX_SUSPEND_BLOCK_DEV_H
+
+#include <linux/ioctl.h>
+
+#define SUSPEND_BLOCKER_IOCTL_INIT(len) _IOC(_IOC_WRITE, 's', 0, len)
+#define SUSPEND_BLOCKER_IOCTL_BLOCK _IO('s', 1)
+#define SUSPEND_BLOCKER_IOCTL_UNBLOCK _IO('s', 2)
+
+#endif
diff --git a/kernel/power/Kconfig b/kernel/power/Kconfig
index f8fa246..1ac50ee 100644
--- a/kernel/power/Kconfig
+++ b/kernel/power/Kconfig
@@ -141,6 +141,15 @@ config SUSPEND_BLOCKERS
state through /sys/power/state, the requested sleep state will be
entered when no suspend blockers are active.
+config USER_SUSPEND_BLOCKERS
+ bool "Userspace suspend blockers"
+ depends on SUSPEND_BLOCKERS
+ default y
+ ---help---
+ User-space suspend block api. Creates a misc device with ioctls
+ to create, block and unblock a suspend_blocker. The suspend_blocker
+ will be deleted when the device is closed.
+
config HIBERNATION_NVS
bool
diff --git a/kernel/power/Makefile b/kernel/power/Makefile
index f570801..80086c6 100644
--- a/kernel/power/Makefile
+++ b/kernel/power/Makefile
@@ -8,6 +8,7 @@ obj-$(CONFIG_PM_SLEEP) += console.o
obj-$(CONFIG_FREEZER) += process.o
obj-$(CONFIG_SUSPEND) += suspend.o
obj-$(CONFIG_SUSPEND_BLOCKERS) += suspend_blocker.o
+obj-$(CONFIG_USER_SUSPEND_BLOCKERS) += user_suspend_blocker.o
obj-$(CONFIG_PM_TEST_SUSPEND) += suspend_test.o
obj-$(CONFIG_HIBERNATION) += hibernate.o snapshot.o swap.o user.o
obj-$(CONFIG_HIBERNATION_NVS) += hibernate_nvs.o
diff --git a/kernel/power/user_suspend_blocker.c b/kernel/power/user_suspend_blocker.c
new file mode 100644
index 0000000..a9be6f4
--- /dev/null
+++ b/kernel/power/user_suspend_blocker.c
@@ -0,0 +1,128 @@
+/* kernel/power/user_suspend_block.c
+ *
+ * Copyright (C) 2009-2010 Google, Inc.
+ *
+ * This software is licensed under the terms of the GNU General Public
+ * License version 2, as published by the Free Software Foundation, and
+ * may be copied, distributed, and modified under those terms.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ */
+
+#include <linux/fs.h>
+#include <linux/miscdevice.h>
+#include <linux/module.h>
+#include <linux/uaccess.h>
+#include <linux/slab.h>
+#include <linux/suspend_blocker.h>
+#include <linux/suspend_block_dev.h>
+
+enum {
+ DEBUG_FAILURE = BIT(0),
+};
+static int debug_mask = DEBUG_FAILURE;
+module_param_named(debug_mask, debug_mask, int, S_IRUGO | S_IWUSR | S_IWGRP);
+
+static DEFINE_MUTEX(ioctl_lock);
+
+struct user_suspend_blocker {
+ struct suspend_blocker blocker;
+ char name[0];
+};
+
+static int create_user_suspend_blocker(struct file *file, void __user *name,
+ size_t name_len)
+{
+ struct user_suspend_blocker *bl;
+ if (file->private_data)
+ return -EBUSY;
+ if (name_len > NAME_MAX)
+ return -ENAMETOOLONG;
+ bl = kzalloc(sizeof(*bl) + name_len + 1, GFP_KERNEL);
+ if (!bl)
+ return -ENOMEM;
+ if (copy_from_user(bl->name, name, name_len))
+ goto err_fault;
+ suspend_blocker_init(&bl->blocker, bl->name);
+ file->private_data = bl;
+ return 0;
+
+err_fault:
+ kfree(bl);
+ return -EFAULT;
+}
+
+static long user_suspend_blocker_ioctl(struct file *file, unsigned int cmd,
+ unsigned long _arg)
+{
+ void __user *arg = (void __user *)_arg;
+ struct user_suspend_blocker *bl;
+ long ret;
+
+ mutex_lock(&ioctl_lock);
+ if ((cmd & ~IOCSIZE_MASK) == SUSPEND_BLOCKER_IOCTL_INIT(0)) {
+ ret = create_user_suspend_blocker(file, arg, _IOC_SIZE(cmd));
+ goto done;
+ }
+ bl = file->private_data;
+ if (!bl) {
+ ret = -ENOENT;
+ goto done;
+ }
+ switch (cmd) {
+ case SUSPEND_BLOCKER_IOCTL_BLOCK:
+ suspend_block(&bl->blocker);
+ ret = 0;
+ break;
+ case SUSPEND_BLOCKER_IOCTL_UNBLOCK:
+ suspend_unblock(&bl->blocker);
+ ret = 0;
+ break;
+ default:
+ ret = -ENOTSUPP;
+ }
+done:
+ if (ret && debug_mask & DEBUG_FAILURE)
+ pr_err("user_suspend_blocker_ioctl: cmd %x failed, %ld\n",
+ cmd, ret);
+ mutex_unlock(&ioctl_lock);
+ return ret;
+}
+
+static int user_suspend_blocker_release(struct inode *inode, struct file *file)
+{
+ struct user_suspend_blocker *bl = file->private_data;
+ if (!bl)
+ return 0;
+ suspend_blocker_destroy(&bl->blocker);
+ kfree(bl);
+ return 0;
+}
+
+const struct file_operations user_suspend_blocker_fops = {
+ .release = user_suspend_blocker_release,
+ .unlocked_ioctl = user_suspend_blocker_ioctl,
+};
+
+struct miscdevice user_suspend_blocker_device = {
+ .minor = MISC_DYNAMIC_MINOR,
+ .name = "suspend_blocker",
+ .fops = &user_suspend_blocker_fops,
+};
+
+static int __init user_suspend_blocker_init(void)
+{
+ return misc_register(&user_suspend_blocker_device);
+}
+
+static void __exit user_suspend_blocker_exit(void)
+{
+ misc_deregister(&user_suspend_blocker_device);
+}
+
+module_init(user_suspend_blocker_init);
+module_exit(user_suspend_blocker_exit);
--
1.6.5.1
_______________________________________________
linux-pm mailing list
linux-pm@lists.linux-foundation.org
https://lists.linux-foundation.org/mailman/listinfo/linux-pm
next prev parent reply other threads:[~2010-04-23 1:08 UTC|newest]
Thread overview: 65+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <1271984938-13920-1-git-send-email-arve@android.com>
2010-04-23 1:08 ` [PATCH 1/9] PM: Add suspend block api Arve Hjønnevåg
2010-04-23 4:39 ` [PATCH 0/9] Suspend block api (version 4) Greg KH
[not found] ` <1271984938-13920-2-git-send-email-arve@android.com>
2010-04-23 1:08 ` Arve Hjønnevåg [this message]
2010-04-23 1:08 ` [PATCH 3/9] PM: suspend_block: Abort task freezing if a suspend_blocker is active Arve Hjønnevåg
[not found] ` <1271984938-13920-4-git-send-email-arve@android.com>
2010-04-23 1:08 ` [PATCH 4/9] PM: suspend_block: Switch to list of active and inactive suspend blockers Arve Hjønnevåg
[not found] ` <1271984938-13920-5-git-send-email-arve@android.com>
2010-04-23 1:08 ` [PATCH 5/9] PM: suspend_block: Add debugfs file Arve Hjønnevåg
2010-04-23 1:08 ` [PATCH 6/9] PM: suspend_block: Add suspend_blocker stats Arve Hjønnevåg
2010-04-23 1:08 ` [PATCH 7/9] PM: Add suspend blocking work Arve Hjønnevåg
[not found] ` <1271984938-13920-8-git-send-email-arve@android.com>
2010-04-23 1:08 ` [PATCH 8/9] Input: Block suspend while event queue is not empty Arve Hjønnevåg
[not found] ` <1271984938-13920-9-git-send-email-arve@android.com>
2010-04-23 1:08 ` [PATCH 9/9] power_supply: Block suspend while power supply change notifications are pending Arve Hjønnevåg
2010-04-23 20:56 ` [PATCH 8/9] Input: Block suspend while event queue is not empty Randy Dunlap
[not found] ` <20100423135625.1e12d005.randy.dunlap@oracle.com>
2010-04-23 21:08 ` Dmitry Torokhov
2010-04-24 4:58 ` Arve Hjønnevåg
[not found] ` <201004231408.15885.dmitry.torokhov@gmail.com>
2010-04-24 5:02 ` Arve Hjønnevåg
2010-04-23 8:16 ` [PATCH 7/9] PM: Add suspend blocking work Tejun Heo
[not found] ` <4BD1576E.5070401@kernel.org>
2010-04-23 12:20 ` Oleg Nesterov
[not found] ` <20100423122032.GA23544@redhat.com>
2010-04-23 22:49 ` Arve Hjønnevåg
[not found] ` <y2ud6200be21004231549q8e52c9c0z441d82b5a15e177d@mail.gmail.com>
2010-04-24 5:21 ` Arve Hjønnevåg
2010-04-24 6:33 ` Tejun Heo
[not found] ` <4BD290CC.4080601@kernel.org>
2010-04-24 7:21 ` Arve Hjønnevåg
[not found] ` <r2zd6200be21004240021sfaec0f3ft8a1ea7c1b12ea52a@mail.gmail.com>
2010-04-24 7:43 ` Tejun Heo
2010-04-26 14:06 ` Oleg Nesterov
2010-04-23 20:58 ` [PATCH 5/9] PM: suspend_block: Add debugfs file Randy Dunlap
[not found] ` <20100423135853.478af057.randy.dunlap@oracle.com>
2010-04-24 3:23 ` Arve Hjønnevåg
[not found] ` <n2rd6200be21004232023hf138c65dia5b378825124933d@mail.gmail.com>
2010-04-24 4:24 ` Randy Dunlap
2010-04-24 4:54 ` Arve Hjønnevåg
2010-04-25 18:15 ` Greg KH
[not found] ` <20100425181517.GA22676@kroah.com>
2010-04-25 19:53 ` Randy Dunlap
[not found] ` <4BD49D9D.7020004@oracle.com>
2010-04-26 0:00 ` tytso
[not found] ` <20100426000025.GE667@thunk.org>
2010-04-26 0:23 ` Randy Dunlap
[not found] ` <4BD4DCEA.8060602@oracle.com>
2010-04-26 0:45 ` tytso
[not found] ` <20100426004558.GA13043@thunk.org>
2010-04-26 0:50 ` Randy Dunlap
2010-04-26 1:39 ` Alan Stern
2010-04-26 6:24 ` Brian Swetland
[not found] ` <p2xa55d774e1004252324i4dca8cc3y1ffacec838c436f8@mail.gmail.com>
2010-04-26 13:28 ` Randy Dunlap
2010-04-23 2:25 ` [PATCH 2/9] PM: suspend_block: Add driver to access suspend blockers from user-space Matt Helsley
[not found] ` <20100423022522.GB32490@count0.beaverton.ibm.com>
2010-04-23 3:54 ` Arve Hjønnevåg
2010-04-23 4:38 ` Greg KH
2010-04-23 8:43 ` Pavel Machek
[not found] ` <20100423084349.GC1573@ucw.cz>
2010-04-23 16:43 ` Alan Stern
2010-04-24 1:53 ` tytso
[not found] ` <Pine.LNX.4.44L0.1004231242460.1777-100000@iolanthe.rowland.org>
2010-04-24 3:20 ` Arve Hjønnevåg
[not found] ` <i2zd6200be21004232020t46f4de0ct93b94e2bd67a6e76@mail.gmail.com>
2010-04-24 5:55 ` Pavel Machek
[not found] ` <20100424015334.GO14986@thunk.org>
2010-04-24 5:39 ` Pavel Machek
2010-04-23 16:33 ` [PATCH 1/9] PM: Add suspend block api Alan Stern
[not found] ` <Pine.LNX.4.44L0.1004231204450.1777-100000@iolanthe.rowland.org>
2010-04-23 16:45 ` Alan Stern
2010-04-24 2:15 ` Arve Hjønnevåg
[not found] <Pine.LNX.4.44L0.1004271432280.1850-100000@iolanthe.rowland.org>
2010-04-27 22:03 ` [PATCH 2/9] PM: suspend_block: Add driver to access suspend blockers from user-space Rafael J. Wysocki
[not found] ` <201004280003.31668.rjw@sisk.pl>
2010-04-27 23:22 ` Arve Hjønnevåg
[not found] <y2nd6200be21004262104mb81ba7d6xe5c8f35689ca20a0@mail.gmail.com>
2010-04-27 18:33 ` Alan Stern
[not found] <v2ld6200be21004251534y6c820e96l824f3288201a757d@mail.gmail.com>
2010-04-26 19:25 ` Alan Stern
[not found] ` <Pine.LNX.4.44L0.1004261518130.1764-100000@iolanthe.rowland.org>
2010-04-27 4:04 ` Arve Hjønnevåg
[not found] <20100424055523.GC2290@elf.ucw.cz>
2010-04-24 14:44 ` Alan Stern
[not found] ` <Pine.LNX.4.44L0.1004241037230.6848-100000@netrider.rowland.org>
2010-04-25 22:34 ` Arve Hjønnevåg
2009-05-06 4:18 [RFC][PATCH 0/9] Suspend block api (version 3) Arve Hjønnevåg
2009-05-06 4:18 ` [PATCH 1/9] PM: Add suspend block api Arve Hjønnevåg
2009-05-06 4:18 ` [PATCH 2/9] PM: suspend_block: Add driver to access suspend blockers from user-space Arve Hjønnevåg
2009-05-05 20:12 ` Pavel Machek
2009-05-07 1:42 ` Arve Hjønnevåg
2009-05-07 10:32 ` Pavel Machek
2009-05-08 0:43 ` Arve Hjønnevåg
2009-05-08 14:22 ` Rafael J. Wysocki
2009-05-09 0:38 ` Arve Hjønnevåg
2009-05-05 20:16 ` Pavel Machek
2009-05-07 1:31 ` Arve Hjønnevåg
2009-05-07 10:43 ` Pavel Machek
-- strict thread matches above, loose matches on Subject: below --
2009-04-30 3:09 [RFC][PATCH 0/9] Suspend block api (version 2) Arve Hjønnevåg
2009-04-30 3:10 ` [PATCH 1/9] PM: Add suspend block api Arve Hjønnevåg
2009-04-30 3:10 ` [PATCH 2/9] PM: suspend_block: Add driver to access suspend blockers from user-space Arve Hjønnevåg
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1271984938-13920-3-git-send-email-arve@android.com \
--to=arve@android.com \
--cc=damm@igel.co.jp \
--cc=jbarnes@virtuousgeek.org \
--cc=len.brown@intel.com \
--cc=linux-doc@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pm@lists.linux-foundation.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox