Lines Matching refs:dpr
122 periodic_handler_symbol(ddi_periodic_impl_t *dpr) in periodic_handler_symbol() argument
126 return (kobj_getsymname((uintptr_t)dpr->dpr_handler, &off)); in periodic_handler_symbol()
136 ddi_periodic_impl_t *dpr = arg; in periodic_execute() local
137 mutex_enter(&dpr->dpr_lock); in periodic_execute()
142 VERIFY((dpr->dpr_flags & (DPF_DISPATCHED | DPF_EXECUTING)) == in periodic_execute()
144 VERIFY(dpr->dpr_thread == NULL); in periodic_execute()
146 if (!(dpr->dpr_flags & DPF_CANCELLED)) { in periodic_execute()
147 int level = dpr->dpr_level; in periodic_execute()
148 uint64_t count = dpr->dpr_fire_count; in periodic_execute()
153 dpr->dpr_flags |= DPF_EXECUTING; in periodic_execute()
154 dpr->dpr_thread = curthread; in periodic_execute()
155 mutex_exit(&dpr->dpr_lock); in periodic_execute()
160 DTRACE_PROBE4(ddi__periodic__execute, void *, dpr->dpr_handler, in periodic_execute()
161 void *, dpr->dpr_arg, int, level, uint64_t, count); in periodic_execute()
162 (*dpr->dpr_handler)(dpr->dpr_arg); in periodic_execute()
163 DTRACE_PROBE4(ddi__periodic__done, void *, dpr->dpr_handler, in periodic_execute()
164 void *, dpr->dpr_arg, int, level, uint64_t, count); in periodic_execute()
166 mutex_enter(&dpr->dpr_lock); in periodic_execute()
167 dpr->dpr_thread = NULL; in periodic_execute()
168 dpr->dpr_fire_count++; in periodic_execute()
175 dpr->dpr_flags &= ~(DPF_DISPATCHED | DPF_EXECUTING); in periodic_execute()
176 cv_broadcast(&dpr->dpr_cv); in periodic_execute()
177 mutex_exit(&dpr->dpr_lock); in periodic_execute()
183 ddi_periodic_impl_t *dpr; in ddi_periodic_softintr() local
191 while ((dpr = list_remove_head(&periodic_softint_queue[level - 1])) != in ddi_periodic_softintr()
197 periodic_execute(dpr); in ddi_periodic_softintr()
251 ddi_periodic_impl_t *dpr; in ddi_periodic_fini() local
258 while ((dpr = list_head(&periodics)) != NULL) { in ddi_periodic_fini()
261 (unsigned long)dpr->dpr_id, periodic_handler_symbol(dpr)); in ddi_periodic_fini()
268 i_untimeout((timeout_t)(uintptr_t)dpr->dpr_id); in ddi_periodic_fini()
296 ddi_periodic_impl_t *dpr = arg; in periodic_cyclic_handler() local
298 mutex_enter(&dpr->dpr_lock); in periodic_cyclic_handler()
303 if (dpr->dpr_flags & (DPF_CANCELLED | DPF_DISPATCHED)) { in periodic_cyclic_handler()
304 mutex_exit(&dpr->dpr_lock); in periodic_cyclic_handler()
307 VERIFY(!(dpr->dpr_flags & DPF_EXECUTING)); in periodic_cyclic_handler()
312 dpr->dpr_flags |= DPF_DISPATCHED; in periodic_cyclic_handler()
313 mutex_exit(&dpr->dpr_lock); in periodic_cyclic_handler()
315 if (dpr->dpr_level == PERI_IPL_0) { in periodic_cyclic_handler()
320 dpr, 0, &dpr->dpr_taskq_ent); in periodic_cyclic_handler()
327 list_insert_tail(&periodic_softint_queue[dpr->dpr_level - 1], in periodic_cyclic_handler()
328 dpr); in periodic_cyclic_handler()
335 sir_on(dpr->dpr_level); in periodic_cyclic_handler()
340 periodic_destroy(ddi_periodic_impl_t *dpr) in periodic_destroy() argument
342 if (dpr == NULL) in periodic_destroy()
349 VERIFY(dpr->dpr_flags == DPF_CANCELLED); in periodic_destroy()
350 VERIFY(dpr->dpr_thread == NULL); in periodic_destroy()
352 id_free(periodic_id_space, dpr->dpr_id); in periodic_destroy()
353 cv_destroy(&dpr->dpr_cv); in periodic_destroy()
354 mutex_destroy(&dpr->dpr_lock); in periodic_destroy()
355 kmem_cache_free(periodic_cache, dpr); in periodic_destroy()
361 ddi_periodic_impl_t *dpr; in periodic_create() local
363 dpr = kmem_cache_alloc(periodic_cache, KM_SLEEP); in periodic_create()
364 bzero(dpr, sizeof (*dpr)); in periodic_create()
365 dpr->dpr_id = id_alloc(periodic_id_space); in periodic_create()
366 mutex_init(&dpr->dpr_lock, NULL, MUTEX_ADAPTIVE, NULL); in periodic_create()
367 cv_init(&dpr->dpr_cv, NULL, CV_DEFAULT, NULL); in periodic_create()
369 return (dpr); in periodic_create()
384 ddi_periodic_impl_t *dpr; in i_timeout() local
392 dpr = periodic_create(); in i_timeout()
393 dpr->dpr_level = level; in i_timeout()
394 dpr->dpr_handler = func; in i_timeout()
395 dpr->dpr_arg = arg; in i_timeout()
406 "It rounds up to %lld\n", periodic_handler_symbol(dpr), in i_timeout()
415 dpr->dpr_interval = roundup(interval, ddi_periodic_resolution); in i_timeout()
421 cyh.cyh_arg = dpr; in i_timeout()
425 cyt.cyt_interval = dpr->dpr_interval; in i_timeout()
428 dpr->dpr_cyclic_id = cyclic_add(&cyh, &cyt); in i_timeout()
436 list_insert_tail(&periodics, dpr); in i_timeout()
439 return ((timeout_t)(uintptr_t)dpr->dpr_id); in i_timeout()
453 ddi_periodic_impl_t *dpr; in i_untimeout() local
461 for (dpr = list_head(&periodics); dpr != NULL; dpr = in i_untimeout()
462 list_next(&periodics, dpr)) { in i_untimeout()
463 if (dpr->dpr_id == (id_t)(uintptr_t)id) { in i_untimeout()
464 list_remove(&periodics, dpr); in i_untimeout()
473 if (dpr == NULL) in i_untimeout()
476 mutex_enter(&dpr->dpr_lock); in i_untimeout()
480 VERIFY(!(dpr->dpr_flags & DPF_CANCELLED)); in i_untimeout()
485 if (dpr->dpr_thread == curthread) { in i_untimeout()
487 (unsigned long)dpr->dpr_id); in i_untimeout()
492 dpr->dpr_flags |= DPF_CANCELLED; in i_untimeout()
493 mutex_exit(&dpr->dpr_lock); in i_untimeout()
502 cyclic_remove(dpr->dpr_cyclic_id); in i_untimeout()
508 mutex_enter(&dpr->dpr_lock); in i_untimeout()
509 while (dpr->dpr_flags & (DPF_DISPATCHED | DPF_EXECUTING)) { in i_untimeout()
510 cv_wait(&dpr->dpr_cv, &dpr->dpr_lock); in i_untimeout()
512 mutex_exit(&dpr->dpr_lock); in i_untimeout()
514 periodic_destroy(dpr); in i_untimeout()