xref: /openbmc/linux/include/linux/freezer.h (revision f5d39b02)
1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */
27dfb7103SNigel Cunningham /* Freezer declarations */
37dfb7103SNigel Cunningham 
483144186SRafael J. Wysocki #ifndef FREEZER_H_INCLUDED
583144186SRafael J. Wysocki #define FREEZER_H_INCLUDED
683144186SRafael J. Wysocki 
70f9548caSMandeep Singh Baines #include <linux/debug_locks.h>
85c543effSRandy Dunlap #include <linux/sched.h>
9e42837bcSRafael J. Wysocki #include <linux/wait.h>
10a3201227STejun Heo #include <linux/atomic.h>
11*f5d39b02SPeter Zijlstra #include <linux/jump_label.h>
125c543effSRandy Dunlap 
138174f150SMatt Helsley #ifdef CONFIG_FREEZER
14*f5d39b02SPeter Zijlstra DECLARE_STATIC_KEY_FALSE(freezer_active);
15*f5d39b02SPeter Zijlstra 
16a3201227STejun Heo extern bool pm_freezing;		/* PM freezing in effect */
17a3201227STejun Heo extern bool pm_nosig_freezing;		/* PM nosig freezing in effect */
18a3201227STejun Heo 
197dfb7103SNigel Cunningham /*
20957d1282SLi Fei  * Timeout for stopping processes
21957d1282SLi Fei  */
22957d1282SLi Fei extern unsigned int freeze_timeout_msecs;
23957d1282SLi Fei 
24957d1282SLi Fei /*
257dfb7103SNigel Cunningham  * Check if a process has been frozen
267dfb7103SNigel Cunningham  */
27*f5d39b02SPeter Zijlstra extern bool frozen(struct task_struct *p);
287dfb7103SNigel Cunningham 
29a3201227STejun Heo extern bool freezing_slow_path(struct task_struct *p);
30a3201227STejun Heo 
317dfb7103SNigel Cunningham /*
327dfb7103SNigel Cunningham  * Check if there is a request to freeze a process
337dfb7103SNigel Cunningham  */
freezing(struct task_struct * p)34a3201227STejun Heo static inline bool freezing(struct task_struct *p)
357dfb7103SNigel Cunningham {
36*f5d39b02SPeter Zijlstra 	if (static_branch_unlikely(&freezer_active))
37a3201227STejun Heo 		return freezing_slow_path(p);
38*f5d39b02SPeter Zijlstra 
39*f5d39b02SPeter Zijlstra 	return false;
407dfb7103SNigel Cunningham }
417dfb7103SNigel Cunningham 
42dc52ddc0SMatt Helsley /* Takes and releases task alloc lock using task_lock() */
43a5be2d0dSTejun Heo extern void __thaw_task(struct task_struct *t);
447dfb7103SNigel Cunningham 
458a32c441STejun Heo extern bool __refrigerator(bool check_kthr_stop);
467dfb7103SNigel Cunningham extern int freeze_processes(void);
472aede851SRafael J. Wysocki extern int freeze_kernel_threads(void);
48a9b6f562SRafael J. Wysocki extern void thaw_processes(void);
49181e9bdeSRafael J. Wysocki extern void thaw_kernel_threads(void);
507dfb7103SNigel Cunningham 
try_to_freeze(void)51*f5d39b02SPeter Zijlstra static inline bool try_to_freeze(void)
527dfb7103SNigel Cunningham {
53a0acae0eSTejun Heo 	might_sleep();
54a0acae0eSTejun Heo 	if (likely(!freezing(current)))
55a0acae0eSTejun Heo 		return false;
560f9548caSMandeep Singh Baines 	if (!(current->flags & PF_NOFREEZE))
570f9548caSMandeep Singh Baines 		debug_check_no_locks_held();
58*f5d39b02SPeter Zijlstra 	return __refrigerator(false);
59416ad3c9SColin Cross }
60416ad3c9SColin Cross 
61839e3407STejun Heo extern bool freeze_task(struct task_struct *p);
6234b087e4STejun Heo extern bool set_freezable(void);
638174f150SMatt Helsley 
64dc52ddc0SMatt Helsley #ifdef CONFIG_CGROUP_FREEZER
6522b4e111STejun Heo extern bool cgroup_freezing(struct task_struct *task);
66dc52ddc0SMatt Helsley #else /* !CONFIG_CGROUP_FREEZER */
cgroup_freezing(struct task_struct * task)6722b4e111STejun Heo static inline bool cgroup_freezing(struct task_struct *task)
685a7aadfeSMatt Helsley {
6922b4e111STejun Heo 	return false;
705a7aadfeSMatt Helsley }
71dc52ddc0SMatt Helsley #endif /* !CONFIG_CGROUP_FREEZER */
72dc52ddc0SMatt Helsley 
738174f150SMatt Helsley #else /* !CONFIG_FREEZER */
frozen(struct task_struct * p)74948246f7STejun Heo static inline bool frozen(struct task_struct *p) { return false; }
freezing(struct task_struct * p)75a3201227STejun Heo static inline bool freezing(struct task_struct *p) { return false; }
__thaw_task(struct task_struct * t)7662c9ea6bSStephen Rothwell static inline void __thaw_task(struct task_struct *t) {}
777dfb7103SNigel Cunningham 
__refrigerator(bool check_kthr_stop)788a32c441STejun Heo static inline bool __refrigerator(bool check_kthr_stop) { return false; }
freeze_processes(void)792aede851SRafael J. Wysocki static inline int freeze_processes(void) { return -ENOSYS; }
freeze_kernel_threads(void)802aede851SRafael J. Wysocki static inline int freeze_kernel_threads(void) { return -ENOSYS; }
thaw_processes(void)817dfb7103SNigel Cunningham static inline void thaw_processes(void) {}
thaw_kernel_threads(void)82181e9bdeSRafael J. Wysocki static inline void thaw_kernel_threads(void) {}
837dfb7103SNigel Cunningham 
try_to_freeze(void)84a0acae0eSTejun Heo static inline bool try_to_freeze(void) { return false; }
857dfb7103SNigel Cunningham 
set_freezable(void)8683144186SRafael J. Wysocki static inline void set_freezable(void) {}
87e42837bcSRafael J. Wysocki 
888174f150SMatt Helsley #endif /* !CONFIG_FREEZER */
8983144186SRafael J. Wysocki 
9083144186SRafael J. Wysocki #endif	/* FREEZER_H_INCLUDED */
91