diff options
author | Bjoern Brandenburg <bbb@mpi-sws.org> | 2012-09-04 08:39:09 -0400 |
---|---|---|
committer | Bjoern Brandenburg <bbb@mpi-sws.org> | 2012-10-18 16:14:05 -0400 |
commit | a481c27ddd7d324a9f311ae9a08228499dbb7f7b (patch) | |
tree | 09e380e77ba71a44d3a5c2d9c5144e90d005a439 /litmus/trace.c | |
parent | a13904d4b6d04278deb6841020dd7dee9867745e (diff) |
Feather-Trace: hide irq in SEND_RESCHED_END
SEND_RESCHED_END is necessarily preceded by an interrupt. We don't
want to filter events based on this expected interrupts, but we still
want to detect samples disturbed by other interrupts. Hence, subtract
one off the interrupt count.
Diffstat (limited to 'litmus/trace.c')
-rw-r--r-- | litmus/trace.c | 32 |
1 files changed, 22 insertions, 10 deletions
diff --git a/litmus/trace.c b/litmus/trace.c index 4e3d116fe050..7dbb98e4a3cd 100644 --- a/litmus/trace.c +++ b/litmus/trace.c | |||
@@ -58,6 +58,7 @@ static inline void write_timestamp(uint8_t event, | |||
58 | uint16_t pid_fragment, | 58 | uint16_t pid_fragment, |
59 | unsigned int irq_count, | 59 | unsigned int irq_count, |
60 | int record_irq, | 60 | int record_irq, |
61 | int hide_irq, | ||
61 | uint64_t timestamp, | 62 | uint64_t timestamp, |
62 | int record_timestamp) | 63 | int record_timestamp) |
63 | { | 64 | { |
@@ -84,7 +85,7 @@ static inline void write_timestamp(uint8_t event, | |||
84 | if (record_irq) | 85 | if (record_irq) |
85 | irq_count = get_and_clear_irq_fired(); | 86 | irq_count = get_and_clear_irq_fired(); |
86 | 87 | ||
87 | save_irq_flags(ts, irq_count); | 88 | save_irq_flags(ts, irq_count - hide_irq); |
88 | 89 | ||
89 | if (record_timestamp) | 90 | if (record_timestamp) |
90 | timestamp = ft_timestamp(); | 91 | timestamp = ft_timestamp(); |
@@ -122,7 +123,7 @@ feather_callback void save_timestamp(unsigned long event) | |||
122 | write_timestamp(event, TSK_UNKNOWN, | 123 | write_timestamp(event, TSK_UNKNOWN, |
123 | raw_smp_processor_id(), | 124 | raw_smp_processor_id(), |
124 | current->pid, | 125 | current->pid, |
125 | 0, 1, | 126 | 0, 1, 0, |
126 | 0, 1); | 127 | 0, 1); |
127 | } | 128 | } |
128 | 129 | ||
@@ -132,7 +133,7 @@ feather_callback void save_timestamp_def(unsigned long event, | |||
132 | write_timestamp(event, type, | 133 | write_timestamp(event, type, |
133 | raw_smp_processor_id(), | 134 | raw_smp_processor_id(), |
134 | current->pid, | 135 | current->pid, |
135 | 0, 1, | 136 | 0, 1, 0, |
136 | 0, 1); | 137 | 0, 1); |
137 | } | 138 | } |
138 | 139 | ||
@@ -145,7 +146,7 @@ feather_callback void save_timestamp_task(unsigned long event, | |||
145 | write_timestamp(event, rt ? TSK_RT : TSK_BE, | 146 | write_timestamp(event, rt ? TSK_RT : TSK_BE, |
146 | raw_smp_processor_id(), | 147 | raw_smp_processor_id(), |
147 | t->pid, | 148 | t->pid, |
148 | 0, 1, | 149 | 0, 1, 0, |
149 | 0, 1); | 150 | 0, 1); |
150 | } | 151 | } |
151 | 152 | ||
@@ -153,7 +154,8 @@ feather_callback void save_timestamp_cpu(unsigned long event, | |||
153 | unsigned long cpu) | 154 | unsigned long cpu) |
154 | { | 155 | { |
155 | write_timestamp(event, TSK_UNKNOWN, cpu, current->pid, | 156 | write_timestamp(event, TSK_UNKNOWN, cpu, current->pid, |
156 | 0, 1, 0, 1); | 157 | 0, 1, 0, |
158 | 0, 1); | ||
157 | } | 159 | } |
158 | 160 | ||
159 | feather_callback void save_task_latency(unsigned long event, | 161 | feather_callback void save_task_latency(unsigned long event, |
@@ -163,31 +165,41 @@ feather_callback void save_task_latency(unsigned long event, | |||
163 | lt_t *when = (lt_t*) when_ptr; | 165 | lt_t *when = (lt_t*) when_ptr; |
164 | 166 | ||
165 | write_timestamp(event, TSK_RT, raw_smp_processor_id(), 0, | 167 | write_timestamp(event, TSK_RT, raw_smp_processor_id(), 0, |
166 | 0, 1, | 168 | 0, 1, 0, |
167 | now - *when, 0); | 169 | now - *when, 0); |
168 | } | 170 | } |
169 | 171 | ||
170 | /* fake timestamp to user-reported time */ | 172 | /* fake timestamp to user-reported time */ |
171 | void save_timestamp_time(unsigned long event, | 173 | feather_callback void save_timestamp_time(unsigned long event, |
172 | unsigned long ptr) | 174 | unsigned long ptr) |
173 | { | 175 | { |
174 | uint64_t* time = (uint64_t*) ptr; | 176 | uint64_t* time = (uint64_t*) ptr; |
175 | 177 | ||
176 | write_timestamp(event, is_realtime(current) ? TSK_RT : TSK_BE, | 178 | write_timestamp(event, is_realtime(current) ? TSK_RT : TSK_BE, |
177 | raw_smp_processor_id(), current->pid, | 179 | raw_smp_processor_id(), current->pid, |
178 | 0, 1, | 180 | 0, 1, 0, |
179 | *time, 0); | 181 | *time, 0); |
180 | } | 182 | } |
181 | 183 | ||
182 | /* Record user-reported IRQ count */ | 184 | /* Record user-reported IRQ count */ |
183 | void save_timestamp_irq(unsigned long event, | 185 | feather_callback void save_timestamp_irq(unsigned long event, |
184 | unsigned long irq_counter_ptr) | 186 | unsigned long irq_counter_ptr) |
185 | { | 187 | { |
186 | uint64_t* irqs = (uint64_t*) irq_counter_ptr; | 188 | uint64_t* irqs = (uint64_t*) irq_counter_ptr; |
187 | 189 | ||
188 | write_timestamp(event, is_realtime(current) ? TSK_RT : TSK_BE, | 190 | write_timestamp(event, is_realtime(current) ? TSK_RT : TSK_BE, |
189 | raw_smp_processor_id(), current->pid, | 191 | raw_smp_processor_id(), current->pid, |
190 | *irqs, 0, | 192 | *irqs, 0, 0, |
193 | 0, 1); | ||
194 | } | ||
195 | |||
196 | /* Suppress one IRQ from the irq count. Used by TS_SEND_RESCHED_END, which is | ||
197 | * called from within an interrupt that is expected. */ | ||
198 | feather_callback void save_timestamp_hide_irq(unsigned long event) | ||
199 | { | ||
200 | write_timestamp(event, is_realtime(current) ? TSK_RT : TSK_BE, | ||
201 | raw_smp_processor_id(), current->pid, | ||
202 | 0, 1, 1, | ||
191 | 0, 1); | 203 | 0, 1); |
192 | } | 204 | } |
193 | 205 | ||