diff options
| author | Oleg Nesterov <[email protected]> | 2014-01-23 15:55:35 -0800 | 
|---|---|---|
| committer | Linus Torvalds <[email protected]> | 2014-01-23 16:37:01 -0800 | 
| commit | 74e37200de8e9c4e09b70c21c3f13c2071e77457 (patch) | |
| tree | de7db4aa1113562665ba7f72d92ef33be788f7b7 /fs/proc/array.c | |
| parent | 942be3875a1931c379bbc37053829dd6847e0f3f (diff) | |
proc: cleanup/simplify get_task_state/task_state_array
get_task_state() and task_state_array[] look confusing and suboptimal, it
is not clear what it can actually report to user-space and
task_state_array[] blows .data for no reason.
1. state = (tsk->state & TASK_REPORT) | tsk->exit_state is not
   clear. TASK_REPORT is self-documenting but it is not clear
   what ->exit_state can add.
   Move the potential exit_state's (EXIT_ZOMBIE and EXIT_DEAD)
   into TASK_REPORT and use it to calculate the final result.
2. With the change above it is obvious that task_state_array[]
   has the unused entries just to make BUILD_BUG_ON() happy.
   Change this BUILD_BUG_ON() to use TASK_REPORT rather than
   TASK_STATE_MAX and shrink task_state_array[].
3. Turn the "while (state)" loop into fls(state).
Signed-off-by: Oleg Nesterov <[email protected]>
Cc: Peter Zijlstra <[email protected]>
Cc: David Laight <[email protected]>
Cc: Geert Uytterhoeven <[email protected]>
Cc: Ingo Molnar <[email protected]>
Cc: Tejun Heo <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
Diffstat (limited to 'fs/proc/array.c')
| -rw-r--r-- | fs/proc/array.c | 15 | 
1 files changed, 3 insertions, 12 deletions
| diff --git a/fs/proc/array.c b/fs/proc/array.c index 1bd2077187fd..554a0b229ac2 100644 --- a/fs/proc/array.c +++ b/fs/proc/array.c @@ -140,24 +140,15 @@ static const char * const task_state_array[] = {  	"t (tracing stop)",	/*   8 */  	"Z (zombie)",		/*  16 */  	"X (dead)",		/*  32 */ -	"x (dead)",		/*  64 */ -	"K (wakekill)",		/* 128 */ -	"W (waking)",		/* 256 */ -	"P (parked)",		/* 512 */  };  static inline const char *get_task_state(struct task_struct *tsk)  { -	unsigned int state = (tsk->state & TASK_REPORT) | tsk->exit_state; -	const char * const *p = &task_state_array[0]; +	unsigned int state = (tsk->state | tsk->exit_state) & TASK_REPORT; -	BUILD_BUG_ON(1 + ilog2(TASK_STATE_MAX) != ARRAY_SIZE(task_state_array)); +	BUILD_BUG_ON(1 + ilog2(TASK_REPORT) != ARRAY_SIZE(task_state_array)-1); -	while (state) { -		p++; -		state >>= 1; -	} -	return *p; +	return task_state_array[fls(state)];  }  static inline void task_state(struct seq_file *m, struct pid_namespace *ns, |