| From fb20845c8dac0d4e5e6f692f6612841231578315 Mon Sep 17 00:00:00 2001 |
| From: Thomas Gleixner <tglx@linutronix.de> |
| Date: Sun, 26 Jul 2009 18:14:57 +0200 |
| Subject: [PATCH] sched: Add TASK_RUNNING_MUTEX state |
| |
| commit 8741e8754ae91dedd89066cab3092002ba26ce32 in tip. |
| |
| Necessary for rt_mutex wakeups to preserve the state. |
| |
| Signed-off-by: Thomas Gleixner <tglx@linutronix.de> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/fs/proc/array.c b/fs/proc/array.c |
| index 13b5d07..90dac9b 100644 |
| --- a/fs/proc/array.c |
| +++ b/fs/proc/array.c |
| @@ -135,12 +135,13 @@ static inline void task_name(struct seq_file *m, struct task_struct *p) |
| */ |
| 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 */ |
| + "M (running-mutex)", /* 1 */ |
| + "S (sleeping)", /* 2 */ |
| + "D (disk sleep)", /* 4 */ |
| + "T (stopped)", /* 8 */ |
| + "T (tracing stop)", /* 16 */ |
| + "Z (zombie)", /* 32 */ |
| + "X (dead)", /* 64 */ |
| "x (dead)", /* 64 */ |
| "K (wakekill)", /* 128 */ |
| "W (waking)", /* 256 */ |
| @@ -337,6 +338,18 @@ static void task_cpus_allowed(struct seq_file *m, struct task_struct *task) |
| seq_printf(m, "\n"); |
| } |
| |
| +#define get_blocked_on(t) (-1) |
| + |
| +static inline void show_blocked_on(struct seq_file *m, struct task_struct *p) |
| +{ |
| + pid_t pid = get_blocked_on(p); |
| + |
| + if (pid < 0) |
| + return; |
| + |
| + seq_printf(m, "BlckOn: %d\n", pid); |
| +} |
| + |
| int proc_pid_status(struct seq_file *m, struct pid_namespace *ns, |
| struct pid *pid, struct task_struct *task) |
| { |
| @@ -357,6 +370,7 @@ int proc_pid_status(struct seq_file *m, struct pid_namespace *ns, |
| task_show_regs(m, task); |
| #endif |
| task_context_switch_counts(m, task); |
| + show_blocked_on(m, task); |
| return 0; |
| } |
| |
| diff --git a/include/linux/sched.h b/include/linux/sched.h |
| index ae42b44..bdd186d 100644 |
| --- a/include/linux/sched.h |
| +++ b/include/linux/sched.h |
| @@ -187,20 +187,21 @@ print_cfs_rq(struct seq_file *m, int cpu, struct cfs_rq *cfs_rq) |
| * mistake. |
| */ |
| #define TASK_RUNNING 0 |
| -#define TASK_INTERRUPTIBLE 1 |
| -#define TASK_UNINTERRUPTIBLE 2 |
| -#define __TASK_STOPPED 4 |
| -#define __TASK_TRACED 8 |
| +#define TASK_RUNNING_MUTEX 1 |
| +#define TASK_INTERRUPTIBLE 2 |
| +#define TASK_UNINTERRUPTIBLE 4 |
| +#define __TASK_STOPPED 8 |
| +#define __TASK_TRACED 16 |
| /* in tsk->exit_state */ |
| -#define EXIT_ZOMBIE 16 |
| -#define EXIT_DEAD 32 |
| +#define EXIT_ZOMBIE 32 |
| +#define EXIT_DEAD 64 |
| /* in tsk->state again */ |
| -#define TASK_DEAD 64 |
| -#define TASK_WAKEKILL 128 |
| +#define TASK_DEAD 128 |
| +#define TASK_WAKEKILL 256 |
| #define TASK_WAKING 256 |
| #define TASK_STATE_MAX 512 |
| |
| -#define TASK_STATE_TO_CHAR_STR "RSDTtZXxKW" |
| +#define TASK_STATE_TO_CHAR_STR "RMSDTtZXxKW" |
| |
| extern char ___assert_task_state[1 - 2*!!( |
| sizeof(TASK_STATE_TO_CHAR_STR)-1 != ilog2(TASK_STATE_MAX)+1)]; |
| @@ -212,10 +213,12 @@ extern char ___assert_task_state[1 - 2*!!( |
| |
| /* Convenience macros for the sake of wake_up */ |
| #define TASK_NORMAL (TASK_INTERRUPTIBLE | TASK_UNINTERRUPTIBLE) |
| -#define TASK_ALL (TASK_NORMAL | __TASK_STOPPED | __TASK_TRACED) |
| +#define TASK_ALL (TASK_NORMAL | __TASK_STOPPED | __TASK_TRACED | \ |
| + TASK_RUNNING_MUTEX) |
| |
| /* get_task_state() */ |
| -#define TASK_REPORT (TASK_RUNNING | TASK_INTERRUPTIBLE | \ |
| +#define TASK_REPORT (TASK_RUNNING | TASK_RUNNING_MUTEX | \ |
| + TASK_INTERRUPTIBLE | \ |
| TASK_UNINTERRUPTIBLE | __TASK_STOPPED | \ |
| __TASK_TRACED) |
| |
| -- |
| 1.7.1.1 |
| |