diff options
author | Bjoern B. Brandenburg <bbb@cs.unc.edu> | 2008-05-22 11:49:47 -0400 |
---|---|---|
committer | Bjoern B. Brandenburg <bbb@cs.unc.edu> | 2008-05-22 11:49:47 -0400 |
commit | 4e94db6f1c0341c5e64f0f1487de63420fb7a163 (patch) | |
tree | 573b43d84290554f38caaf36800af3a83e0a1325 | |
parent | 05684bf81966b173b9387a06a72a36c8a047eba5 (diff) |
record task type in feather trace time stamp
-rw-r--r-- | include/litmus/trace.h | 56 | ||||
-rw-r--r-- | kernel/sched.c | 22 | ||||
-rw-r--r-- | litmus/trace.c | 23 |
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 | ||
12 | enum task_type_marker { | ||
13 | TSK_BE, | ||
14 | TSK_RT, | ||
15 | TSK_UNKNOWN | ||
16 | }; | ||
17 | |||
12 | struct timestamp { | 18 | struct 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 */ |
21 | extern struct ft_buffer* trace_ts_buf; | 28 | extern 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 | 31 | feather_callback void save_timestamp(unsigned long event); |
25 | */ | 32 | feather_callback void save_timestamp_def(unsigned long event, unsigned long type); |
26 | asmlinkage void save_timestamp(unsigned long event); | 33 | feather_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); |
3656 | need_resched_nonpreemptible: | 3656 | need_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 | ||
16 | static unsigned int ts_seq_no = 0; | 17 | static unsigned int ts_seq_no = 0; |
17 | 18 | ||
18 | feather_callback void save_timestamp(unsigned long event) | 19 | static 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 | ||
34 | feather_callback void save_timestamp(unsigned long event) | ||
35 | { | ||
36 | __save_timestamp(event, TSK_UNKNOWN); | ||
37 | } | ||
38 | |||
39 | feather_callback void save_timestamp_def(unsigned long event, unsigned long type) | ||
40 | { | ||
41 | __save_timestamp(event, (uint8_t) type); | ||
42 | } | ||
43 | |||
44 | feather_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 | |||
31 | static struct ft_buffer* alloc_ft_buffer(unsigned int count, size_t size) | 50 | static struct ft_buffer* alloc_ft_buffer(unsigned int count, size_t size) |
32 | { | 51 | { |
33 | struct ft_buffer* buf; | 52 | struct ft_buffer* buf; |