Blame view

include/linux/freezer.h 5.69 KB
7dfb71030   Nigel Cunningham   [PATCH] Add inclu...
1
  /* Freezer declarations */
831441862   Rafael J. Wysocki   Freezer: make ker...
2
3
  #ifndef FREEZER_H_INCLUDED
  #define FREEZER_H_INCLUDED
5c543eff6   Randy Dunlap   [PATCH] freezer.h...
4
  #include <linux/sched.h>
e42837bcd   Rafael J. Wysocki   freezer: introduc...
5
  #include <linux/wait.h>
a3201227f   Tejun Heo   freezer: make fre...
6
  #include <linux/atomic.h>
5c543eff6   Randy Dunlap   [PATCH] freezer.h...
7

8174f1503   Matt Helsley   container freezer...
8
  #ifdef CONFIG_FREEZER
a3201227f   Tejun Heo   freezer: make fre...
9
10
11
  extern atomic_t system_freezing_cnt;	/* nr of freezing conds in effect */
  extern bool pm_freezing;		/* PM freezing in effect */
  extern bool pm_nosig_freezing;		/* PM nosig freezing in effect */
7dfb71030   Nigel Cunningham   [PATCH] Add inclu...
12
13
14
  /*
   * Check if a process has been frozen
   */
948246f70   Tejun Heo   freezer: remove s...
15
  static inline bool frozen(struct task_struct *p)
7dfb71030   Nigel Cunningham   [PATCH] Add inclu...
16
17
18
  {
  	return p->flags & PF_FROZEN;
  }
a3201227f   Tejun Heo   freezer: make fre...
19
  extern bool freezing_slow_path(struct task_struct *p);
7dfb71030   Nigel Cunningham   [PATCH] Add inclu...
20
21
  
  /*
a3201227f   Tejun Heo   freezer: make fre...
22
   * Check if there is a request to freeze a process
7dfb71030   Nigel Cunningham   [PATCH] Add inclu...
23
   */
a3201227f   Tejun Heo   freezer: make fre...
24
  static inline bool freezing(struct task_struct *p)
7dfb71030   Nigel Cunningham   [PATCH] Add inclu...
25
  {
a3201227f   Tejun Heo   freezer: make fre...
26
27
28
  	if (likely(!atomic_read(&system_freezing_cnt)))
  		return false;
  	return freezing_slow_path(p);
7dfb71030   Nigel Cunningham   [PATCH] Add inclu...
29
  }
dc52ddc0e   Matt Helsley   container freezer...
30
  /* Takes and releases task alloc lock using task_lock() */
a5be2d0d1   Tejun Heo   freezer: rename t...
31
  extern void __thaw_task(struct task_struct *t);
7dfb71030   Nigel Cunningham   [PATCH] Add inclu...
32

8a32c441c   Tejun Heo   freezer: implemen...
33
  extern bool __refrigerator(bool check_kthr_stop);
7dfb71030   Nigel Cunningham   [PATCH] Add inclu...
34
  extern int freeze_processes(void);
2aede851d   Rafael J. Wysocki   PM / Hibernate: F...
35
  extern int freeze_kernel_threads(void);
a9b6f562f   Rafael J. Wysocki   [PATCH] swsusp: U...
36
  extern void thaw_processes(void);
7dfb71030   Nigel Cunningham   [PATCH] Add inclu...
37

a0acae0e8   Tejun Heo   freezer: unexport...
38
  static inline bool try_to_freeze(void)
7dfb71030   Nigel Cunningham   [PATCH] Add inclu...
39
  {
a0acae0e8   Tejun Heo   freezer: unexport...
40
41
42
  	might_sleep();
  	if (likely(!freezing(current)))
  		return false;
8a32c441c   Tejun Heo   freezer: implemen...
43
  	return __refrigerator(false);
7dfb71030   Nigel Cunningham   [PATCH] Add inclu...
44
  }
ff39593ad   Nigel Cunningham   [PATCH] swsusp: t...
45

839e3407d   Tejun Heo   freezer: remove u...
46
  extern bool freeze_task(struct task_struct *p);
34b087e48   Tejun Heo   freezer: kill unu...
47
  extern bool set_freezable(void);
8174f1503   Matt Helsley   container freezer...
48

dc52ddc0e   Matt Helsley   container freezer...
49
  #ifdef CONFIG_CGROUP_FREEZER
22b4e111f   Tejun Heo   cgroup_freezer: p...
50
  extern bool cgroup_freezing(struct task_struct *task);
dc52ddc0e   Matt Helsley   container freezer...
51
  #else /* !CONFIG_CGROUP_FREEZER */
22b4e111f   Tejun Heo   cgroup_freezer: p...
52
  static inline bool cgroup_freezing(struct task_struct *task)
5a7aadfe2   Matt Helsley   Freezer: Fix bugg...
53
  {
22b4e111f   Tejun Heo   cgroup_freezer: p...
54
  	return false;
5a7aadfe2   Matt Helsley   Freezer: Fix bugg...
55
  }
dc52ddc0e   Matt Helsley   container freezer...
56
  #endif /* !CONFIG_CGROUP_FREEZER */
ba96a0c88   Rafael J. Wysocki   freezer: fix vfor...
57
58
59
60
61
62
63
  /*
   * The PF_FREEZER_SKIP flag should be set by a vfork parent right before it
   * calls wait_for_completion(&vfork) and reset right after it returns from this
   * function.  Next, the parent should call try_to_freeze() to freeze itself
   * appropriately in case the child has exited before the freezing of tasks is
   * complete.  However, we don't want kernel threads to be frozen in unexpected
   * places, so we allow them to block freeze_processes() instead or to set
467de1fc6   Srivatsa S. Bhat   PM / Freezer: Rem...
64
65
66
67
   * PF_NOFREEZE if needed. Fortunately, in the ____call_usermodehelper() case the
   * parent won't really block freeze_processes(), since ____call_usermodehelper()
   * (the child) does a little before exec/exit and it can't be frozen before
   * waking up the parent.
ba96a0c88   Rafael J. Wysocki   freezer: fix vfor...
68
   */
467de1fc6   Srivatsa S. Bhat   PM / Freezer: Rem...
69
70
  
  /* Tell the freezer not to count the current task as freezable. */
ba96a0c88   Rafael J. Wysocki   freezer: fix vfor...
71
72
  static inline void freezer_do_not_count(void)
  {
467de1fc6   Srivatsa S. Bhat   PM / Freezer: Rem...
73
  	current->flags |= PF_FREEZER_SKIP;
ba96a0c88   Rafael J. Wysocki   freezer: fix vfor...
74
75
76
  }
  
  /*
467de1fc6   Srivatsa S. Bhat   PM / Freezer: Rem...
77
78
   * Tell the freezer to count the current task as freezable again and try to
   * freeze it.
ba96a0c88   Rafael J. Wysocki   freezer: fix vfor...
79
80
81
   */
  static inline void freezer_count(void)
  {
467de1fc6   Srivatsa S. Bhat   PM / Freezer: Rem...
82
83
  	current->flags &= ~PF_FREEZER_SKIP;
  	try_to_freeze();
ba96a0c88   Rafael J. Wysocki   freezer: fix vfor...
84
85
86
  }
  
  /*
58a69cb47   Tejun Heo   workqueue, freeze...
87
   * Check if the task should be counted as freezable by the freezer
ba96a0c88   Rafael J. Wysocki   freezer: fix vfor...
88
89
90
91
92
   */
  static inline int freezer_should_skip(struct task_struct *p)
  {
  	return !!(p->flags & PF_FREEZER_SKIP);
  }
ff39593ad   Nigel Cunningham   [PATCH] swsusp: t...
93

831441862   Rafael J. Wysocki   Freezer: make ker...
94
  /*
d310310cb   Jeff Layton   Freezer / sunrpc ...
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
   * These macros are intended to be used whenever you want allow a task that's
   * sleeping in TASK_UNINTERRUPTIBLE or TASK_KILLABLE state to be frozen. Note
   * that neither return any clear indication of whether a freeze event happened
   * while in this function.
   */
  
  /* Like schedule(), but should not block the freezer. */
  #define freezable_schedule()						\
  ({									\
  	freezer_do_not_count();						\
  	schedule();							\
  	freezer_count();						\
  })
  
  /* Like schedule_timeout_killable(), but should not block the freezer. */
  #define freezable_schedule_timeout_killable(timeout)			\
  ({									\
b3b73ec0d   Jeff Layton   PM / Freezer: fix...
112
  	long __retval;							\
d310310cb   Jeff Layton   Freezer / sunrpc ...
113
  	freezer_do_not_count();						\
b3b73ec0d   Jeff Layton   PM / Freezer: fix...
114
  	__retval = schedule_timeout_killable(timeout);			\
d310310cb   Jeff Layton   Freezer / sunrpc ...
115
  	freezer_count();						\
b3b73ec0d   Jeff Layton   PM / Freezer: fix...
116
  	__retval;							\
d310310cb   Jeff Layton   Freezer / sunrpc ...
117
118
119
  })
  
  /*
f06ac72e9   Jeff Layton   cifs, freezer: ad...
120
121
122
   * Freezer-friendly wrappers around wait_event_interruptible(),
   * wait_event_killable() and wait_event_interruptible_timeout(), originally
   * defined in <linux/wait.h>
e42837bcd   Rafael J. Wysocki   freezer: introduc...
123
   */
f06ac72e9   Jeff Layton   cifs, freezer: ad...
124
125
126
  #define wait_event_freezekillable(wq, condition)			\
  ({									\
  	int __retval;							\
6f35c4abd   Oleg Nesterov   PM / Freezer: Rei...
127
128
129
  	freezer_do_not_count();						\
  	__retval = wait_event_killable(wq, (condition));		\
  	freezer_count();						\
f06ac72e9   Jeff Layton   cifs, freezer: ad...
130
131
  	__retval;							\
  })
e42837bcd   Rafael J. Wysocki   freezer: introduc...
132
133
134
  #define wait_event_freezable(wq, condition)				\
  ({									\
  	int __retval;							\
24b7ead3f   Oleg Nesterov   freezer: fix wait...
135
  	for (;;) {							\
e42837bcd   Rafael J. Wysocki   freezer: introduc...
136
137
  		__retval = wait_event_interruptible(wq, 		\
  				(condition) || freezing(current));	\
24b7ead3f   Oleg Nesterov   freezer: fix wait...
138
  		if (__retval || (condition))				\
e42837bcd   Rafael J. Wysocki   freezer: introduc...
139
  			break;						\
24b7ead3f   Oleg Nesterov   freezer: fix wait...
140
141
  		try_to_freeze();					\
  	}								\
e42837bcd   Rafael J. Wysocki   freezer: introduc...
142
143
  	__retval;							\
  })
e42837bcd   Rafael J. Wysocki   freezer: introduc...
144
145
146
  #define wait_event_freezable_timeout(wq, condition, timeout)		\
  ({									\
  	long __retval = timeout;					\
24b7ead3f   Oleg Nesterov   freezer: fix wait...
147
  	for (;;) {							\
e42837bcd   Rafael J. Wysocki   freezer: introduc...
148
149
150
  		__retval = wait_event_interruptible_timeout(wq,		\
  				(condition) || freezing(current),	\
  				__retval); 				\
24b7ead3f   Oleg Nesterov   freezer: fix wait...
151
152
153
154
  		if (__retval <= 0 || (condition))			\
  			break;						\
  		try_to_freeze();					\
  	}								\
e42837bcd   Rafael J. Wysocki   freezer: introduc...
155
156
  	__retval;							\
  })
24b7ead3f   Oleg Nesterov   freezer: fix wait...
157

8174f1503   Matt Helsley   container freezer...
158
  #else /* !CONFIG_FREEZER */
948246f70   Tejun Heo   freezer: remove s...
159
  static inline bool frozen(struct task_struct *p) { return false; }
a3201227f   Tejun Heo   freezer: make fre...
160
  static inline bool freezing(struct task_struct *p) { return false; }
62c9ea6b1   Stephen Rothwell   Freezer: fix more...
161
  static inline void __thaw_task(struct task_struct *t) {}
7dfb71030   Nigel Cunningham   [PATCH] Add inclu...
162

8a32c441c   Tejun Heo   freezer: implemen...
163
  static inline bool __refrigerator(bool check_kthr_stop) { return false; }
2aede851d   Rafael J. Wysocki   PM / Hibernate: F...
164
165
  static inline int freeze_processes(void) { return -ENOSYS; }
  static inline int freeze_kernel_threads(void) { return -ENOSYS; }
7dfb71030   Nigel Cunningham   [PATCH] Add inclu...
166
  static inline void thaw_processes(void) {}
a0acae0e8   Tejun Heo   freezer: unexport...
167
  static inline bool try_to_freeze(void) { return false; }
7dfb71030   Nigel Cunningham   [PATCH] Add inclu...
168

ba96a0c88   Rafael J. Wysocki   freezer: fix vfor...
169
170
171
  static inline void freezer_do_not_count(void) {}
  static inline void freezer_count(void) {}
  static inline int freezer_should_skip(struct task_struct *p) { return 0; }
831441862   Rafael J. Wysocki   Freezer: make ker...
172
  static inline void set_freezable(void) {}
e42837bcd   Rafael J. Wysocki   freezer: introduc...
173

d310310cb   Jeff Layton   Freezer / sunrpc ...
174
175
176
177
  #define freezable_schedule()  schedule()
  
  #define freezable_schedule_timeout_killable(timeout)			\
  	schedule_timeout_killable(timeout)
e42837bcd   Rafael J. Wysocki   freezer: introduc...
178
179
180
181
182
  #define wait_event_freezable(wq, condition)				\
  		wait_event_interruptible(wq, condition)
  
  #define wait_event_freezable_timeout(wq, condition, timeout)		\
  		wait_event_interruptible_timeout(wq, condition, timeout)
e0c8ea1a6   Steve French   Fix build break w...
183
184
  #define wait_event_freezekillable(wq, condition)		\
  		wait_event_killable(wq, condition)
8174f1503   Matt Helsley   container freezer...
185
  #endif /* !CONFIG_FREEZER */
831441862   Rafael J. Wysocki   Freezer: make ker...
186
187
  
  #endif	/* FREEZER_H_INCLUDED */