cregit-Linux how code gets into the kernel

Release 4.7 include/linux/freezer.h

Directory: include/linux
/* Freezer declarations */

#ifndef FREEZER_H_INCLUDED

#define FREEZER_H_INCLUDED

#include <linux/debug_locks.h>
#include <linux/sched.h>
#include <linux/wait.h>
#include <linux/atomic.h>

#ifdef CONFIG_FREEZER
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 */

/*
 * Timeout for stopping processes
 */
extern unsigned int freeze_timeout_msecs;

/*
 * Check if a process has been frozen
 */

static inline bool frozen(struct task_struct *p) { return p->flags & PF_FROZEN; }

Contributors

PersonTokensPropCommitsCommitProp
nigel cunninghamnigel cunningham1894.74%150.00%
tejun heotejun heo15.26%150.00%
Total19100.00%2100.00%

extern bool freezing_slow_path(struct task_struct *p); /* * Check if there is a request to freeze a process */
static inline bool freezing(struct task_struct *p) { if (likely(!atomic_read(&system_freezing_cnt))) return false; return freezing_slow_path(p); }

Contributors

PersonTokensPropCommitsCommitProp
tejun heotejun heo1854.55%133.33%
nigel cunninghamnigel cunningham1133.33%133.33%
rafael j. wysockirafael j. wysocki412.12%133.33%
Total33100.00%3100.00%

/* Takes and releases task alloc lock using task_lock() */ extern void __thaw_task(struct task_struct *t); extern bool __refrigerator(bool check_kthr_stop); extern int freeze_processes(void); extern int freeze_kernel_threads(void); extern void thaw_processes(void); extern void thaw_kernel_threads(void); /* * DO NOT ADD ANY NEW CALLERS OF THIS FUNCTION * If try_to_freeze causes a lockdep warning it means the caller may deadlock */
static inline bool try_to_freeze_unsafe(void) { might_sleep(); if (likely(!freezing(current))) return false; return __refrigerator(false); }

Contributors

PersonTokensPropCommitsCommitProp
nigel cunninghamnigel cunningham1856.25%125.00%
tejun heotejun heo1340.62%250.00%
colin crosscolin cross13.12%125.00%
Total32100.00%4100.00%


static inline bool try_to_freeze(void) { if (!(current->flags & PF_NOFREEZE)) debug_check_no_locks_held(); return try_to_freeze_unsafe(); }

Contributors

PersonTokensPropCommitsCommitProp
mandeep singh bainesmandeep singh baines1451.85%150.00%
colin crosscolin cross1348.15%150.00%
Total27100.00%2100.00%

extern bool freeze_task(struct task_struct *p); extern bool set_freezable(void); #ifdef CONFIG_CGROUP_FREEZER extern bool cgroup_freezing(struct task_struct *task); #else /* !CONFIG_CGROUP_FREEZER */
static inline bool cgroup_freezing(struct task_struct *task) { return false; }

Contributors

PersonTokensPropCommitsCommitProp
matt helsleymatt helsley1280.00%150.00%
tejun heotejun heo320.00%150.00%
Total15100.00%2100.00%

#endif /* !CONFIG_CGROUP_FREEZER */ /* * 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 * 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. */ /** * freezer_do_not_count - tell freezer to ignore %current * * Tell freezers to ignore the current task when determining whether the * target frozen state is reached. IOW, the current task will be * considered frozen enough by freezers. * * The caller shouldn't do anything which isn't allowed for a frozen task * until freezer_cont() is called. Usually, freezer[_do_not]_count() pair * wrap a scheduling operation and nothing much else. */
static inline void freezer_do_not_count(void) { current->flags |= PF_FREEZER_SKIP; }

Contributors

PersonTokensPropCommitsCommitProp
rafael j. wysockirafael j. wysocki15100.00%1100.00%
Total15100.00%1100.00%

/** * freezer_count - tell freezer to stop ignoring %current * * Undo freezer_do_not_count(). It tells freezers that %current should be * considered again and tries to freeze if freezing condition is already in * effect. */
static inline void freezer_count(void) { current->flags &= ~PF_FREEZER_SKIP; /* * If freezing is in progress, the following paired with smp_mb() * in freezer_should_skip() ensures that either we see %true * freezing() or freezer_should_skip() sees !PF_FREEZER_SKIP. */ smp_mb(); try_to_freeze(); }

Contributors

PersonTokensPropCommitsCommitProp
rafael j. wysockirafael j. wysocki1773.91%133.33%
tejun heotejun heo417.39%133.33%
nigel cunninghamnigel cunningham28.70%133.33%
Total23100.00%3100.00%

/* DO NOT ADD ANY NEW CALLERS OF THIS FUNCTION */
static inline void freezer_count_unsafe(void) { current->flags &= ~PF_FREEZER_SKIP; smp_mb(); try_to_freeze_unsafe(); }

