linux-pm.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/2] hibernate: add config option for snapshot device
@ 2020-05-07  7:19 Domenico Andreoli
  2020-05-07  7:19 ` [PATCH 1/2] hibernate: incorporate concurrency handling Domenico Andreoli
                   ` (2 more replies)
  0 siblings, 3 replies; 4+ messages in thread
From: Domenico Andreoli @ 2020-05-07  7:19 UTC (permalink / raw)
  To: Rafael J. Wysocki, Pavel Machek; +Cc: Linux PM

Dear maintainers,

These are the improvements over v2 [0]:

 - switch back to atomic_t API, refcount saturates when incrementing
   from zero

These are the improvements over v1 [1]:
  
 - move the mutual exclusion to hibernate.c (it was in user.c)
 - switched to refcount_t API (it was atomic_t)
 - the option is enabled by default (it was disabled by default)
 - remove the premature "DEPRECATED" marking
 - drop the redefinition of mutual exclusion helpers (in v2 they are
   owned by hibernte.c) in case the option is deselected
 - add the help message to the config option

Kind regards,
Domenico

[0] https://lore.kernel.org/linux-pm/20200501151452.621900831@gmail.com/
[1] https://lore.kernel.org/linux-pm/20200413190843.044112674@gmail.com/

-- 
rsa4096: 3B10 0CA1 8674 ACBA B4FE  FCD2 CE5B CF17 9960 DE13
ed25519: FFB4 0CC3 7F2E 091D F7DA  356E CC79 2832 ED38 CB05

^ permalink raw reply	[flat|nested] 4+ messages in thread

* [PATCH 1/2] hibernate: incorporate concurrency handling
  2020-05-07  7:19 [PATCH 0/2] hibernate: add config option for snapshot device Domenico Andreoli
