diff options
Diffstat (limited to 'include/linux/sched.h')
| -rw-r--r-- | include/linux/sched.h | 37 | 
1 files changed, 34 insertions, 3 deletions
| diff --git a/include/linux/sched.h b/include/linux/sched.h index 6e42ada26345..553af2923824 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h @@ -219,9 +219,10 @@ extern void proc_sched_set_task(struct task_struct *p);  #define TASK_WAKING		256  #define TASK_PARKED		512  #define TASK_NOLOAD		1024 -#define TASK_STATE_MAX		2048 +#define TASK_NEW		2048 +#define TASK_STATE_MAX		4096 -#define TASK_STATE_TO_CHAR_STR "RSDTtXZxKWPN" +#define TASK_STATE_TO_CHAR_STR "RSDTtXZxKWPNn"  extern char ___assert_task_state[1 - 2*!!(  		sizeof(TASK_STATE_TO_CHAR_STR)-1 != ilog2(TASK_STATE_MAX)+1)]; @@ -522,6 +523,7 @@ static inline int get_dumpable(struct mm_struct *mm)  #define MMF_HAS_UPROBES		19	/* has uprobes */  #define MMF_RECALC_UPROBES	20	/* MMF_HAS_UPROBES can be wrong */  #define MMF_OOM_REAPED		21	/* mm has been already reaped */ +#define MMF_OOM_NOT_REAPABLE	22	/* mm couldn't be reaped */  #define MMF_INIT_MASK		(MMF_DUMPABLE_MASK | MMF_DUMP_FILTER_MASK) @@ -1948,6 +1950,32 @@ static inline int tsk_nr_cpus_allowed(struct task_struct *p)  #define TNF_FAULT_LOCAL	0x08  #define TNF_MIGRATE_FAIL 0x10 +static inline bool in_vfork(struct task_struct *tsk) +{ +	bool ret; + +	/* +	 * need RCU to access ->real_parent if CLONE_VM was used along with +	 * CLONE_PARENT. +	 * +	 * We check real_parent->mm == tsk->mm because CLONE_VFORK does not +	 * imply CLONE_VM +	 * +	 * CLONE_VFORK can be used with CLONE_PARENT/CLONE_THREAD and thus +	 * ->real_parent is not necessarily the task doing vfork(), so in +	 * theory we can't rely on task_lock() if we want to dereference it. +	 * +	 * And in this case we can't trust the real_parent->mm == tsk->mm +	 * check, it can be false negative. But we do not care, if init or +	 * another oom-unkillable task does this it should blame itself. +	 */ +	rcu_read_lock(); +	ret = tsk->vfork_done && tsk->real_parent->mm == tsk->mm; +	rcu_read_unlock(); + +	return ret; +} +  #ifdef CONFIG_NUMA_BALANCING  extern void task_numa_fault(int last_node, int node, int pages, int flags);  extern pid_t task_numa_group_id(struct task_struct *p); @@ -2139,6 +2167,9 @@ static inline void put_task_struct(struct task_struct *t)  		__put_task_struct(t);  } +struct task_struct *task_rcu_dereference(struct task_struct **ptask); +struct task_struct *try_get_task_struct(struct task_struct **ptask); +  #ifdef CONFIG_VIRT_CPU_ACCOUNTING_GEN  extern void task_cputime(struct task_struct *t,  			 cputime_t *utime, cputime_t *stime); @@ -3007,7 +3038,7 @@ static inline int object_is_on_stack(void *obj)  	return (obj >= stack) && (obj < (stack + THREAD_SIZE));  } -extern void thread_info_cache_init(void); +extern void thread_stack_cache_init(void);  #ifdef CONFIG_DEBUG_STACK_USAGE  static inline unsigned long stack_not_used(struct task_struct *p) |