Contributors

PersonTokensPropCommitsCommitProp
colin crosscolin cross22100.00%1100.00%
Total22100.00%1100.00%

/** * freezer_should_skip - whether to skip a task when determining frozen * state is reached * @p: task in quesion * * This function is used by freezers after establishing %true freezing() to * test whether a task should be skipped when determining the target frozen * state is reached. IOW, if this function returns %true, @p is considered * frozen enough. */
static inline bool freezer_should_skip(struct task_struct *p) { /* * The following smp_mb() paired with the one in freezer_count() * ensures that either freezer_count() sees %true freezing() or we * see cleared %PF_FREEZER_SKIP and return %false. This makes it * impossible for a task to slip frozen state testing after * clearing %PF_FREEZER_SKIP. */ smp_mb(); return p->flags & PF_FREEZER_SKIP; }

Contributors

PersonTokensPropCommitsCommitProp
rafael j. wysockirafael j. wysocki1773.91%133.33%
tejun heotejun heo521.74%133.33%
nigel cunninghamnigel cunningham14.35%133.33%
Total23100.00%3100.00%

/* * These functions are intended to be used whenever you want allow a sleeping * task 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. */
static inline void freezable_schedule(void) { freezer_do_not_count(); schedule(); freezer_count(); }

Contributors

PersonTokensPropCommitsCommitProp
colin crosscolin cross1794.44%150.00%
jeff laytonjeff layton15.56%150.00%
Total18100.00%2100.00%

/* DO NOT ADD ANY NEW CALLERS OF THIS FUNCTION */
static inline void freezable_schedule_unsafe(void) { freezer_do_not_count(); schedule(); freezer_count_unsafe(); }

Contributors

PersonTokensPropCommitsCommitProp
colin crosscolin cross18100.00%2100.00%
Total18100.00%2100.00%

/* * Like freezable_schedule_timeout(), but should not block the freezer. Do not * call this with locks held. */
static inline long freezable_schedule_timeout(long timeout) { long __retval; freezer_do_not_count(); __retval = schedule_timeout(timeout); freezer_count(); return __retval; }

Contributors

PersonTokensPropCommitsCommitProp
colin crosscolin cross29100.00%1100.00%
Total29100.00%1100.00%

/* * Like schedule_timeout_interruptible(), but should not block the freezer. Do not * call this with locks held. */
static inline long freezable_schedule_timeout_interruptible(long timeout) { long __retval; freezer_do_not_count(); __retval = schedule_timeout_interruptible(timeout); freezer_count(); return __retval; }

Contributors

PersonTokensPropCommitsCommitProp
colin crosscolin cross29100.00%1100.00%
Total29100.00%1100.00%

/* Like schedule_timeout_killable(), but should not block the freezer. */
static inline long freezable_schedule_timeout_killable(long timeout) { long __retval; freezer_do_not_count(); __retval = schedule_timeout_killable(timeout); freezer_count(); return __retval; }

Contributors

PersonTokensPropCommitsCommitProp
colin crosscolin cross2586.21%150.00%
jeff laytonjeff layton413.79%150.00%
Total29100.00%2100.00%

/* DO NOT ADD ANY NEW CALLERS OF THIS FUNCTION */
static inline long freezable_schedule_timeout_killable_unsafe(long timeout) { long __retval; freezer_do_not_count(); __retval = schedule_timeout_killable(timeout); freezer_count_unsafe(); return __retval; }

Contributors

PersonTokensPropCommitsCommitProp
colin crosscolin cross29100.00%2100.00%
Total29100.00%2100.00%

/* * Like schedule_hrtimeout_range(), but should not block the freezer. Do not * call this with locks held. */
static inline int freezable_schedule_hrtimeout_range(ktime_t *expires, u64 delta, const enum hrtimer_mode mode) { int __retval; freezer_do_not_count(); __retval = schedule_hrtimeout_range(expires, delta, mode); freezer_count(); return __retval; }

Contributors

PersonTokensPropCommitsCommitProp
colin crosscolin cross4197.62%150.00%
john stultzjohn stultz12.38%150.00%
Total42100.00%2100.00%

/* * Freezer-friendly wrappers around wait_event_interruptible(), * wait_event_killable() and wait_event_interruptible_timeout(), originally * defined in <linux/wait.h> */ /* DO NOT ADD ANY NEW CALLERS OF THIS FUNCTION */ #define wait_event_freezekillable_unsafe(wq, condition) \ ({ \ int __retval; \ freezer_do_not_count(); \ __retval = wait_event_killable(wq, (condition)); \ freezer_count_unsafe(); \ __retval; \ }) #else /* !CONFIG_FREEZER */
static inline bool frozen(struct task_struct *p) { return false; }

Contributors

