186 dtrace_vtime_state_t state, nstate;
187
188 do {
189 state = dtrace_vtime_active;
190
191 switch (state) {
192 case DTRACE_VTIME_INACTIVE:
193 nstate = DTRACE_VTIME_ACTIVE;
194 break;
195
196 case DTRACE_VTIME_INACTIVE_TNF:
197 nstate = DTRACE_VTIME_ACTIVE_TNF;
198 break;
199
200 case DTRACE_VTIME_ACTIVE:
201 case DTRACE_VTIME_ACTIVE_TNF:
202 panic("DTrace virtual time already enabled");
203 /*NOTREACHED*/
204 }
205
206 } while (cas32((uint32_t *)&dtrace_vtime_active,
207 state, nstate) != state);
208 }
209
210 void
211 dtrace_vtime_disable(void)
212 {
213 dtrace_vtime_state_t state, nstate;
214
215 do {
216 state = dtrace_vtime_active;
217
218 switch (state) {
219 case DTRACE_VTIME_ACTIVE:
220 nstate = DTRACE_VTIME_INACTIVE;
221 break;
222
223 case DTRACE_VTIME_ACTIVE_TNF:
224 nstate = DTRACE_VTIME_INACTIVE_TNF;
225 break;
226
227 case DTRACE_VTIME_INACTIVE:
228 case DTRACE_VTIME_INACTIVE_TNF:
229 panic("DTrace virtual time already disabled");
230 /*NOTREACHED*/
231 }
232
233 } while (cas32((uint32_t *)&dtrace_vtime_active,
234 state, nstate) != state);
235 }
236
237 void
238 dtrace_vtime_enable_tnf(void)
239 {
240 dtrace_vtime_state_t state, nstate;
241
242 do {
243 state = dtrace_vtime_active;
244
245 switch (state) {
246 case DTRACE_VTIME_ACTIVE:
247 nstate = DTRACE_VTIME_ACTIVE_TNF;
248 break;
249
250 case DTRACE_VTIME_INACTIVE:
251 nstate = DTRACE_VTIME_INACTIVE_TNF;
252 break;
253
254 case DTRACE_VTIME_ACTIVE_TNF:
255 case DTRACE_VTIME_INACTIVE_TNF:
256 panic("TNF already active");
257 /*NOTREACHED*/
258 }
259
260 } while (cas32((uint32_t *)&dtrace_vtime_active,
261 state, nstate) != state);
262 }
263
264 void
265 dtrace_vtime_disable_tnf(void)
266 {
267 dtrace_vtime_state_t state, nstate;
268
269 do {
270 state = dtrace_vtime_active;
271
272 switch (state) {
273 case DTRACE_VTIME_ACTIVE_TNF:
274 nstate = DTRACE_VTIME_ACTIVE;
275 break;
276
277 case DTRACE_VTIME_INACTIVE_TNF:
278 nstate = DTRACE_VTIME_INACTIVE;
279 break;
280
281 case DTRACE_VTIME_ACTIVE:
282 case DTRACE_VTIME_INACTIVE:
283 panic("TNF already inactive");
284 /*NOTREACHED*/
285 }
286
287 } while (cas32((uint32_t *)&dtrace_vtime_active,
288 state, nstate) != state);
289 }
290
291 void
292 dtrace_vtime_switch(kthread_t *next)
293 {
294 dtrace_icookie_t cookie;
295 hrtime_t ts;
296
297 if (tnf_tracing_active) {
298 tnf_thread_switch(next);
299
300 if (dtrace_vtime_active == DTRACE_VTIME_INACTIVE_TNF)
301 return;
302 }
303
304 cookie = dtrace_interrupt_disable();
305 ts = dtrace_gethrtime();
306
307 if (curthread->t_dtrace_start != 0) {
|
186 dtrace_vtime_state_t state, nstate;
187
188 do {
189 state = dtrace_vtime_active;
190
191 switch (state) {
192 case DTRACE_VTIME_INACTIVE:
193 nstate = DTRACE_VTIME_ACTIVE;
194 break;
195
196 case DTRACE_VTIME_INACTIVE_TNF:
197 nstate = DTRACE_VTIME_ACTIVE_TNF;
198 break;
199
200 case DTRACE_VTIME_ACTIVE:
201 case DTRACE_VTIME_ACTIVE_TNF:
202 panic("DTrace virtual time already enabled");
203 /*NOTREACHED*/
204 }
205
206 } while (atomic_cas_32((uint32_t *)&dtrace_vtime_active,
207 state, nstate) != state);
208 }
209
210 void
211 dtrace_vtime_disable(void)
212 {
213 dtrace_vtime_state_t state, nstate;
214
215 do {
216 state = dtrace_vtime_active;
217
218 switch (state) {
219 case DTRACE_VTIME_ACTIVE:
220 nstate = DTRACE_VTIME_INACTIVE;
221 break;
222
223 case DTRACE_VTIME_ACTIVE_TNF:
224 nstate = DTRACE_VTIME_INACTIVE_TNF;
225 break;
226
227 case DTRACE_VTIME_INACTIVE:
228 case DTRACE_VTIME_INACTIVE_TNF:
229 panic("DTrace virtual time already disabled");
230 /*NOTREACHED*/
231 }
232
233 } while (atomic_cas_32((uint32_t *)&dtrace_vtime_active,
234 state, nstate) != state);
235 }
236
237 void
238 dtrace_vtime_enable_tnf(void)
239 {
240 dtrace_vtime_state_t state, nstate;
241
242 do {
243 state = dtrace_vtime_active;
244
245 switch (state) {
246 case DTRACE_VTIME_ACTIVE:
247 nstate = DTRACE_VTIME_ACTIVE_TNF;
248 break;
249
250 case DTRACE_VTIME_INACTIVE:
251 nstate = DTRACE_VTIME_INACTIVE_TNF;
252 break;
253
254 case DTRACE_VTIME_ACTIVE_TNF:
255 case DTRACE_VTIME_INACTIVE_TNF:
256 panic("TNF already active");
257 /*NOTREACHED*/
258 }
259
260 } while (atomic_cas_32((uint32_t *)&dtrace_vtime_active,
261 state, nstate) != state);
262 }
263
264 void
265 dtrace_vtime_disable_tnf(void)
266 {
267 dtrace_vtime_state_t state, nstate;
268
269 do {
270 state = dtrace_vtime_active;
271
272 switch (state) {
273 case DTRACE_VTIME_ACTIVE_TNF:
274 nstate = DTRACE_VTIME_ACTIVE;
275 break;
276
277 case DTRACE_VTIME_INACTIVE_TNF:
278 nstate = DTRACE_VTIME_INACTIVE;
279 break;
280
281 case DTRACE_VTIME_ACTIVE:
282 case DTRACE_VTIME_INACTIVE:
283 panic("TNF already inactive");
284 /*NOTREACHED*/
285 }
286
287 } while (atomic_cas_32((uint32_t *)&dtrace_vtime_active,
288 state, nstate) != state);
289 }
290
291 void
292 dtrace_vtime_switch(kthread_t *next)
293 {
294 dtrace_icookie_t cookie;
295 hrtime_t ts;
296
297 if (tnf_tracing_active) {
298 tnf_thread_switch(next);
299
300 if (dtrace_vtime_active == DTRACE_VTIME_INACTIVE_TNF)
301 return;
302 }
303
304 cookie = dtrace_interrupt_disable();
305 ts = dtrace_gethrtime();
306
307 if (curthread->t_dtrace_start != 0) {
|