blob: 1de6e547756bc283fd1c3eb72c269570a7c5ea3a [file] [log] [blame]
From 1d32d09a150e52c62a7cec3ac193752208394ceb Mon Sep 17 00:00:00 2001
From: Thomas Gleixner <tglx@linutronix.de>
Date: Sun, 26 Jul 2009 18:39:41 +0200
Subject: [PATCH] sched: Add lock_count to task struct
commit 53e9ba175098c8f13e2cc0a45f3b586a22a4ffd3 in tip.
Debugging interface.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com>
---
include/linux/sched.h | 20 ++++++++++++++++++++
kernel/fork.c | 6 ++++++
2 files changed, 26 insertions(+), 0 deletions(-)
diff --git a/include/linux/sched.h b/include/linux/sched.h
index 304c8c8..0f0cc03 100644
--- a/include/linux/sched.h
+++ b/include/linux/sched.h
@@ -1414,6 +1414,26 @@ struct task_struct {
gfp_t lockdep_reclaim_gfp;
#endif
+/* realtime bits */
+
+#define MAX_PREEMPT_TRACE 25
+#define MAX_LOCK_STACK MAX_PREEMPT_TRACE
+#ifdef CONFIG_DEBUG_PREEMPT
+ int lock_count;
+# ifdef CONFIG_PREEMPT_RT
+ struct rt_mutex *owned_lock[MAX_LOCK_STACK];
+# endif
+#endif
+#ifdef CONFIG_DETECT_SOFTLOCKUP
+ unsigned long softlockup_count; /* Count to keep track how long the
+ * thread is in the kernel without
+ * sleeping.
+ */
+#endif
+#ifdef CONFIG_DEBUG_RT_MUTEXES
+ void *last_kernel_lock;
+#endif
+
/* journalling filesystem info */
void *journal_info;
diff --git a/kernel/fork.c b/kernel/fork.c
index 1a3f641..f496dcf 100644
--- a/kernel/fork.c
+++ b/kernel/fork.c
@@ -920,6 +920,9 @@ static void rt_mutex_init_task(struct task_struct *p)
#ifdef CONFIG_RT_MUTEXES
plist_head_init_raw(&p->pi_waiters, &p->pi_lock);
p->pi_blocked_on = NULL;
+# ifdef CONFIG_DEBUG_RT_MUTEXES
+ p->last_kernel_lock = NULL;
+# endif
#endif
}
@@ -1145,6 +1148,9 @@ static struct task_struct *copy_process(unsigned long clone_flags,
retval = copy_thread(clone_flags, stack_start, stack_size, p, regs);
if (retval)
goto bad_fork_cleanup_io;
+#ifdef CONFIG_DEBUG_PREEMPT
+ p->lock_count = 0;
+#endif
if (pid != &init_struct_pid) {
retval = -ENOMEM;
--
1.7.0.4