aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBjoern B. Brandenburg <bbb@cs.unc.edu>2008-05-22 11:49:47 -0400
committerBjoern B. Brandenburg <bbb@cs.unc.edu>2008-05-22 11:49:47 -0400
commit4e94db6f1c0341c5e64f0f1487de63420fb7a163 (patch)
tree573b43d84290554f38caaf36800af3a83e0a1325
parent05684bf81966b173b9387a06a72a36c8a047eba5 (diff)
record task type in feather trace time stamp
-rw-r--r--include/litmus/trace.h56
-rw-r--r--kernel/sched.c22
-rw-r--r--litmus/trace.c23
3 files changed, 67 insertions, 34 deletions
diff --git a/include/litmus/trace.h b/include/litmus/trace.h
index ad7a782a97..ff670c5a15 100644
--- a/include/litmus/trace.h
+++ b/include/litmus/trace.h
@@ -9,28 +9,42 @@
9 9
10/*********************** TIMESTAMPS ************************/ 10/*********************** TIMESTAMPS ************************/
11 11
12enum task_type_marker {
13 TSK_BE,
14 TSK_RT,
15 TSK_UNKNOWN
16};
17
12struct timestamp { 18struct timestamp {
13 uint64_t timestamp; 19 uint64_t timestamp;
14 uint32_t seq_no; 20 uint32_t seq_no;
15 uint16_t cpu; 21 uint8_t cpu;
16 uint16_t event; 22 uint8_t event;
23 uint8_t task_type;
17}; 24};
18 25
19 26
20/* buffer holding time stamps - will be provided by driver */ 27/* buffer holding time stamps - will be provided by driver */
21extern struct ft_buffer* trace_ts_buf; 28extern struct ft_buffer* trace_ts_buf;
22 29
23/* save_timestamp: stores current time as struct timestamp 30/* tracing callbacks */
24 * in trace_ts_buf 31feather_callback void save_timestamp(unsigned long event);
25 */ 32feather_callback void save_timestamp_def(unsigned long event, unsigned long type);
26asmlinkage void save_timestamp(unsigned long event); 33feather_callback void save_timestamp_task(unsigned long event, unsigned long t_ptr);
27 34
28#define TIMESTAMP(id) ft_event0(id, save_timestamp) 35#define TIMESTAMP(id) ft_event0(id, save_timestamp)
29 36
37#define DTIMESTAMP(id, def) ft_event1(id, save_timestamp_def, def)
38
39#define TTIMESTAMP(id, task) ft_event1(id, save_timestamp_task, task)
30 40
31#else /* !CONFIG_FEATHER_TRACE */ 41#else /* !CONFIG_FEATHER_TRACE */
32 42
33#define TIMESTAMP(id) /* no tracing */ 43#define TIMESTAMP(id) /* no tracing */
44
45#define DTIMESTAMP(id, def) /* no tracing */
46
47#define TTIMESTAMP(id, task) /* no tracing */
34 48
35#endif 49#endif
36 50
@@ -43,26 +57,26 @@ asmlinkage void save_timestamp(unsigned long event);
43 * always the next number after the start time event id. 57 * always the next number after the start time event id.
44 */ 58 */
45 59
46#define TS_SCHED_START TIMESTAMP(100) 60#define TS_SCHED_START(t) TTIMESTAMP(100, t)
47#define TS_SCHED_END TIMESTAMP(101) 61#define TS_SCHED_END(t) TTIMESTAMP(101, t)
48#define TS_SCHED2_START TIMESTAMP(102) 62#define TS_SCHED2_START(t) TTIMESTAMP(102, t)
49#define TS_SCHED2_END TIMESTAMP(103) 63#define TS_SCHED2_END(t) TTIMESTAMP(103, t)
50 64
51#define TS_CXS_START TIMESTAMP(104) 65#define TS_CXS_START(t) TTIMESTAMP(104, t)
52#define TS_CXS_END TIMESTAMP(105) 66#define TS_CXS_END(t) TTIMESTAMP(105, t)
53 67
54#define TS_RELEASE_START TIMESTAMP(106) 68#define TS_RELEASE_START DTIMESTAMP(106, TSK_RT)
55#define TS_RELEASE_END TIMESTAMP(107) 69#define TS_RELEASE_END DTIMESTAMP(107, TSK_RT)
56 70
57#define TS_TICK_START TIMESTAMP(110) 71#define TS_TICK_START(t) TTIMESTAMP(110, t)
58#define TS_TICK_END TIMESTAMP(111) 72#define TS_TICK_END(t) TTIMESTAMP(111, t)
59 73
60 74
61#define TS_PLUGIN_SCHED_START TIMESTAMP(120) 75#define TS_PLUGIN_SCHED_START /* TIMESTAMP(120) */ /* currently unused */
62#define TS_PLUGIN_SCHED_END TIMESTAMP(121) 76#define TS_PLUGIN_SCHED_END /* TIMESTAMP(121) */
63 77
64#define TS_PLUGIN_TICK_START TIMESTAMP(130) 78#define TS_PLUGIN_TICK_START /* TIMESTAMP(130) */
65#define TS_PLUGIN_TICK_END TIMESTAMP(131) 79#define TS_PLUGIN_TICK_END /* TIMESTAMP(131) */
66 80
67#define TS_ENTER_NP_START TIMESTAMP(140) 81#define TS_ENTER_NP_START TIMESTAMP(140)
68#define TS_ENTER_NP_END TIMESTAMP(141) 82#define TS_ENTER_NP_END TIMESTAMP(141)
diff --git a/kernel/sched.c b/kernel/sched.c
index 7bc6f9a1bb..7f1de34b1c 100644
--- a/kernel/sched.c
+++ b/kernel/sched.c
@@ -3493,7 +3493,7 @@ void scheduler_tick(void)
3493 struct task_struct *curr = rq->curr; 3493 struct task_struct *curr = rq->curr;
3494 u64 next_tick = rq->tick_timestamp + TICK_NSEC; 3494 u64 next_tick = rq->tick_timestamp + TICK_NSEC;
3495 3495
3496 TS_TICK_START; 3496 TS_TICK_START(current);
3497 spin_lock(&rq->lock); 3497 spin_lock(&rq->lock);
3498 __update_rq_clock(rq); 3498 __update_rq_clock(rq);
3499 /* 3499 /*
@@ -3515,7 +3515,7 @@ void scheduler_tick(void)
3515 if (!is_realtime(current)) 3515 if (!is_realtime(current))
3516 trigger_load_balance(rq, cpu); 3516 trigger_load_balance(rq, cpu);
3517#endif 3517#endif
3518 TS_TICK_END; 3518 TS_TICK_END(current);
3519} 3519}
3520 3520
3521#if defined(CONFIG_PREEMPT) && defined(CONFIG_DEBUG_PREEMPT) 3521#if defined(CONFIG_PREEMPT) && defined(CONFIG_DEBUG_PREEMPT)
@@ -3654,7 +3654,7 @@ need_resched:
3654 3654
3655 release_kernel_lock(prev); 3655 release_kernel_lock(prev);
3656need_resched_nonpreemptible: 3656need_resched_nonpreemptible:
3657 TS_SCHED_START; 3657 TS_SCHED_START(prev);
3658 3658
3659 schedule_debug(prev); 3659 schedule_debug(prev);
3660 3660
@@ -3692,30 +3692,30 @@ need_resched_nonpreemptible:
3692 rq->curr = next; 3692 rq->curr = next;
3693 ++*switch_count; 3693 ++*switch_count;
3694 3694
3695 TS_SCHED_END; 3695 TS_SCHED_END(next);
3696 TS_CXS_START; 3696 TS_CXS_START(prev);
3697 context_switch(rq, prev, next); /* unlocks the rq */ 3697 context_switch(rq, prev, next); /* unlocks the rq */
3698 TS_CXS_END; 3698 TS_CXS_END(current);
3699 } else { 3699 } else {
3700 TS_SCHED_END; 3700 TS_SCHED_END(prev);
3701 spin_unlock_irq(&rq->lock); 3701 spin_unlock_irq(&rq->lock);
3702 } 3702 }
3703 TS_SCHED2_START; 3703 TS_SCHED2_START(current);
3704 3704
3705 tick_no_rqlock(); 3705 tick_no_rqlock();
3706 3706
3707 if (unlikely(reacquire_kernel_lock(current) < 0)) { 3707 if (unlikely(reacquire_kernel_lock(current) < 0)) {
3708 cpu = smp_processor_id(); 3708 cpu = smp_processor_id();
3709 rq = cpu_rq(cpu); 3709 rq = cpu_rq(cpu);
3710 TS_SCHED2_END; 3710 TS_SCHED2_END(current);
3711 goto need_resched_nonpreemptible; 3711 goto need_resched_nonpreemptible;
3712 } 3712 }
3713 preempt_enable_no_resched(); 3713 preempt_enable_no_resched();
3714 if (unlikely(test_thread_flag(TIF_NEED_RESCHED))) { 3714 if (unlikely(test_thread_flag(TIF_NEED_RESCHED))) {
3715 TS_SCHED2_END; 3715 TS_SCHED2_END(current);
3716 goto need_resched; 3716 goto need_resched;
3717 } 3717 }
3718 TS_SCHED2_END; 3718 TS_SCHED2_END(current);
3719 if (srp_active()) 3719 if (srp_active())
3720 srp_ceiling_block(); 3720 srp_ceiling_block();
3721} 3721}
diff --git a/litmus/trace.c b/litmus/trace.c
index 0c1916f507..bfe4ed4467 100644
--- a/litmus/trace.c
+++ b/litmus/trace.c
@@ -5,6 +5,7 @@
5#include <asm/uaccess.h> 5#include <asm/uaccess.h>
6#include <linux/module.h> 6#include <linux/module.h>
7 7
8#include <litmus/litmus.h>
8#include <litmus/trace.h> 9#include <litmus/trace.h>
9 10
10/******************************************************************************/ 11/******************************************************************************/
@@ -15,19 +16,37 @@ struct ft_buffer* trace_ts_buf = NULL;
15 16
16static unsigned int ts_seq_no = 0; 17static unsigned int ts_seq_no = 0;
17 18
18feather_callback void save_timestamp(unsigned long event) 19static inline void __save_timestamp(unsigned long event, uint8_t type)
19{ 20{
20 unsigned int seq_no = fetch_and_inc((int *) &ts_seq_no); 21 unsigned int seq_no;
21 struct timestamp *ts; 22 struct timestamp *ts;
23 seq_no = fetch_and_inc((int *) &ts_seq_no);
22 if (ft_buffer_start_write(trace_ts_buf, (void**) &ts)) { 24 if (ft_buffer_start_write(trace_ts_buf, (void**) &ts)) {
23 ts->event = event; 25 ts->event = event;
24 ts->timestamp = ft_timestamp(); 26 ts->timestamp = ft_timestamp();
25 ts->seq_no = seq_no; 27 ts->seq_no = seq_no;
26 ts->cpu = raw_smp_processor_id(); 28 ts->cpu = raw_smp_processor_id();
29 ts->task_type = type;
27 ft_buffer_finish_write(trace_ts_buf, ts); 30 ft_buffer_finish_write(trace_ts_buf, ts);
28 } 31 }
29} 32}
30 33
34feather_callback void save_timestamp(unsigned long event)
35{
36 __save_timestamp(event, TSK_UNKNOWN);
37}
38
39feather_callback void save_timestamp_def(unsigned long event, unsigned long type)
40{
41 __save_timestamp(event, (uint8_t) type);
42}
43
44feather_callback void save_timestamp_task(unsigned long event, unsigned long t_ptr)
45{
46 int rt = is_realtime((struct task_struct *) t_ptr);
47 __save_timestamp(event, rt ? TSK_RT : TSK_BE);
48}
49
31static struct ft_buffer* alloc_ft_buffer(unsigned int count, size_t size) 50static struct ft_buffer* alloc_ft_buffer(unsigned int count, size_t size)
32{ 51{
33 struct ft_buffer* buf; 52 struct ft_buffer* buf;