@ 2020-05-07  7:19 ` Domenico Andreoli
  2020-05-07  7:19 ` [PATCH 2/2] hibernate: split snapshot dev option Domenico Andreoli
  2020-05-19 15:51 ` [PATCH 0/2] hibernate: add config option for snapshot device Rafael J. Wysocki
  2 siblings, 0 replies; 4+ messages in thread
From: Domenico Andreoli @ 2020-05-07  7:19 UTC (permalink / raw)
  To: Rafael J. Wysocki, Pavel Machek; +Cc: Linux PM, Domenico Andreoli

[-- Attachment #1: hibernate-incorporate-concurrency-handling --]
[-- Type: text/plain, Size: 4648 bytes --]

From: Domenico Andreoli <domenico.andreoli@linux.com>

Hibernation concurrency handling is currently delegated to user.c,
where it's also used for regulating the access to the snapshot device.

In the prospective of making user.c a separate configuration option,
such mutual exclusion is brought into hibernate.c and made available
through accessor helpers hereby introduced.

v3:
 - switch back to atomic_t API, refcount saturates when incrementing
   from zero
v2:
 - move the mutual exclusion to hibernate.c (it was in user.c)
 - switched to refcount_t API (it was atomic_t)

Signed-off-by: Domenico Andreoli <domenico.andreoli@linux.com>
Cc: "Rafael J. Wysocki" <rjw@rjwysocki.net>
Cc: Pavel Machek <pavel@ucw.cz>
Cc: Linux PM <linux-pm@vger.kernel.org>

---
 kernel/power/hibernate.c |   20 ++++++++++++++++----
 kernel/power/power.h     |    4 ++--
 kernel/power/user.c      |   10 ++++------
 3 files changed, 22 insertions(+), 12 deletions(-)

Index: b/kernel/power/user.c
===================================================================
--- a/kernel/power/user.c
+++ b/kernel/power/user.c
@@ -37,8 +37,6 @@ static struct snapshot_data {
 	bool free_bitmaps;
 } snapshot_state;
 
-atomic_t snapshot_device_available = ATOMIC_INIT(1);
-
 static int snapshot_open(struct inode *inode, struct file *filp)
 {
 	struct snapshot_data *data;
@@ -49,13 +47,13 @@ static int snapshot_open(struct inode *i
 
 	lock_system_sleep();
 
-	if (!atomic_add_unless(&snapshot_device_available, -1, 0)) {
+	if (!hibernate_acquire()) {
 		error = -EBUSY;
 		goto Unlock;
 	}
 
 	if ((filp->f_flags & O_ACCMODE) == O_RDWR) {
-		atomic_inc(&snapshot_device_available);
+		hibernate_release();
 		error = -ENOSYS;
 		goto Unlock;
 	}
@@ -92,7 +90,7 @@ static int snapshot_open(struct inode *i
 			__pm_notifier_call_chain(PM_POST_RESTORE, nr_calls, NULL);
 	}
 	if (error)
-		atomic_inc(&snapshot_device_available);
+		hibernate_release();
 
 	data->frozen = false;
 	data->ready = false;
@@ -122,7 +120,7 @@ static int snapshot_release(struct inode
 	}
 	pm_notifier_call_chain(data->mode == O_RDONLY ?
 			PM_POST_HIBERNATION : PM_POST_RESTORE);
-	atomic_inc(&snapshot_device_available);
+	hibernate_release();
 
 	unlock_system_sleep();
 
Index: b/kernel/power/power.h
===================================================================
--- a/kernel/power/power.h
+++ b/kernel/power/power.h
@@ -154,8 +154,8 @@ extern int snapshot_write_next(struct sn
 extern void snapshot_write_finalize(struct snapshot_handle *handle);
 extern int snapshot_image_loaded(struct snapshot_handle *handle);
 
-/* If unset, the snapshot device cannot be open. */
-extern atomic_t snapshot_device_available;
+extern bool hibernate_acquire(void);
+extern void hibernate_release(void);
 
 extern sector_t alloc_swapdev_block(int swap);
 extern void free_all_swap_pages(int swap);
Index: b/kernel/power/hibernate.c
===================================================================
--- a/kernel/power/hibernate.c
+++ b/kernel/power/hibernate.c
@@ -67,6 +67,18 @@ bool freezer_test_done;
 
 static const struct platform_hibernation_ops *hibernation_ops;
 
+static atomic_t hibernate_atomic = ATOMIC_INIT(1);
+
+bool hibernate_acquire(void)
+{
+	return atomic_add_unless(&hibernate_atomic, -1, 0);
+}
+
+void hibernate_release(void)
+{
+	atomic_inc(&hibernate_atomic);
+}
+
 bool hibernation_available(void)
 {
 	return nohibernate == 0 && !security_locked_down(LOCKDOWN_HIBERNATION);
@@ -704,7 +716,7 @@ int hibernate(void)
 
 	lock_system_sleep();
 	/* The snapshot device should not be opened while we're running */
-	if (!atomic_add_unless(&snapshot_device_available, -1, 0)) {
+	if (!hibernate_acquire()) {
 		error = -EBUSY;
 		goto Unlock;
 	}
@@ -775,7 +787,7 @@ int hibernate(void)
  Exit:
 	__pm_notifier_call_chain(PM_POST_HIBERNATION, nr_calls, NULL);
 	pm_restore_console();
-	atomic_inc(&snapshot_device_available);
+	hibernate_release();
  Unlock:
 	unlock_system_sleep();
 	pr_info("hibernation exit\n");
@@ -880,7 +892,7 @@ static int software_resume(void)
 		goto Unlock;
 
 	/* The snapshot device should not be opened while we're running */
-	if (!atomic_add_unless(&snapshot_device_available, -1, 0)) {
+	if (!hibernate_acquire()) {
 		error = -EBUSY;
 		swsusp_close(FMODE_READ);
 		goto Unlock;
@@ -911,7 +923,7 @@ static int software_resume(void)
 	__pm_notifier_call_chain(PM_POST_RESTORE, nr_calls, NULL);
 	pm_restore_console();
 	pr_info("resume failed (%d)\n", error);
-	atomic_inc(&snapshot_device_available);
+	hibernate_release();
 	/* For success case, the suspend path will release the lock */
  Unlock:
 	mutex_unlock(&system_transition_mutex);


^ permalink raw reply	[flat|nested] 4+ messages in thread

* [PATCH 2/2] hibernate: split snapshot dev option
  2020-05-07  7:19 [PATCH 0/2] hibernate: add config option for snapshot device Domenico Andreoli
  2020-05-07  7:19 ` [PATCH 1/2] hibernate: incorporate concurrency handling Domenico Andreoli
@ 2020-05-07  7:19 ` Domenico Andreoli
  2020-05-19 15:51 ` [PATCH 0/2] hibernate: add config option for snapshot device Rafael J. Wysocki
  2 siblings, 0 replies; 4+ messages in thread
From: Domenico Andreoli @ 2020-05-07  7:19 UTC (permalink / raw)
  To: Rafael J. Wysocki, Pavel Machek; +Cc: Linux PM, Domenico Andreoli

[-- Attachment #1: hibernate-split-snapshot-dev-option --]
[-- Type: text/plain, Size: 2020 bytes --]

From: Domenico Andreoli <domenico.andreoli@linux.com>

Make it possible to reduce the attack surface in case the snapshot
device is not to be used from userspace.

v2:
 - the option is enabled by default (it was disabled by default)
 - remove the premature "DEPRECATED" marking
 - drop the redefinition of mutual exclusion helpers (in v2 they are
   owned by hibernte.c) in case the option is deselected
 - add the help message to the config option

Signed-off-by: Domenico Andreoli <domenico.andreoli@linux.com>
Cc: "Rafael J. Wysocki" <rjw@rjwysocki.net>
Cc: Pavel Machek <pavel@ucw.cz>
Cc: Linux PM <linux-pm@vger.kernel.org>

---
 kernel/power/Kconfig  |   12 ++++++++++++
 kernel/power/Makefile |    3 ++-
 2 files changed, 14 insertions(+), 1 deletion(-)

Index: b/kernel/power/Kconfig
===================================================================
--- a/kernel/power/Kconfig
+++ b/kernel/power/Kconfig
@@ -80,6 +80,18 @@ config HIBERNATION
 
 	  For more information take a look at <file:Documentation/power/swsusp.rst>.
 
+config HIBERNATION_SNAPSHOT_DEV
+	bool "Userspace snapshot device"
+	depends on HIBERNATION
+	default y
+	---help---
+	  Device used by the uswsusp tools.
+
+	  Say N if no snapshotting from userspace is needed, this also
+	  reduces the attack surface of the kernel.
+
+	  If in doubt, say Y.
+
 config PM_STD_PARTITION
 	string "Default resume partition"
 	depends on HIBERNATION
Index: b/kernel/power/Makefile
===================================================================
--- a/kernel/power/Makefile
+++ b/kernel/power/Makefile
@@ -10,7 +10,8 @@ obj-$(CONFIG_VT_CONSOLE_SLEEP)	+= consol
 obj-$(CONFIG_FREEZER)		+= process.o
 obj-$(CONFIG_SUSPEND)		+= suspend.o
 obj-$(CONFIG_PM_TEST_SUSPEND)	+= suspend_test.o
-obj-$(CONFIG_HIBERNATION)	+= hibernate.o snapshot.o swap.o user.o
+obj-$(CONFIG_HIBERNATION)	+= hibernate.o snapshot.o swap.o
+obj-$(CONFIG_HIBERNATION_SNAPSHOT_DEV) += user.o
 obj-$(CONFIG_PM_AUTOSLEEP)	+= autosleep.o
 obj-$(CONFIG_PM_WAKELOCKS)	+= wakelock.o
 


^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH 0/2] hibernate: add config option for snapshot device
  2020-05-07  7:19 [PATCH 0/2] hibernate: add config option for snapshot device Domenico Andreoli
  2020-05-07  7:19 ` [PATCH 1/2] hibernate: incorporate concurrency handling Domenico Andreoli
  2020-05-07  7:19 ` [PATCH 2/2] hibernate: split snapshot dev option Domenico Andreoli
@ 2020-05-19 15:51 ` Rafael J. Wysocki
  2 siblings, 0 replies; 4+ messages in thread
From: Rafael J. Wysocki @ 2020-05-19 15:51 UTC (permalink / raw)
  To: Domenico Andreoli; +Cc: Rafael J. Wysocki, Pavel Machek, Linux PM

On Thu, May 7, 2020 at 9:24 AM Domenico Andreoli
<domenico.andreoli@linux.com> wrote:
>
> Dear maintainers,
>
> These are the improvements over v2 [0]:
>
>  - switch back to atomic_t API, refcount saturates when incrementing
>    from zero
>
> These are the improvements over v1 [1]:
>
>  - move the mutual exclusion to hibernate.c (it was in user.c)
>  - switched to refcount_t API (it was atomic_t)
>  - the option is enabled by default (it was disabled by default)
>  - remove the premature "DEPRECATED" marking
>  - drop the redefinition of mutual exclusion helpers (in v2 they are
>    owned by hibernte.c) in case the option is deselected
>  - add the help message to the config option

Both patches applied as 5.8 material with cosmetic changes in the
subjects, thanks!

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2020-05-19 15:51 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-05-07  7:19 [PATCH 0/2] hibernate: add config option for snapshot device Domenico Andreoli
2020-05-07  7:19 ` [PATCH 1/2] hibernate: incorporate concurrency handling Domenico Andreoli
2020-05-07  7:19 ` [PATCH 2/2] hibernate: split snapshot dev option Domenico Andreoli
2020-05-19 15:51 ` [PATCH 0/2] hibernate: add config option for snapshot device Rafael J. Wysocki

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).