Date: Sat, 24 Jun 2006 11:35:31 GMT From: Paolo Pisati <piso@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 99929 for review Message-ID: <200606241135.k5OBZVZU038137@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=99929 Change 99929 by piso@piso_newluxor on 2006/06/24 11:34:33 Convert some bus_setup_intr() methods to the interrupt filter model: for now i just converted nexus on i386. Next step: reconvert all the previous marked drivers with FIX_INTR_FILTER to be real filters. Affected files ... .. //depot/projects/soc2006/intr_filter/i386/i386/intr_machdep.c#5 edit .. //depot/projects/soc2006/intr_filter/i386/i386/nexus.c#2 edit .. //depot/projects/soc2006/intr_filter/i386/include/intr_machdep.h#2 edit .. //depot/projects/soc2006/intr_filter/i386/isa/clock.c#3 edit .. //depot/projects/soc2006/intr_filter/kern/kern_intr.c#4 edit .. //depot/projects/soc2006/intr_filter/sys/interrupt.h#3 edit Differences ... ==== //depot/projects/soc2006/intr_filter/i386/i386/intr_machdep.c#5 (text+ko) ==== @@ -112,8 +112,8 @@ } int -intr_add_handler(const char *name, int vector, driver_intr_t handler, - void *arg, enum intr_type flags, void **cookiep) +intr_add_handler(const char *name, int vector, driver_filter_t filter, + driver_intr_t handler, void *arg, enum intr_type flags, void **cookiep) { struct intsrc *isrc; int error; @@ -121,8 +121,8 @@ isrc = intr_lookup_source(vector); if (isrc == NULL) return (EINVAL); - error = intr_event_add_handler(isrc->is_event, name, handler, arg, - intr_priority(flags), flags, cookiep); + error = intr_event_add_handler(isrc->is_event, name, filter, handler, + arg, intr_priority(flags), flags, cookiep); if (error == 0) { intrcnt_updatename(isrc); mtx_lock_spin(&intr_table_lock); ==== //depot/projects/soc2006/intr_filter/i386/i386/nexus.c#2 (text+ko) ==== @@ -97,7 +97,7 @@ static int nexus_release_resource(device_t, device_t, int, int, struct resource *); static int nexus_setup_intr(device_t, device_t, struct resource *, int flags, - void (*)(void *), void *, void **); + driver_filter_t, void (*)(void *), void *, void **); static int nexus_teardown_intr(device_t, device_t, struct resource *, void *); static struct resource_list *nexus_get_reslist(device_t dev, device_t child); @@ -477,7 +477,8 @@ */ static int nexus_setup_intr(device_t bus, device_t child, struct resource *irq, - int flags, void (*ihand)(void *), void *arg, void **cookiep) + int flags, driver_filter_t filter, void (*ihand)(void *), + void *arg, void **cookiep) { int error; @@ -497,7 +498,7 @@ return (error); error = intr_add_handler(device_get_nameunit(child), - rman_get_start(irq), ihand, arg, flags, cookiep); + rman_get_start(irq), filter, ihand, arg, flags, cookiep); return (error); } ==== //depot/projects/soc2006/intr_filter/i386/include/intr_machdep.h#2 (text+ko) ==== @@ -124,8 +124,8 @@ #else #define intr_add_cpu(apic_id) #endif -int intr_add_handler(const char *name, int vector, driver_intr_t handler, - void *arg, enum intr_type flags, void **cookiep); +int intr_add_handler(const char *name, int vector, driver_filter_t filter, + driver_intr_t handler, void *arg, enum intr_type flags, void **cookiep); int intr_config_intr(int vector, enum intr_trigger trig, enum intr_polarity pol); void intr_execute_handlers(struct intsrc *isrc, struct trapframe *frame); ==== //depot/projects/soc2006/intr_filter/i386/isa/clock.c#3 (text+ko) ==== @@ -824,8 +824,7 @@ * timecounter to user a simpler algorithm. */ if (!using_lapic_timer) { - // XXX - FIX_INTR_FILTER - intr_add_handler("clk", 0, (driver_intr_t *)clkintr, NULL, + intr_add_handler("clk", 0, (driver_filter_t *)clkintr, NULL, NULL, INTR_TYPE_CLK | INTR_FAST, NULL); i8254_intsrc = intr_lookup_source(0); if (i8254_intsrc != NULL) @@ -859,8 +858,7 @@ /* Enable periodic interrupts from the RTC. */ rtc_statusb |= RTCSB_PINTR; - // XXX - FIX_INTR_FILTER - intr_add_handler("rtc", 8, (driver_intr_t *)rtcintr, NULL, + intr_add_handler("rtc", 8, (driver_filter_t *)rtcintr, NULL, NULL, INTR_TYPE_CLK | INTR_FAST, NULL); writertc(RTC_STATUSB, rtc_statusb); ==== //depot/projects/soc2006/intr_filter/kern/kern_intr.c#4 (text+ko) ==== @@ -323,8 +323,8 @@ int intr_event_add_handler(struct intr_event *ie, const char *name, - driver_intr_t handler, void *arg, u_char pri, enum intr_type flags, - void **cookiep) + driver_filter_t filter, driver_intr_t handler, void *arg, u_char pri, + enum intr_type flags, void **cookiep) { struct intr_handler *ih, *temp_ih; struct intr_thread *it; @@ -334,6 +334,7 @@ /* Allocate and populate an interrupt handler structure. */ ih = malloc(sizeof(struct intr_handler), M_ITHREAD, M_WAITOK | M_ZERO); + ih->ih_filter = filter; ih->ih_handler = handler; ih->ih_argument = arg; ih->ih_name = name; @@ -568,7 +569,7 @@ if (eventp != NULL) *eventp = ie; } - return (intr_event_add_handler(ie, name, handler, arg, + return (intr_event_add_handler(ie, name, NULL, handler, arg, (pri * RQ_PPQ) + PI_SOFT, flags, cookiep)); /* XXKSE.. think of a better way to get separate queues */ } @@ -789,8 +790,8 @@ */ arg = ((ih->ih_argument == NULL) ? frame : ih->ih_argument); - CTR4(KTR_INTR, "%s: exec %p(%p) for %s", __func__, - ih->ih_handler, arg, ih->ih_name); + CTR5(KTR_INTR, "%s: exec %p/%p(%p) for %s", __func__, + ih->ih_filter, ih->ih_handler, arg, ih->ih_name); if (ih->ih_flags & IH_FAST) { // XXX - actually should call ih_filter()... ==== //depot/projects/soc2006/intr_filter/sys/interrupt.h#3 (text+ko) ==== @@ -43,6 +43,7 @@ * together. */ struct intr_handler { + driver_filter_t *ih_filter; /* Filter function. */ driver_intr_t *ih_handler; /* Handler function. */ void *ih_argument; /* Argument to pass to handler. */ int ih_flags; @@ -115,7 +116,7 @@ int intr_filter_loop(struct intr_event *ie, struct trapframe *frame); u_char intr_priority(enum intr_type flags); int intr_event_add_handler(struct intr_event *ie, const char *name, - driver_intr_t handler, void *arg, u_char pri, enum intr_type flags, + driver_filter_t filter, driver_intr_t handler, void *arg, u_char pri, enum intr_type flags, void **cookiep); int intr_event_create(struct intr_event **event, void *source, int flags, void (*enable)(void *), const char *fmt, ...)
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200606241135.k5OBZVZU038137>