diff options
Diffstat (limited to 'include/linux/sched.h')
| -rw-r--r-- | include/linux/sched.h | 47 | 
1 files changed, 45 insertions, 2 deletions
diff --git a/include/linux/sched.h b/include/linux/sched.h index aaf71e08222..a837b20ba19 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h @@ -513,6 +513,7 @@ struct thread_group_cputimer {  	spinlock_t lock;  }; +#include <linux/rwsem.h>  struct autogroup;  /* @@ -632,6 +633,16 @@ struct signal_struct {  	unsigned audit_tty;  	struct tty_audit_buf *tty_audit_buf;  #endif +#ifdef CONFIG_CGROUPS +	/* +	 * The threadgroup_fork_lock prevents threads from forking with +	 * CLONE_THREAD while held for writing. Use this for fork-sensitive +	 * threadgroup-wide operations. It's taken for reading in fork.c in +	 * copy_process(). +	 * Currently only needed write-side by cgroups. +	 */ +	struct rw_semaphore threadgroup_fork_lock; +#endif  	int oom_adj;		/* OOM kill score adjustment (bit shift) */  	int oom_score_adj;	/* OOM kill score adjustment */ @@ -1052,6 +1063,7 @@ struct sched_domain;   */  #define WF_SYNC		0x01		/* waker goes to sleep after wakup */  #define WF_FORK		0x02		/* child wakeup after fork */ +#define WF_MIGRATED	0x04		/* internal use, task got migrated */  #define ENQUEUE_WAKEUP		1  #define ENQUEUE_HEAD		2 @@ -1535,7 +1547,7 @@ struct task_struct {  #ifdef CONFIG_TRACING  	/* state flags for use by tracers */  	unsigned long trace; -	/* bitmask of trace recursion */ +	/* bitmask and counter of trace recursion */  	unsigned long trace_recursion;  #endif /* CONFIG_TRACING */  #ifdef CONFIG_CGROUP_MEM_RES_CTLR /* memcg uses this to do batch job */ @@ -1753,7 +1765,6 @@ extern void thread_group_times(struct task_struct *p, cputime_t *ut, cputime_t *  #define PF_FROZEN	0x00010000	/* frozen for system suspend */  #define PF_FSTRANS	0x00020000	/* inside a filesystem transaction */  #define PF_KSWAPD	0x00040000	/* I am kswapd */ -#define PF_OOM_ORIGIN	0x00080000	/* Allocating much memory to others */  #define PF_LESS_THROTTLE 0x00100000	/* Throttle me less: I clean memory */  #define PF_KTHREAD	0x00200000	/* I am a kernel thread */  #define PF_RANDOMIZE	0x00400000	/* randomize virtual address space */ @@ -1831,9 +1842,16 @@ static inline void rcu_copy_process(struct task_struct *p)  #endif  #ifdef CONFIG_SMP +extern void do_set_cpus_allowed(struct task_struct *p, +			       const struct cpumask *new_mask); +  extern int set_cpus_allowed_ptr(struct task_struct *p,  				const struct cpumask *new_mask);  #else +static inline void do_set_cpus_allowed(struct task_struct *p, +				      const struct cpumask *new_mask) +{ +}  static inline int set_cpus_allowed_ptr(struct task_struct *p,  				       const struct cpumask *new_mask)  { @@ -2323,6 +2341,31 @@ static inline void unlock_task_sighand(struct task_struct *tsk,  	spin_unlock_irqrestore(&tsk->sighand->siglock, *flags);  } +/* See the declaration of threadgroup_fork_lock in signal_struct. */ +#ifdef CONFIG_CGROUPS +static inline void threadgroup_fork_read_lock(struct task_struct *tsk) +{ +	down_read(&tsk->signal->threadgroup_fork_lock); +} +static inline void threadgroup_fork_read_unlock(struct task_struct *tsk) +{ +	up_read(&tsk->signal->threadgroup_fork_lock); +} +static inline void threadgroup_fork_write_lock(struct task_struct *tsk) +{ +	down_write(&tsk->signal->threadgroup_fork_lock); +} +static inline void threadgroup_fork_write_unlock(struct task_struct *tsk) +{ +	up_write(&tsk->signal->threadgroup_fork_lock); +} +#else +static inline void threadgroup_fork_read_lock(struct task_struct *tsk) {} +static inline void threadgroup_fork_read_unlock(struct task_struct *tsk) {} +static inline void threadgroup_fork_write_lock(struct task_struct *tsk) {} +static inline void threadgroup_fork_write_unlock(struct task_struct *tsk) {} +#endif +  #ifndef __HAVE_THREAD_FUNCTIONS  #define task_thread_info(task)	((struct thread_info *)(task)->stack)  |