Lines Matching defs:ie
113 static void intr_event_update(struct intr_event *ie);
114 static int intr_event_schedule_thread(struct intr_event *ie, struct trapframe *frame);
118 struct intr_event *ie);
185 struct intr_event *ie;
189 ie = ithd->it_event;
191 mtx_assert(&ie->ie_lock, MA_OWNED);
194 if (CK_SLIST_EMPTY(&ie->ie_handlers))
197 pri = CK_SLIST_FIRST(&ie->ie_handlers)->ih_pri;
200 strlcpy(td->td_name, ie->ie_fullname, sizeof(td->td_name));
213 intr_event_update(struct intr_event *ie)
220 mtx_assert(&ie->ie_lock, MA_OWNED);
221 strlcpy(ie->ie_fullname, ie->ie_name, sizeof(ie->ie_fullname));
227 CK_SLIST_FOREACH(ih, &ie->ie_handlers, ih_next) {
228 if (strlen(ie->ie_fullname) + strlen(ih->ih_name) + 1 <
229 sizeof(ie->ie_fullname)) {
230 strcat(ie->ie_fullname, " ");
231 strcat(ie->ie_fullname, ih->ih_name);
237 ie->ie_hflags = flags;
247 ih = CK_SLIST_FIRST(&ie->ie_handlers);
248 missed = strlen(ie->ie_fullname) + strlen(ih->ih_name) + 2 -
249 sizeof(ie->ie_fullname);
250 strcat(ie->ie_fullname, (missed == 0) ? " " : "-");
251 strcat(ie->ie_fullname, &ih->ih_name[missed]);
254 last = &ie->ie_fullname[sizeof(ie->ie_fullname) - 2];
256 if (strlen(ie->ie_fullname) + 1 == sizeof(ie->ie_fullname)) {
263 strcat(ie->ie_fullname, " +");
266 strcat(ie->ie_fullname, "+");
273 if (ie->ie_thread != NULL)
274 ithread_update(ie->ie_thread);
275 CTR2(KTR_INTR, "%s: updated %s", __func__, ie->ie_fullname);
284 struct intr_event *ie;
290 ie = malloc(sizeof(struct intr_event), M_ITHREAD, M_WAITOK | M_ZERO);
291 ie->ie_source = source;
292 ie->ie_pre_ithread = pre_ithread;
293 ie->ie_post_ithread = post_ithread;
294 ie->ie_post_filter = post_filter;
295 ie->ie_assign_cpu = assign_cpu;
296 ie->ie_flags = flags;
297 ie->ie_irq = irq;
298 ie->ie_cpu = NOCPU;
299 CK_SLIST_INIT(&ie->ie_handlers);
300 mtx_init(&ie->ie_lock, "intr event", NULL, MTX_DEF);
303 vsnprintf(ie->ie_name, sizeof(ie->ie_name), fmt, ap);
305 strlcpy(ie->ie_fullname, ie->ie_name, sizeof(ie->ie_fullname));
307 TAILQ_INSERT_TAIL(&event_list, ie, ie_list);
310 *event = ie;
311 CTR2(KTR_INTR, "%s: created %s", __func__, ie->ie_name);
322 _intr_event_bind(struct intr_event *ie, int cpu, bool bindirq, bool bindithread)
331 if (ie->ie_assign_cpu == NULL)
343 mtx_lock(&ie->ie_lock);
344 if (ie->ie_thread != NULL) {
345 id = ie->ie_thread->it_thread->td_tid;
346 mtx_unlock(&ie->ie_lock);
351 mtx_unlock(&ie->ie_lock);
354 error = ie->ie_assign_cpu(ie->ie_source, cpu);
357 mtx_lock(&ie->ie_lock);
358 if (ie->ie_thread != NULL) {
359 cpu = ie->ie_cpu;
360 id = ie->ie_thread->it_thread->td_tid;
361 mtx_unlock(&ie->ie_lock);
364 mtx_unlock(&ie->ie_lock);
370 mtx_lock(&ie->ie_lock);
371 ie->ie_cpu = cpu;
372 mtx_unlock(&ie->ie_lock);
384 intr_event_bind(struct intr_event *ie, int cpu)
387 return (_intr_event_bind(ie, cpu, true, true));
395 intr_event_bind_irqonly(struct intr_event *ie, int cpu)
398 return (_intr_event_bind(ie, cpu, true, false));
405 intr_event_bind_ithread(struct intr_event *ie, int cpu)
408 return (_intr_event_bind(ie, cpu, false, true));
415 intr_event_bind_ithread_cpuset(struct intr_event *ie, cpuset_t *cs)
419 mtx_lock(&ie->ie_lock);
420 if (ie->ie_thread != NULL) {
421 id = ie->ie_thread->it_thread->td_tid;
422 mtx_unlock(&ie->ie_lock);
425 mtx_unlock(&ie->ie_lock);
433 struct intr_event *ie;
436 TAILQ_FOREACH(ie, &event_list, ie_list)
437 if (ie->ie_irq == irq &&
438 (ie->ie_flags & IE_SOFT) == 0 &&
439 CK_SLIST_FIRST(&ie->ie_handlers) != NULL)
442 return (ie);
448 struct intr_event *ie;
467 ie = intr_lookup(irq);
468 if (ie == NULL)
472 return (intr_event_bind(ie, cpu));
474 return (intr_event_bind_irqonly(ie, cpu));
476 return (intr_event_bind_ithread(ie, cpu));
485 struct intr_event *ie;
493 ie = intr_lookup(irq);
494 if (ie == NULL)
502 mtx_lock(&ie->ie_lock);
503 if (ie->ie_cpu == NOCPU)
506 CPU_SET(ie->ie_cpu, mask);
507 mtx_unlock(&ie->ie_lock);
510 mtx_lock(&ie->ie_lock);
511 if (ie->ie_thread == NULL) {
512 mtx_unlock(&ie->ie_lock);
515 id = ie->ie_thread->it_thread->td_tid;
516 mtx_unlock(&ie->ie_lock);
530 intr_event_destroy(struct intr_event *ie)
533 if (ie == NULL)
537 mtx_lock(&ie->ie_lock);
538 if (!CK_SLIST_EMPTY(&ie->ie_handlers)) {
539 mtx_unlock(&ie->ie_lock);
543 TAILQ_REMOVE(&event_list, ie, ie_list);
545 if (ie->ie_thread != NULL)
546 ithread_destroy(ie->ie_thread);
547 mtx_unlock(&ie->ie_lock);
548 mtx_destroy(&ie->ie_lock);
549 free(ie, M_ITHREAD);
580 struct intr_event *ie;
584 ie = ithread->it_event;
586 mtx_assert(&ie->ie_lock, MA_OWNED);
588 CTR2(KTR_INTR, "%s: killing %s", __func__, ie->ie_name);
597 while (ie->ie_thread != NULL)
598 msleep(ithread, &ie->ie_lock, 0, "ithd_dth", 0);
602 intr_event_add_handler(struct intr_event *ie, const char *name,
610 if (ie == NULL || name == NULL || (handler == NULL && filter == NULL))
625 ih->ih_event = ie;
637 mtx_lock(&ie->ie_lock);
638 if (!CK_SLIST_EMPTY(&ie->ie_handlers)) {
640 (CK_SLIST_FIRST(&ie->ie_handlers)->ih_flags & IH_EXCLUSIVE)) {
641 mtx_unlock(&ie->ie_lock);
647 ie->ie_flags |= IE_SLEEPABLE;
650 while (ie->ie_thread == NULL && handler != NULL) {
651 if (ie->ie_flags & IE_ADDING_THREAD)
652 msleep(ie, &ie->ie_lock, 0, "ithread", 0);
654 ie->ie_flags |= IE_ADDING_THREAD;
655 mtx_unlock(&ie->ie_lock);
657 mtx_lock(&ie->ie_lock);
658 ie->ie_flags &= ~IE_ADDING_THREAD;
659 ie->ie_thread = it;
660 it->it_event = ie;
662 wakeup(ie);
667 CK_SLIST_FOREACH_PREVPTR(temp_ih, prevptr, &ie->ie_handlers, ih_next) {
673 intr_event_update(ie);
676 ie->ie_name);
677 mtx_unlock(&ie->ie_lock);
689 intr_event_describe_handler(struct intr_event *ie, void *cookie,
696 mtx_lock(&ie->ie_lock);
698 CK_SLIST_FOREACH(ih, &ie->ie_handlers, ih_next) {
703 mtx_unlock(&ie->ie_lock);
704 panic("handler %p not found in interrupt event %p", cookie, ie);
727 mtx_unlock(&ie->ie_lock);
734 intr_event_update(ie);
735 mtx_unlock(&ie->ie_lock);
747 struct intr_event *ie;
752 ie = ih->ih_event;
753 KASSERT(ie != NULL,
756 return (ie->ie_source);
764 intr_event_barrier(struct intr_event *ie)
768 mtx_assert(&ie->ie_lock, MA_OWNED);
769 phase = ie->ie_phase;
775 KASSERT(ie->ie_active[!phase] == 0, ("idle phase has activity"));
776 atomic_store_rel_int(&ie->ie_phase, !phase);
793 while (ie->ie_active[phase] > 0)
801 struct intr_event *ie;
803 ie = handler->ih_event;
804 mtx_assert(&ie->ie_lock, MA_OWNED);
808 if (ie->ie_thread == NULL) {
809 intr_event_barrier(ie);
814 intr_event_schedule_thread(ie, NULL);
817 msleep(handler, &ie->ie_lock, 0, "ih_barr", 0);
830 struct intr_event *ie;
834 ie = intr_lookup(irq);
835 if (ie == NULL)
837 if (ie->ie_thread == NULL)
839 ithd = ie->ie_thread;
863 struct intr_event *ie;
869 ie = handler->ih_event;
870 KASSERT(ie != NULL,
874 mtx_lock(&ie->ie_lock);
876 ie->ie_name);
877 CK_SLIST_FOREACH_PREVPTR(ih, prevptr, &ie->ie_handlers, ih_next) {
883 "interrupt event \"%s\"", handler->ih_name, ie->ie_name);
886 if (ie->ie_thread == NULL) {
895 intr_event_barrier(ie);
905 intr_event_schedule_thread(ie, NULL);
907 msleep(handler, &ie->ie_lock, 0, "iev_rmh", 0);
909 intr_event_update(ie);
910 mtx_unlock(&ie->ie_lock);
919 struct intr_event *ie;
923 ie = handler->ih_event;
924 KASSERT(ie != NULL,
927 mtx_lock(&ie->ie_lock);
930 mtx_unlock(&ie->ie_lock);
938 struct intr_event *ie;
942 ie = handler->ih_event;
943 KASSERT(ie != NULL,
951 mtx_lock(&ie->ie_lock);
954 mtx_unlock(&ie->ie_lock);
959 intr_event_schedule_thread(struct intr_event *ie, struct trapframe *frame)
969 if (ie == NULL || CK_SLIST_EMPTY(&ie->ie_handlers) ||
970 ie->ie_thread == NULL)
974 it = ie->ie_thread;
981 if (ie->ie_hflags & IH_ENTROPY) {
982 entropy.event = (uintptr_t)ie;
987 KASSERT(td->td_proc != NULL, ("ithread %s has no process", ie->ie_name));
1045 struct intr_event *ie;
1051 ie = (eventp != NULL) ? *eventp : NULL;
1053 if (ie != NULL) {
1054 if (!(ie->ie_flags & IE_SOFT))
1057 error = intr_event_create(&ie, NULL, IE_SOFT, 0,
1062 *eventp = ie;
1065 error = intr_event_add_handler(ie, name, NULL, handler, arg,
1078 struct intr_event *ie = ih->ih_event;
1082 CTR3(KTR_INTR, "swi_sched: %s %s need=%d", ie->ie_name, ih->ih_name,
1103 KASSERT(ie == clk_intr_event,
1109 error = intr_event_schedule_thread(ie, NULL);
1128 intr_event_execute_handlers(struct proc *p, struct intr_event *ie)
1133 CK_SLIST_FOREACH_SAFE(ih, &ie->ie_handlers, ih_next, ihn) {
1139 mtx_lock(&ie->ie_lock);
1141 CK_SLIST_REMOVE_HEAD(&ie->ie_handlers, ih_next);
1146 mtx_unlock(&ie->ie_lock);
1157 mtx_lock(&ie->ie_lock);
1160 mtx_unlock(&ie->ie_lock);
1180 if ((ie->ie_flags & IE_SOFT) != 0 &&
1198 ithread_execute_handlers(struct proc *p, struct intr_event *ie)
1202 if (!(ie->ie_flags & (IE_SOFT | IE_SLEEPABLE)))
1204 intr_event_execute_handlers(p, ie);
1205 if (!(ie->ie_flags & (IE_SOFT | IE_SLEEPABLE)))
1219 ie->ie_count >= intr_storm_threshold &&
1220 (ie->ie_flags & IE_SOFT) == 0)) {
1222 if (ppsratecheck(&ie->ie_warntm, &ie->ie_warncnt, 1)) {
1225 ie->ie_name);
1229 ie->ie_count++;
1235 if (ie->ie_post_ithread != NULL)
1236 ie->ie_post_ithread(ie->ie_source);
1247 struct intr_event *ie;
1258 ie = ithd->it_event;
1259 ie->ie_count = 0;
1272 mtx_lock(&ie->ie_lock);
1273 ie->ie_thread = NULL;
1275 mtx_unlock(&ie->ie_lock);
1291 (atomic_load_int(&ie->ie_hflags) & IH_NET) != 0;
1297 ithread_execute_handlers(p, ie);
1319 ie->ie_count = 0;
1334 * o ie: the event connected to this interrupt.
1345 intr_event_handle(struct intr_event *ie, struct trapframe *frame)
1361 if (ie == NULL || CK_SLIST_EMPTY(&ie->ie_handlers))
1375 phase = ie->ie_phase;
1376 atomic_add_int(&ie->ie_active[phase], 1);
1384 CK_SLIST_FOREACH(ih, &ie->ie_handlers, ih_next) {
1387 if ((ie->ie_flags & IE_SOFT) != 0 && ih->ih_need == 0)
1433 atomic_add_rel_int(&ie->ie_active[phase], -1);
1438 if (ie->ie_pre_ithread != NULL)
1439 ie->ie_pre_ithread(ie->ie_source);
1441 if (ie->ie_post_filter != NULL)
1442 ie->ie_post_filter(ie->ie_source);
1449 error = intr_event_schedule_thread(ie, frame);
1541 db_dump_intr_event(struct intr_event *ie, int handlers)
1547 db_printf("%s ", ie->ie_fullname);
1548 it = ie->ie_thread;
1553 if ((ie->ie_flags & (IE_SOFT | IE_ADDING_THREAD)) != 0 ||
1557 if (ie->ie_flags & IE_SOFT) {
1561 if (ie->ie_flags & IE_ADDING_THREAD) {
1577 CK_SLIST_FOREACH(ih, &ie->ie_handlers, ih_next)
1586 struct intr_event *ie;
1591 TAILQ_FOREACH(ie, &event_list, ie_list) {
1592 if (!all && CK_SLIST_EMPTY(&ie->ie_handlers))
1594 db_dump_intr_event(ie, verbose);