PersonTokensPropCommitsCommitProp
nigel cunninghamnigel cunningham1386.67%150.00%
tejun heotejun heo213.33%150.00%
Total15100.00%2100.00%


static inline bool freezing(struct task_struct *p) { return false; }

Contributors

PersonTokensPropCommitsCommitProp
nigel cunninghamnigel cunningham1386.67%150.00%
tejun heotejun heo213.33%150.00%
Total15100.00%2100.00%


static inline void __thaw_task(struct task_struct *t) {}

Contributors

PersonTokensPropCommitsCommitProp
stephen rothwellstephen rothwell11100.00%1100.00%
Total11100.00%1100.00%


static inline bool __refrigerator(bool check_kthr_stop) { return false; }

Contributors

PersonTokensPropCommitsCommitProp
tejun heotejun heo969.23%266.67%
nigel cunninghamnigel cunningham430.77%133.33%
Total13100.00%3100.00%


static inline int freeze_processes(void) { return -ENOSYS; }

Contributors

PersonTokensPropCommitsCommitProp
nigel cunninghamnigel cunningham969.23%150.00%
rafael j. wysockirafael j. wysocki430.77%150.00%
Total13100.00%2100.00%


static inline int freeze_kernel_threads(void) { return -ENOSYS; }

Contributors

PersonTokensPropCommitsCommitProp
rafael j. wysockirafael j. wysocki1184.62%150.00%
nigel cunninghamnigel cunningham215.38%150.00%
Total13100.00%2100.00%


static inline void thaw_processes(void) {}

Contributors

PersonTokensPropCommitsCommitProp
nigel cunninghamnigel cunningham8100.00%1100.00%
Total8100.00%1100.00%


static inline void thaw_kernel_threads(void) {}

Contributors

PersonTokensPropCommitsCommitProp
rafael j. wysockirafael j. wysocki8100.00%1100.00%
Total8100.00%1100.00%


static inline bool try_to_freeze_nowarn(void) { return false; }

Contributors

PersonTokensPropCommitsCommitProp
li haifengli haifeng12100.00%1100.00%
Total12100.00%1100.00%


static inline bool try_to_freeze(void) { return false; }

Contributors

PersonTokensPropCommitsCommitProp
nigel cunninghamnigel cunningham1083.33%150.00%
tejun heotejun heo216.67%150.00%
Total12100.00%2100.00%


static inline void freezer_do_not_count(void) {}

Contributors

PersonTokensPropCommitsCommitProp
rafael j. wysockirafael j. wysocki8100.00%1100.00%
Total8100.00%1100.00%


static inline void freezer_count(void) {}

Contributors

PersonTokensPropCommitsCommitProp
rafael j. wysockirafael j. wysocki8100.00%1100.00%
Total8100.00%1100.00%


static inline int freezer_should_skip(struct task_struct *p) { return 0; }

Contributors

PersonTokensPropCommitsCommitProp
rafael j. wysockirafael j. wysocki15100.00%1100.00%
Total15100.00%1100.00%


static inline void set_freezable(void) {}

Contributors

PersonTokensPropCommitsCommitProp
rafael j. wysockirafael j. wysocki8100.00%2100.00%
Total8100.00%2100.00%

#define freezable_schedule() schedule() #define freezable_schedule_unsafe() schedule() #define freezable_schedule_timeout(timeout) schedule_timeout(timeout) #define freezable_schedule_timeout_interruptible(timeout) \ schedule_timeout_interruptible(timeout) #define freezable_schedule_timeout_killable(timeout) \ schedule_timeout_killable(timeout) #define freezable_schedule_timeout_killable_unsafe(timeout) \ schedule_timeout_killable(timeout) #define freezable_schedule_hrtimeout_range(expires, delta, mode) \ schedule_hrtimeout_range(expires, delta, mode) #define wait_event_freezekillable_unsafe(wq, condition) \ wait_event_killable(wq, condition) #endif /* !CONFIG_FREEZER */ #endif /* FREEZER_H_INCLUDED */

Overall Contributors

PersonTokensPropCommitsCommitProp
colin crosscolin cross29336.72%411.76%
rafael j. wysockirafael j. wysocki14718.42%823.53%
nigel cunninghamnigel cunningham13516.92%25.88%
tejun heotejun heo10112.66%926.47%
matt helsleymatt helsley506.27%25.88%
jeff laytonjeff layton212.63%25.88%
mandeep singh bainesmandeep singh baines172.13%12.94%
li haifengli haifeng121.50%12.94%
stephen rothwellstephen rothwell111.38%12.94%
li feili fei60.75%12.94%
randy dunlaprandy dunlap30.38%12.94%
john stultzjohn stultz10.13%12.94%
srivatsa s. bhatsrivatsa s. bhat10.13%12.94%
Total798100.00%34100.00%
Directory: include/linux
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.
{% endraw %}