Lines Matching +full:p +full:- +full:state

1 // SPDX-License-Identifier: GPL-2.0-only
3 * kernel/freezer.c - Function to freeze a process
30 * freezing_slow_path - slow path for testing whether a task needs to be frozen
31 * @p: task to be tested
34 * and tests whether @p needs to enter and stay in frozen state. Can be
36 * target tasks see the updated state.
38 bool freezing_slow_path(struct task_struct *p) in freezing_slow_path() argument
40 if (p->flags & (PF_NOFREEZE | PF_SUSPEND_TASK)) in freezing_slow_path()
43 if (test_tsk_thread_flag(p, TIF_MEMDIE)) in freezing_slow_path()
46 if (pm_nosig_freezing || cgroup_freezing(p)) in freezing_slow_path()
49 if (pm_freezing && !(p->flags & PF_KTHREAD)) in freezing_slow_path()
56 bool frozen(struct task_struct *p) in frozen() argument
58 return READ_ONCE(p->__state) & TASK_FROZEN; in frozen()
61 /* Refrigerator is place where frozen processes are stored :-). */
64 unsigned int state = get_current_state(); in __refrigerator() local
67 pr_debug("%s entered refrigerator\n", current->comm); in __refrigerator()
69 WARN_ON_ONCE(state && !(state & TASK_NORMAL)); in __refrigerator()
74 raw_spin_lock_irq(&current->pi_lock); in __refrigerator()
75 WRITE_ONCE(current->__state, TASK_FROZEN); in __refrigerator()
77 current->saved_state = TASK_RUNNING; in __refrigerator()
78 raw_spin_unlock_irq(&current->pi_lock); in __refrigerator()
92 pr_debug("%s left refrigerator\n", current->comm); in __refrigerator()
98 static void fake_signal_wake_up(struct task_struct *p) in fake_signal_wake_up() argument
102 if (lock_task_sighand(p, &flags)) { in fake_signal_wake_up()
103 signal_wake_up(p, 0); in fake_signal_wake_up()
104 unlock_task_sighand(p, &flags); in fake_signal_wake_up()
108 static int __set_task_frozen(struct task_struct *p, void *arg) in __set_task_frozen() argument
110 unsigned int state = READ_ONCE(p->__state); in __set_task_frozen() local
114 * ttwu() fixes them up, so it is safe to swap their state now, instead in __set_task_frozen()
117 if (task_is_runnable(p)) in __set_task_frozen()
120 if (p != current && task_curr(p)) in __set_task_frozen()
123 if (!(state & (TASK_FREEZABLE | __TASK_STOPPED | __TASK_TRACED))) in __set_task_frozen()
130 if (state & TASK_FREEZABLE) in __set_task_frozen()
131 WARN_ON_ONCE(!(state & TASK_NORMAL)); in __set_task_frozen()
137 if (!(state & __TASK_FREEZABLE_UNSAFE)) in __set_task_frozen()
138 WARN_ON_ONCE(debug_locks && p->lockdep_depth); in __set_task_frozen()
141 p->saved_state = p->__state; in __set_task_frozen()
142 WRITE_ONCE(p->__state, TASK_FROZEN); in __set_task_frozen()
146 static bool __freeze_task(struct task_struct *p) in __freeze_task() argument
148 /* TASK_FREEZABLE|TASK_STOPPED|TASK_TRACED -> TASK_FROZEN */ in __freeze_task()
149 return task_call_func(p, __set_task_frozen, NULL); in __freeze_task()
153 * freeze_task - send a freeze request to given task
154 * @p: task to send the request to
156 * If @p is freezing, the freeze request is sent either by sending a fake
161 * %false, if @p is not freezing or already frozen; %true, otherwise
163 bool freeze_task(struct task_struct *p) in freeze_task() argument
168 if (!freezing(p) || frozen(p) || __freeze_task(p)) { in freeze_task()
173 if (!(p->flags & PF_KTHREAD)) in freeze_task()
174 fake_signal_wake_up(p); in freeze_task()
176 wake_up_state(p, TASK_NORMAL); in freeze_task()
185 * here. For tasks which were TASK_NORMAL | TASK_FREEZABLE, their initial state
187 * Returns 1 if the task state was restored.
189 static int __restore_freezer_state(struct task_struct *p, void *arg) in __restore_freezer_state() argument
191 unsigned int state = p->saved_state; in __restore_freezer_state() local
193 if (state != TASK_RUNNING) { in __restore_freezer_state()
194 WRITE_ONCE(p->__state, state); in __restore_freezer_state()
195 p->saved_state = TASK_RUNNING; in __restore_freezer_state()
202 void __thaw_task(struct task_struct *p) in __thaw_task() argument
207 if (WARN_ON_ONCE(freezing(p))) in __thaw_task()
210 if (!frozen(p) || task_call_func(p, __restore_freezer_state, NULL)) in __thaw_task()
213 wake_up_state(p, TASK_FROZEN); in __thaw_task()
219 * set_freezable - make %current freezable
233 current->flags &= ~PF_NOFREEZE; in set_freezable()