Working on kgdb for I-pipe, I noticed that we miss add/sub_preempt_count
with our ipipe_check_context tests. Here is an improved instrumentation
(which also removes some over-instrumentations).

Jan

-- 
Siemens AG, Corporate Technology, CT SE 2
Corporate Competence Center Embedded Linux
---
 include/linux/preempt.h |   21 ++++++++++++---------
 kernel/sched.c          |    4 ++--
 2 files changed, 14 insertions(+), 11 deletions(-)

Index: linux-2.6.24-rc8-xeno_64/include/linux/preempt.h
===================================================================
--- linux-2.6.24-rc8-xeno_64.orig/include/linux/preempt.h
+++ linux-2.6.24-rc8-xeno_64/include/linux/preempt.h
@@ -15,8 +15,14 @@
   extern void fastcall add_preempt_count(int val);
   extern void fastcall sub_preempt_count(int val);
 #else
-# define add_preempt_count(val)	do { preempt_count() += (val); } while (0)
-# define sub_preempt_count(val)	do { preempt_count() -= (val); } while (0)
+# define add_preempt_count(val)	do { \
+	ipipe_check_context(ipipe_root_domain); \
+	preempt_count() += (val); \
+  } while (0)
+# define sub_preempt_count(val)	do { \
+	ipipe_check_context(ipipe_root_domain); \
+	preempt_count() -= (val); \
+  } while (0)
 #endif
 
 #define inc_preempt_count() add_preempt_count(1)
@@ -30,21 +36,18 @@ asmlinkage void preempt_schedule(void);
 
 #define preempt_disable() \
 do { \
-	ipipe_check_context(ipipe_root_domain); \
 	inc_preempt_count(); \
 	barrier(); \
 } while (0)
 
 #define preempt_enable_no_resched() \
 do { \
-	ipipe_check_context(ipipe_root_domain); \
 	barrier(); \
 	dec_preempt_count(); \
 } while (0)
 
 #define preempt_check_resched() \
 do { \
-	ipipe_check_context(ipipe_root_domain); \
 	if (unlikely(test_thread_flag(TIF_NEED_RESCHED))) \
 		preempt_schedule(); \
 } while (0)
@@ -58,10 +61,10 @@ do { \
 
 #else
 
-#define preempt_disable()		ipipe_check_context(ipipe_root_domain)
-#define preempt_enable_no_resched()	ipipe_check_context(ipipe_root_domain)
-#define preempt_enable()		ipipe_check_context(ipipe_root_domain)
-#define preempt_check_resched()		ipipe_check_context(ipipe_root_domain)
+#define preempt_disable()		do { } while (0)
+#define preempt_enable_no_resched()	do { } while (0)
+#define preempt_enable()		do { } while (0)
+#define preempt_check_resched()		do { } while (0)
 
 #endif
 
Index: linux-2.6.24-rc8-xeno_64/kernel/sched.c
===================================================================
--- linux-2.6.24-rc8-xeno_64.orig/kernel/sched.c
+++ linux-2.6.24-rc8-xeno_64/kernel/sched.c
@@ -3510,6 +3510,7 @@ void scheduler_tick(void)
 
 void fastcall add_preempt_count(int val)
 {
+	ipipe_check_context(ipipe_root_domain);
 	/*
 	 * Underflow?
 	 */
@@ -3526,6 +3527,7 @@ EXPORT_SYMBOL(add_preempt_count);
 
 void fastcall sub_preempt_count(int val)
 {
+	ipipe_check_context(ipipe_root_domain);
 	/*
 	 * Underflow?
 	 */
@@ -3630,8 +3632,6 @@ asmlinkage void __sched schedule(void)
 	struct rq *rq;
 	int cpu;
 
-	ipipe_check_context(ipipe_root_domain);
-
 need_resched:
 	preempt_disable();
 	cpu = smp_processor_id();
_______________________________________________
Adeos-main mailing list
[email protected]
https://mail.gna.org/listinfo/adeos-main

Reply via email to