diff options
| author | Dmitry Torokhov <dmitry.torokhov@gmail.com> | 2010-03-01 10:55:20 +0300 | 
|---|---|---|
| committer | Dmitry Torokhov <dmitry.torokhov@gmail.com> | 2010-03-01 10:55:20 +0300 | 
| commit | 35858adbfca13678af99fb31618ef4428d6dedb0 (patch) | |
| tree | 3336feaa61324486945816cb52c347733e7c0821 /fs/proc/array.c | |
| parent | 197d4db752e67160d79fed09968c2140376a80a3 (diff) | |
| parent | 4b70858ba8d4537daf782defebe5f2ff80ccef2b (diff) | |
| download | linux-35858adbfca13678af99fb31618ef4428d6dedb0.tar.xz | |
Merge branch 'next' into for-linus
Diffstat (limited to 'fs/proc/array.c')
| -rw-r--r-- | fs/proc/array.c | 108 | 
1 files changed, 12 insertions, 96 deletions
diff --git a/fs/proc/array.c b/fs/proc/array.c index 4badde179b18..13b5d0708175 100644 --- a/fs/proc/array.c +++ b/fs/proc/array.c @@ -134,13 +134,16 @@ static inline void task_name(struct seq_file *m, struct task_struct *p)   * simple bit tests.   */  static const char *task_state_array[] = { -	"R (running)",		/*  0 */ -	"S (sleeping)",		/*  1 */ -	"D (disk sleep)",	/*  2 */ -	"T (stopped)",		/*  4 */ -	"T (tracing stop)",	/*  8 */ -	"Z (zombie)",		/* 16 */ -	"X (dead)"		/* 32 */ +	"R (running)",		/*   0 */ +	"S (sleeping)",		/*   1 */ +	"D (disk sleep)",	/*   2 */ +	"T (stopped)",		/*   4 */ +	"t (tracing stop)",	/*   8 */ +	"Z (zombie)",		/*  16 */ +	"X (dead)",		/*  32 */ +	"x (dead)",		/*  64 */ +	"K (wakekill)",		/* 128 */ +	"W (waking)",		/* 256 */  };  static inline const char *get_task_state(struct task_struct *tsk) @@ -148,6 +151,8 @@ static inline const char *get_task_state(struct task_struct *tsk)  	unsigned int state = (tsk->state & TASK_REPORT) | tsk->exit_state;  	const char **p = &task_state_array[0]; +	BUILD_BUG_ON(1 + ilog2(TASK_STATE_MAX) != ARRAY_SIZE(task_state_array)); +  	while (state) {  		p++;  		state >>= 1; @@ -322,94 +327,6 @@ static inline void task_context_switch_counts(struct seq_file *m,  			p->nivcsw);  } -#ifdef CONFIG_MMU - -struct stack_stats { -	struct vm_area_struct *vma; -	unsigned long	startpage; -	unsigned long	usage; -}; - -static int stack_usage_pte_range(pmd_t *pmd, unsigned long addr, -				unsigned long end, struct mm_walk *walk) -{ -	struct stack_stats *ss = walk->private; -	struct vm_area_struct *vma = ss->vma; -	pte_t *pte, ptent; -	spinlock_t *ptl; -	int ret = 0; - -	pte = pte_offset_map_lock(vma->vm_mm, pmd, addr, &ptl); -	for (; addr != end; pte++, addr += PAGE_SIZE) { -		ptent = *pte; - -#ifdef CONFIG_STACK_GROWSUP -		if (pte_present(ptent) || is_swap_pte(ptent)) -			ss->usage = addr - ss->startpage + PAGE_SIZE; -#else -		if (pte_present(ptent) || is_swap_pte(ptent)) { -			ss->usage = ss->startpage - addr + PAGE_SIZE; -			pte++; -			ret = 1; -			break; -		} -#endif -	} -	pte_unmap_unlock(pte - 1, ptl); -	cond_resched(); -	return ret; -} - -static inline unsigned long get_stack_usage_in_bytes(struct vm_area_struct *vma, -				struct task_struct *task) -{ -	struct stack_stats ss; -	struct mm_walk stack_walk = { -		.pmd_entry = stack_usage_pte_range, -		.mm = vma->vm_mm, -		.private = &ss, -	}; - -	if (!vma->vm_mm || is_vm_hugetlb_page(vma)) -		return 0; - -	ss.vma = vma; -	ss.startpage = task->stack_start & PAGE_MASK; -	ss.usage = 0; - -#ifdef CONFIG_STACK_GROWSUP -	walk_page_range(KSTK_ESP(task) & PAGE_MASK, vma->vm_end, -		&stack_walk); -#else -	walk_page_range(vma->vm_start, (KSTK_ESP(task) & PAGE_MASK) + PAGE_SIZE, -		&stack_walk); -#endif -	return ss.usage; -} - -static inline void task_show_stack_usage(struct seq_file *m, -						struct task_struct *task) -{ -	struct vm_area_struct	*vma; -	struct mm_struct	*mm = get_task_mm(task); - -	if (mm) { -		down_read(&mm->mmap_sem); -		vma = find_vma(mm, task->stack_start); -		if (vma) -			seq_printf(m, "Stack usage:\t%lu kB\n", -				get_stack_usage_in_bytes(vma, task) >> 10); - -		up_read(&mm->mmap_sem); -		mmput(mm); -	} -} -#else -static void task_show_stack_usage(struct seq_file *m, struct task_struct *task) -{ -} -#endif		/* CONFIG_MMU */ -  static void task_cpus_allowed(struct seq_file *m, struct task_struct *task)  {  	seq_printf(m, "Cpus_allowed:\t"); @@ -440,7 +357,6 @@ int proc_pid_status(struct seq_file *m, struct pid_namespace *ns,  	task_show_regs(m, task);  #endif  	task_context_switch_counts(m, task); -	task_show_stack_usage(m, task);  	return 0;  }  | 
