improve ipipe_check_context instrumentation
PATCH 1/1 improve ipipe_check_context instrumentation
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
Signature · 2 lines
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(-)
include/linux/preempt.h +12 -9
@@ -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
kernel/sched.c +2 -2
@@ -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 ();