cregit-Linux how code gets into the kernel

Release 4.14 include/linux/freezer.h

Directory: include/linux
/* SPDX-License-Identifier: GPL-2.0 */
/* 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 Cunningham1894.74%150.00%
Tejun 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 Heo1854.55%133.33%
Nigel Cunningham1133.33%133.33%
Rafael 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 Cunningham1856.25%125.00%
Tejun Heo1340.62%250.00%
Colin 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 Baines1451.85%150.00%
Colin 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 Helsley1280.00%150.00%
Tejun 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. 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. Wysocki1773.91%133.33%
Tejun Heo417.39%133.33%
Nigel 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 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. Wysocki1773.91%133.33%
Tejun Heo521.74%133.33%
Nigel 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 Cross1794.44%150.00%
Jeff 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 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 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 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 Cross2586.21%150.00%
Jeff 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 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 Cross4197.62%150.00%
John 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 Cunningham1386.67%150.00%
Tejun Heo213.33%150.00%
Total15100.00%2100.00%


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

Contributors

PersonTokensPropCommitsCommitProp
Nigel Cunningham1386.67%150.00%
Tejun Heo213.33%150.00%
Total15100.00%2100.00%


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

Contributors

PersonTokensPropCommitsCommitProp
Stephen Rothwell11100.00%1100.00%
Total11100.00%1100.00%


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

Contributors

PersonTokensPropCommitsCommitProp
Tejun Heo969.23%266.67%
Nigel Cunningham430.77%133.33%
Total13100.00%3100.00%


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

Contributors

PersonTokensPropCommitsCommitProp
Nigel Cunningham969.23%150.00%
Rafael J. Wysocki430.77%150.00%
Total13100.00%2100.00%


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

Contributors

PersonTokensPropCommitsCommitProp
Rafael J. Wysocki1184.62%150.00%
Nigel Cunningham215.38%150.00%
Total13100.00%2100.00%


static inline void thaw_processes(void) {}

Contributors

PersonTokensPropCommitsCommitProp
Nigel Cunningham8100.00%1100.00%
Total8100.00%1100.00%


static inline void thaw_kernel_threads(void) {}

Contributors

PersonTokensPropCommitsCommitProp
Rafael J. Wysocki8100.00%1100.00%
Total8100.00%1100.00%


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

Contributors

PersonTokensPropCommitsCommitProp
Li Haifeng12100.00%1100.00%
Total12100.00%1100.00%


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

Contributors

PersonTokensPropCommitsCommitProp
Nigel Cunningham1083.33%150.00%
Tejun Heo216.67%150.00%
Total12100.00%2100.00%


static inline void freezer_do_not_count(void) {}

Contributors

PersonTokensPropCommitsCommitProp
Rafael J. Wysocki8100.00%1100.00%
Total8100.00%1100.00%


static inline void freezer_count(void) {}

Contributors

PersonTokensPropCommitsCommitProp
Rafael 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. Wysocki15100.00%1100.00%
Total15100.00%1100.00%


static inline void set_freezable(void) {}

Contributors

PersonTokensPropCommitsCommitProp
Rafael J. Wysocki8100.00%1100.00%
Total8100.00%1100.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 Cross29336.67%411.76%
Rafael J. Wysocki14718.40%720.59%
Nigel Cunningham13516.90%25.88%
Tejun Heo10112.64%926.47%
Matt Helsley506.26%25.88%
Jeff Layton212.63%25.88%
Mandeep Singh Baines172.13%12.94%
Li Haifeng121.50%12.94%
Stephen Rothwell111.38%12.94%
Li Fei60.75%12.94%
Randy Dunlap30.38%12.94%
Srivatsa S. Bhat10.13%12.94%
Greg Kroah-Hartman10.13%12.94%
John Stultz10.13%12.94%
Total799100.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.
Created with cregit.