blob: 3e8de5884d5277307966a6c7376174e7a6d2b070 [file] [log] [blame]
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