aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux/freezer.h
diff options
context:
space:
mode:
authorTejun Heo <tj@kernel.org>2011-11-23 12:28:17 -0500
committerTejun Heo <tj@kernel.org>2011-11-23 12:28:17 -0500
commit34b087e48367c252e343c2f8de65676a78af1e4a (patch)
treefbe94bad0a3073c6f4231752fba99c6bc8702277 /include/linux/freezer.h
parentadfa543e7314b36ac55a40019977de6e47946dd7 (diff)
freezer: kill unused set_freezable_with_signal()
There's no in-kernel user of set_freezable_with_signal() left. Mixing TIF_SIGPENDING with kernel threads can lead to nasty corner cases as kernel threads never travel signal delivery path on their own. e.g. the current implementation is buggy in the cancelation path of __thaw_task(). It calls recalc_sigpending_and_wake() in an attempt to clear TIF_SIGPENDING but the function never clears it regardless of sigpending state. This means that signallable freezable kthreads may continue executing with !freezing() && stuck TIF_SIGPENDING, which can be troublesome. This patch removes set_freezable_with_signal() along with PF_FREEZER_NOSIG and recalc_sigpending*() calls in freezer. User tasks get TIF_SIGPENDING, kernel tasks get woken up and the spurious sigpending is dealt with in the usual signal delivery path. Signed-off-by: Tejun Heo <tj@kernel.org> Acked-by: Oleg Nesterov <oleg@redhat.com>
Diffstat (limited to 'include/linux/freezer.h')
-rw-r--r--include/linux/freezer.h20
1 files changed, 1 insertions, 19 deletions
diff --git a/include/linux/freezer.h b/include/linux/freezer.h
index a28842e588f4..a33550fc05c5 100644
--- a/include/linux/freezer.h
+++ b/include/linux/freezer.h
@@ -49,7 +49,7 @@ static inline bool try_to_freeze(void)
49} 49}
50 50
51extern bool freeze_task(struct task_struct *p); 51extern bool freeze_task(struct task_struct *p);
52extern bool __set_freezable(bool with_signal); 52extern bool set_freezable(void);
53 53
54#ifdef CONFIG_CGROUP_FREEZER 54#ifdef CONFIG_CGROUP_FREEZER
55extern bool cgroup_freezing(struct task_struct *task); 55extern bool cgroup_freezing(struct task_struct *task);
@@ -105,23 +105,6 @@ static inline int freezer_should_skip(struct task_struct *p)
105} 105}
106 106
107/* 107/*
108 * Tell the freezer that the current task should be frozen by it
109 */
110static inline bool set_freezable(void)
111{
112 return __set_freezable(false);
113}
114
115/*
116 * Tell the freezer that the current task should be frozen by it and that it
117 * should send a fake signal to the task to freeze it.
118 */
119static inline bool set_freezable_with_signal(void)
120{
121 return __set_freezable(true);
122}
123
124/*
125 * Freezer-friendly wrappers around wait_event_interruptible(), 108 * Freezer-friendly wrappers around wait_event_interruptible(),
126 * wait_event_killable() and wait_event_interruptible_timeout(), originally 109 * wait_event_killable() and wait_event_interruptible_timeout(), originally
127 * defined in <linux/wait.h> 110 * defined in <linux/wait.h>
@@ -176,7 +159,6 @@ static inline void freezer_do_not_count(void) {}
176static inline void freezer_count(void) {} 159static inline void freezer_count(void) {}
177static inline int freezer_should_skip(struct task_struct *p) { return 0; } 160static inline int freezer_should_skip(struct task_struct *p) { return 0; }
178static inline void set_freezable(void) {} 161static inline void set_freezable(void) {}
179static inline void set_freezable_with_signal(void) {}
180 162
181#define wait_event_freezable(wq, condition) \ 163#define wait_event_freezable(wq, condition) \
182 wait_event_interruptible(wq, condition) 164 wait_event_interruptible(wq, condition)