Commit 0f9548ca authored by Mandeep Singh Baines's avatar Mandeep Singh Baines Committed by Rafael J. Wysocki

lockdep: check that no locks held at freeze time

We shouldn't try_to_freeze if locks are held.  Holding a lock can cause a
deadlock if the lock is later acquired in the suspend or hibernate path
(e.g.  by dpm).  Holding a lock can also cause a deadlock in the case of
cgroup_freezer if a lock is held inside a frozen cgroup that is later
acquired by a process outside that group.

History:
This patch was originally applied as 6aa97070 and reverted in
dbf520a9 because NFS was freezing with locks held.  It was
deemed better to keep the bad freeze point in NFS to allow laptops
to suspend consistently.  The previous patch in this series converts
NFS to call _unsafe versions of the freezable helpers so that
lockdep doesn't complain about them until a more correct fix
can be applied.

[akpm@linux-foundation.org: export debug_check_no_locks_held]
Signed-off-by: default avatarMandeep Singh Baines <msb@chromium.org>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
Acked-by: default avatarPavel Machek <pavel@ucw.cz>
Acked-by: default avatarTejun Heo <tj@kernel.org>
Signed-off-by: default avatarColin Cross <ccross@android.com>
Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
parent 1b1d2fb4
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
#ifndef FREEZER_H_INCLUDED #ifndef FREEZER_H_INCLUDED
#define FREEZER_H_INCLUDED #define FREEZER_H_INCLUDED
#include <linux/debug_locks.h>
#include <linux/sched.h> #include <linux/sched.h>
#include <linux/wait.h> #include <linux/wait.h>
#include <linux/atomic.h> #include <linux/atomic.h>
...@@ -60,6 +61,8 @@ static inline bool try_to_freeze_unsafe(void) ...@@ -60,6 +61,8 @@ static inline bool try_to_freeze_unsafe(void)
static inline bool try_to_freeze(void) static inline bool try_to_freeze(void)
{ {
if (!(current->flags & PF_NOFREEZE))
debug_check_no_locks_held();
return try_to_freeze_unsafe(); return try_to_freeze_unsafe();
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment