diff options
Diffstat (limited to 'include/linux/freezer.h')
-rw-r--r-- | include/linux/freezer.h | 48 |
1 files changed, 46 insertions, 2 deletions
diff --git a/include/linux/freezer.h b/include/linux/freezer.h index db5423eae24d..c9435252e8e4 100644 --- a/include/linux/freezer.h +++ b/include/linux/freezer.h | |||
@@ -81,7 +81,49 @@ static inline int try_to_freeze(void) | |||
81 | return 0; | 81 | return 0; |
82 | } | 82 | } |
83 | 83 | ||
84 | extern void thaw_some_processes(int all); | 84 | /* |
85 | * The PF_FREEZER_SKIP flag should be set by a vfork parent right before it | ||
86 | * calls wait_for_completion(&vfork) and reset right after it returns from this | ||
87 | * function. Next, the parent should call try_to_freeze() to freeze itself | ||
88 | * appropriately in case the child has exited before the freezing of tasks is | ||
89 | * complete. However, we don't want kernel threads to be frozen in unexpected | ||
90 | * places, so we allow them to block freeze_processes() instead or to set | ||
91 | * PF_NOFREEZE if needed and PF_FREEZER_SKIP is only set for userland vfork | ||
92 | * parents. Fortunately, in the ____call_usermodehelper() case the parent won't | ||
93 | * really block freeze_processes(), since ____call_usermodehelper() (the child) | ||
94 | * does a little before exec/exit and it can't be frozen before waking up the | ||
95 | * parent. | ||
96 | */ | ||
97 | |||
98 | /* | ||
99 | * If the current task is a user space one, tell the freezer not to count it as | ||
100 | * freezable. | ||
101 | */ | ||
102 | static inline void freezer_do_not_count(void) | ||
103 | { | ||
104 | if (current->mm) | ||
105 | current->flags |= PF_FREEZER_SKIP; | ||
106 | } | ||
107 | |||
108 | /* | ||
109 | * If the current task is a user space one, tell the freezer to count it as | ||
110 | * freezable again and try to freeze it. | ||
111 | */ | ||
112 | static inline void freezer_count(void) | ||
113 | { | ||
114 | if (current->mm) { | ||
115 | current->flags &= ~PF_FREEZER_SKIP; | ||
116 | try_to_freeze(); | ||
117 | } | ||
118 | } | ||
119 | |||
120 | /* | ||
121 | * Check if the task should be counted as freezeable by the freezer | ||
122 | */ | ||
123 | static inline int freezer_should_skip(struct task_struct *p) | ||
124 | { | ||
125 | return !!(p->flags & PF_FREEZER_SKIP); | ||
126 | } | ||
85 | 127 | ||
86 | #else | 128 | #else |
87 | static inline int frozen(struct task_struct *p) { return 0; } | 129 | static inline int frozen(struct task_struct *p) { return 0; } |
@@ -96,5 +138,7 @@ static inline void thaw_processes(void) {} | |||
96 | 138 | ||
97 | static inline int try_to_freeze(void) { return 0; } | 139 | static inline int try_to_freeze(void) { return 0; } |
98 | 140 | ||
99 | 141 | static inline void freezer_do_not_count(void) {} | |
142 | static inline void freezer_count(void) {} | ||
143 | static inline int freezer_should_skip(struct task_struct *p) { return 0; } | ||
100 | #endif | 144 | #endif |