Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 24 May 2018 17:06:01 +0000 (UTC)
From:      Conrad Meyer <cem@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r334170 - in head/sys: arm/conf conf dev/asmc kern modules/asmc
Message-ID:  <201805241706.w4OH61Sd085792@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: cem
Date: Thu May 24 17:06:00 2018
New Revision: 334170
URL: https://svnweb.freebsd.org/changeset/base/334170

Log:
  Yank crufty INTR_FILTER option
  
  It was introduced to the tree in r169320 and r169321 in May 2007.
  
  It never got much use and never became a kernel default.  The code
  duplicates the default path quite a bit, with slight modifications.  Just
  yank out the cruft.  Whatever goals were being aimed for can probably be met
  within the existing framework, without a flag day option.
  
  Mostly mechanical change: 'unifdef -m -UINTR_FILTER'.
  
  Reviewed by:	mmacy
  Sponsored by:	Dell EMC Isilon
  Differential Revision:	https://reviews.freebsd.org/D15546

Modified:
  head/sys/arm/conf/CRB
  head/sys/conf/options
  head/sys/dev/asmc/asmc.c
  head/sys/kern/kern_intr.c
  head/sys/modules/asmc/Makefile

Modified: head/sys/arm/conf/CRB
==============================================================================
--- head/sys/arm/conf/CRB	Thu May 24 17:05:41 2018	(r334169)
+++ head/sys/arm/conf/CRB	Thu May 24 17:06:00 2018	(r334170)
@@ -52,7 +52,6 @@ options 	CD9660			# ISO 9660 Filesystem
 options 	PSEUDOFS		# Pseudo-filesystem framework
 options 	SCSI_DELAY=5000		# Delay (in ms) before probing SCSI
 options 	KTRACE			# ktrace(1) support
-options 	INTR_FILTER
 options 	SYSVSHM			# SYSV-style shared memory
 options 	SYSVMSG			# SYSV-style message queues
 options 	SYSVSEM			# SYSV-style semaphores

Modified: head/sys/conf/options
==============================================================================
--- head/sys/conf/options	Thu May 24 17:05:41 2018	(r334169)
+++ head/sys/conf/options	Thu May 24 17:06:00 2018	(r334170)
@@ -904,9 +904,6 @@ HWPMC_DEBUG		opt_global.h
 HWPMC_HOOKS
 HWPMC_MIPS_BACKTRACE 	opt_hwpmc_hooks.h
 
-# Interrupt filtering
-INTR_FILTER
-
 # 802.11 support layer
 IEEE80211_DEBUG		opt_wlan.h
 IEEE80211_DEBUG_REFCNT	opt_wlan.h

Modified: head/sys/dev/asmc/asmc.c
==============================================================================
--- head/sys/dev/asmc/asmc.c	Thu May 24 17:05:41 2018	(r334169)
+++ head/sys/dev/asmc/asmc.c	Thu May 24 17:06:00 2018	(r334170)
@@ -57,8 +57,6 @@ __FBSDID("$FreeBSD$");
 #include <dev/acpica/acpivar.h>
 #include <dev/asmc/asmcvar.h>
 
-#include "opt_intr_filter.h"
-
 /*
  * Device interface.
  */
@@ -85,9 +83,6 @@ static int 	asmc_temp_getvalue(device_t dev, const cha
 static int 	asmc_sms_read(device_t, const char *key, int16_t *val);
 static void 	asmc_sms_calibrate(device_t dev);
 static int 	asmc_sms_intrfast(void *arg);
-#ifdef INTR_FILTER
-static void 	asmc_sms_handler(void *arg);
-#endif
 static void 	asmc_sms_printintr(device_t dev, uint8_t);
 static void 	asmc_sms_task(void *arg, int pending);
 #ifdef DEBUG
@@ -563,13 +558,11 @@ asmc_attach(device_t dev)
 	 * We only need to do this for the non INTR_FILTER case.
 	 */
 	sc->sc_sms_tq = NULL;
-#ifndef INTR_FILTER
 	TASK_INIT(&sc->sc_sms_task, 0, asmc_sms_task, sc);
 	sc->sc_sms_tq = taskqueue_create_fast("asmc_taskq", M_WAITOK,
 	    taskqueue_thread_enqueue, &sc->sc_sms_tq);
 	taskqueue_start_threads(&sc->sc_sms_tq, 1, PI_REALTIME, "%s sms taskq",
 	    device_get_nameunit(dev));
-#endif
 	/*
 	 * Allocate an IRQ for the SMS.
 	 */
@@ -584,11 +577,7 @@ asmc_attach(device_t dev)
 
 	ret = bus_setup_intr(dev, sc->sc_irq,
 	          INTR_TYPE_MISC | INTR_MPSAFE,
-#ifdef INTR_FILTER
-	    asmc_sms_intrfast, asmc_sms_handler,
-#else
 	    asmc_sms_intrfast, NULL,
-#endif
 	    dev, &sc->sc_cookie);
 
 	if (ret) {
@@ -1241,23 +1230,10 @@ asmc_sms_intrfast(void *arg)
 	sc->sc_sms_intrtype = type;
 	asmc_sms_printintr(dev, type);
 
-#ifdef INTR_FILTER
-	return (FILTER_SCHEDULE_THREAD | FILTER_HANDLED);
-#else
 	taskqueue_enqueue(sc->sc_sms_tq, &sc->sc_sms_task);
-#endif
 	return (FILTER_HANDLED);
 }
 
-#ifdef INTR_FILTER
-static void
-asmc_sms_handler(void *arg)
-{
-	struct asmc_softc *sc = device_get_softc(arg);
-
-	asmc_sms_task(sc, 0);
-}
-#endif
 
 
 static void

Modified: head/sys/kern/kern_intr.c
==============================================================================
--- head/sys/kern/kern_intr.c	Thu May 24 17:05:41 2018	(r334169)
+++ head/sys/kern/kern_intr.c	Thu May 24 17:06:00 2018	(r334170)
@@ -101,24 +101,11 @@ static struct mtx event_lock;
 MTX_SYSINIT(intr_event_list, &event_lock, "intr event list", MTX_DEF);
 
 static void	intr_event_update(struct intr_event *ie);
-#ifdef INTR_FILTER
-static int	intr_event_schedule_thread(struct intr_event *ie,
-		    struct intr_thread *ithd);
-static int	intr_filter_loop(struct intr_event *ie,
-		    struct trapframe *frame, struct intr_thread **ithd);
-static struct intr_thread *ithread_create(const char *name,
-			      struct intr_handler *ih);
-#else
 static int	intr_event_schedule_thread(struct intr_event *ie);
 static struct intr_thread *ithread_create(const char *name);
-#endif
 static void	ithread_destroy(struct intr_thread *ithread);
 static void	ithread_execute_handlers(struct proc *p, 
 		    struct intr_event *ie);
-#ifdef INTR_FILTER
-static void	priv_ithread_execute_handler(struct proc *p, 
-		    struct intr_handler *ih);
-#endif
 static void	ithread_loop(void *);
 static void	ithread_update(struct intr_thread *ithd);
 static void	start_softintr(void *);
@@ -506,7 +493,6 @@ intr_event_destroy(struct intr_event *ie)
 	return (0);
 }
 
-#ifndef INTR_FILTER
 static struct intr_thread *
 ithread_create(const char *name)
 {
@@ -530,32 +516,7 @@ ithread_create(const char *name)
 	CTR2(KTR_INTR, "%s: created %s", __func__, name);
 	return (ithd);
 }
-#else
-static struct intr_thread *
-ithread_create(const char *name, struct intr_handler *ih)
-{
-	struct intr_thread *ithd;
-	struct thread *td;
-	int error;
 
-	ithd = malloc(sizeof(struct intr_thread), M_ITHREAD, M_WAITOK | M_ZERO);
-
-	error = kproc_kthread_add(ithread_loop, ih, &intrproc,
-		    &td, RFSTOPPED | RFHIGHPID,
-	    	    0, "intr", "%s", name);
-	if (error)
-		panic("kproc_create() failed with %d", error);
-	thread_lock(td);
-	sched_class(td, PRI_ITHD);
-	TD_SET_IWAIT(td);
-	thread_unlock(td);
-	td->td_pflags |= TDP_ITHREAD;
-	ithd->it_thread = td;
-	CTR2(KTR_INTR, "%s: created %s", __func__, name);
-	return (ithd);
-}
-#endif
-
 static void
 ithread_destroy(struct intr_thread *ithread)
 {
@@ -572,7 +533,6 @@ ithread_destroy(struct intr_thread *ithread)
 	thread_unlock(td);
 }
 
-#ifndef INTR_FILTER
 int
 intr_event_add_handler(struct intr_event *ie, const char *name,
     driver_filter_t filter, driver_intr_t handler, void *arg, u_char pri,
@@ -646,91 +606,7 @@ intr_event_add_handler(struct intr_event *ie, const ch
 		*cookiep = ih;
 	return (0);
 }
-#else
-int
-intr_event_add_handler(struct intr_event *ie, const char *name,
-    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;
 
-	if (ie == NULL || name == NULL || (handler == NULL && filter == NULL))
-		return (EINVAL);
-
-	/* 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;
-	strlcpy(ih->ih_name, name, sizeof(ih->ih_name));
-	ih->ih_event = ie;
-	ih->ih_pri = pri;
-	if (flags & INTR_EXCL)
-		ih->ih_flags = IH_EXCLUSIVE;
-	if (flags & INTR_MPSAFE)
-		ih->ih_flags |= IH_MPSAFE;
-	if (flags & INTR_ENTROPY)
-		ih->ih_flags |= IH_ENTROPY;
-
-	/* We can only have one exclusive handler in a event. */
-	mtx_lock(&ie->ie_lock);
-	if (!TAILQ_EMPTY(&ie->ie_handlers)) {
-		if ((flags & INTR_EXCL) ||
-		    (TAILQ_FIRST(&ie->ie_handlers)->ih_flags & IH_EXCLUSIVE)) {
-			mtx_unlock(&ie->ie_lock);
-			free(ih, M_ITHREAD);
-			return (EINVAL);
-		}
-	}
-
-	/* For filtered handlers, create a private ithread to run on. */
-	if (filter != NULL && handler != NULL) {
-		mtx_unlock(&ie->ie_lock);
-		it = ithread_create("intr: newborn", ih);
-		mtx_lock(&ie->ie_lock);
-		it->it_event = ie;
-		ih->ih_thread = it;
-		ithread_update(it); /* XXX - do we really need this?!?!? */
-	} else { /* Create the global per-event thread if we need one. */
-		while (ie->ie_thread == NULL && handler != NULL) {
-			if (ie->ie_flags & IE_ADDING_THREAD)
-				msleep(ie, &ie->ie_lock, 0, "ithread", 0);
-			else {
-				ie->ie_flags |= IE_ADDING_THREAD;
-				mtx_unlock(&ie->ie_lock);
-				it = ithread_create("intr: newborn", ih);
-				mtx_lock(&ie->ie_lock);
-				ie->ie_flags &= ~IE_ADDING_THREAD;
-				ie->ie_thread = it;
-				it->it_event = ie;
-				ithread_update(it);
-				wakeup(ie);
-			}
-		}
-	}
-
-	/* Add the new handler to the event in priority order. */
-	TAILQ_FOREACH(temp_ih, &ie->ie_handlers, ih_next) {
-		if (temp_ih->ih_pri > ih->ih_pri)
-			break;
-	}
-	if (temp_ih == NULL)
-		TAILQ_INSERT_TAIL(&ie->ie_handlers, ih, ih_next);
-	else
-		TAILQ_INSERT_BEFORE(temp_ih, ih, ih_next);
-	intr_event_update(ie);
-
-	CTR3(KTR_INTR, "%s: added %s to %s", __func__, ih->ih_name,
-	    ie->ie_name);
-	mtx_unlock(&ie->ie_lock);
-
-	if (cookiep != NULL)
-		*cookiep = ih;
-	return (0);
-}
-#endif
-
 /*
  * Append a description preceded by a ':' to the name of the specified
  * interrupt handler.
@@ -846,7 +722,6 @@ _intr_drain(int irq)
 }
 
 
-#ifndef INTR_FILTER
 int
 intr_event_remove_handler(void *cookie)
 {
@@ -997,169 +872,7 @@ intr_event_schedule_thread(struct intr_event *ie)
 
 	return (0);
 }
-#else
-int
-intr_event_remove_handler(void *cookie)
-{
-	struct intr_handler *handler = (struct intr_handler *)cookie;
-	struct intr_event *ie;
-	struct intr_thread *it;
-#ifdef INVARIANTS
-	struct intr_handler *ih;
-#endif
-#ifdef notyet
-	int dead;
-#endif
 
-	if (handler == NULL)
-		return (EINVAL);
-	ie = handler->ih_event;
-	KASSERT(ie != NULL,
-	    ("interrupt handler \"%s\" has a NULL interrupt event",
-	    handler->ih_name));
-	mtx_lock(&ie->ie_lock);
-	CTR3(KTR_INTR, "%s: removing %s from %s", __func__, handler->ih_name,
-	    ie->ie_name);
-#ifdef INVARIANTS
-	TAILQ_FOREACH(ih, &ie->ie_handlers, ih_next)
-		if (ih == handler)
-			goto ok;
-	mtx_unlock(&ie->ie_lock);
-	panic("interrupt handler \"%s\" not found in interrupt event \"%s\"",
-	    ih->ih_name, ie->ie_name);
-ok:
-#endif
-	/*
-	 * If there are no ithreads (per event and per handler), then
-	 * just remove the handler and return.  
-	 * XXX: Note that an INTR_FAST handler might be running on another CPU!
-	 */
-	if (ie->ie_thread == NULL && handler->ih_thread == NULL) {
-		TAILQ_REMOVE(&ie->ie_handlers, handler, ih_next);
-		mtx_unlock(&ie->ie_lock);
-		free(handler, M_ITHREAD);
-		return (0);
-	}
-
-	/* Private or global ithread? */
-	it = (handler->ih_thread) ? handler->ih_thread : ie->ie_thread;
-	/*
-	 * If the interrupt thread is already running, then just mark this
-	 * handler as being dead and let the ithread do the actual removal.
-	 *
-	 * During a cold boot while cold is set, msleep() does not sleep,
-	 * so we have to remove the handler here rather than letting the
-	 * thread do it.
-	 */
-	thread_lock(it->it_thread);
-	if (!TD_AWAITING_INTR(it->it_thread) && !cold) {
-		handler->ih_flags |= IH_DEAD;
-
-		/*
-		 * Ensure that the thread will process the handler list
-		 * again and remove this handler if it has already passed
-		 * it on the list.
-		 *
-		 * The release part of the following store ensures
-		 * that the update of ih_flags is ordered before the
-		 * it_need setting.  See the comment before
-		 * atomic_cmpset_acq(&ithd->it_need, ...) operation in
-		 * the ithread_execute_handlers().
-		 */
-		atomic_store_rel_int(&it->it_need, 1);
-	} else
-		TAILQ_REMOVE(&ie->ie_handlers, handler, ih_next);
-	thread_unlock(it->it_thread);
-	while (handler->ih_flags & IH_DEAD)
-		msleep(handler, &ie->ie_lock, 0, "iev_rmh", 0);
-	/* 
-	 * At this point, the handler has been disconnected from the event,
-	 * so we can kill the private ithread if any.
-	 */
-	if (handler->ih_thread) {
-		ithread_destroy(handler->ih_thread);
-		handler->ih_thread = NULL;
-	}
-	intr_event_update(ie);
-#ifdef notyet
-	/*
-	 * XXX: This could be bad in the case of ppbus(8).  Also, I think
-	 * this could lead to races of stale data when servicing an
-	 * interrupt.
-	 */
-	dead = 1;
-	TAILQ_FOREACH(ih, &ie->ie_handlers, ih_next) {
-		if (handler != NULL) {
-			dead = 0;
-			break;
-		}
-	}
-	if (dead) {
-		ithread_destroy(ie->ie_thread);
-		ie->ie_thread = NULL;
-	}
-#endif
-	mtx_unlock(&ie->ie_lock);
-	free(handler, M_ITHREAD);
-	return (0);
-}
-
-static int
-intr_event_schedule_thread(struct intr_event *ie, struct intr_thread *it)
-{
-	struct intr_entropy entropy;
-	struct thread *td;
-	struct thread *ctd;
-	struct proc *p;
-
-	/*
-	 * If no ithread or no handlers, then we have a stray interrupt.
-	 */
-	if (ie == NULL || TAILQ_EMPTY(&ie->ie_handlers) || it == NULL)
-		return (EINVAL);
-
-	ctd = curthread;
-	td = it->it_thread;
-	p = td->td_proc;
-
-	/*
-	 * If any of the handlers for this ithread claim to be good
-	 * sources of entropy, then gather some.
-	 */
-	if (ie->ie_flags & IE_ENTROPY) {
-		entropy.event = (uintptr_t)ie;
-		entropy.td = ctd;
-		random_harvest_queue(&entropy, sizeof(entropy), 2, RANDOM_INTERRUPT);
-	}
-
-	KASSERT(p != NULL, ("ithread %s has no process", ie->ie_name));
-
-	/*
-	 * Set it_need to tell the thread to keep running if it is already
-	 * running.  Then, lock the thread and see if we actually need to
-	 * put it on the runqueue.
-	 *
-	 * Use store_rel to arrange that the store to ih_need in
-	 * swi_sched() is before the store to it_need and prepare for
-	 * transfer of this order to loads in the ithread.
-	 */
-	atomic_store_rel_int(&it->it_need, 1);
-	thread_lock(td);
-	if (TD_AWAITING_INTR(td)) {
-		CTR3(KTR_INTR, "%s: schedule pid %d (%s)", __func__, p->p_pid,
-		    td->td_name);
-		TD_CLR_IWAIT(td);
-		sched_add(td, SRQ_INTR);
-	} else {
-		CTR5(KTR_INTR, "%s: pid %d (%s): it_need %d, state %d",
-		    __func__, p->p_pid, td->td_name, it->it_need, td->td_state);
-	}
-	thread_unlock(td);
-
-	return (0);
-}
-#endif
-
 /*
  * Allow interrupt event binding for software interrupt handlers -- a no-op,
  * since interrupts are generated in software rather than being directed by
@@ -1231,11 +944,7 @@ swi_sched(void *cookie, int flags)
 
 	if (!(flags & SWI_DELAY)) {
 		VM_CNT_INC(v_soft);
-#ifdef INTR_FILTER
-		error = intr_event_schedule_thread(ie, ie->ie_thread);
-#else
 		error = intr_event_schedule_thread(ie);
-#endif
 		KASSERT(error == 0, ("stray software interrupt"));
 	}
 }
@@ -1253,39 +962,7 @@ swi_remove(void *cookie)
 	return (intr_event_remove_handler(cookie));
 }
 
-#ifdef INTR_FILTER
-static void
-priv_ithread_execute_handler(struct proc *p, struct intr_handler *ih)
-{
-	struct intr_event *ie;
 
-	ie = ih->ih_event;
-	/*
-	 * If this handler is marked for death, remove it from
-	 * the list of handlers and wake up the sleeper.
-	 */
-	if (ih->ih_flags & IH_DEAD) {
-		mtx_lock(&ie->ie_lock);
-		TAILQ_REMOVE(&ie->ie_handlers, ih, ih_next);
-		ih->ih_flags &= ~IH_DEAD;
-		wakeup(ih);
-		mtx_unlock(&ie->ie_lock);
-		return;
-	}
-	
-	/* Execute this handler. */
-	CTR6(KTR_INTR, "%s: pid %d exec %p(%p) for %s flg=%x",
-	     __func__, p->p_pid, (void *)ih->ih_handler, ih->ih_argument,
-	     ih->ih_name, ih->ih_flags);
-	
-	if (!(ih->ih_flags & IH_MPSAFE))
-		mtx_lock(&Giant);
-	ih->ih_handler(ih->ih_argument);
-	if (!(ih->ih_flags & IH_MPSAFE))
-		mtx_unlock(&Giant);
-}
-#endif
-
 /*
  * This is a public function for use by drivers that mux interrupt
  * handlers for child devices from their interrupt handler.
@@ -1380,7 +1057,6 @@ ithread_execute_handlers(struct proc *p, struct intr_e
 		ie->ie_post_ithread(ie->ie_source);
 }
 
-#ifndef INTR_FILTER
 /*
  * This is the main code for interrupt threads.
  */
@@ -1554,222 +1230,6 @@ intr_event_handle(struct intr_event *ie, struct trapfr
 	td->td_intr_nesting_level--;
 	return (0);
 }
-#else
-/*
- * This is the main code for interrupt threads.
- */
-static void
-ithread_loop(void *arg)
-{
-	struct intr_thread *ithd;
-	struct intr_handler *ih;
-	struct intr_event *ie;
-	struct thread *td;
-	struct proc *p;
-	int priv;
-	int wake;
-
-	td = curthread;
-	p = td->td_proc;
-	ih = (struct intr_handler *)arg;
-	priv = (ih->ih_thread != NULL) ? 1 : 0;
-	ithd = (priv) ? ih->ih_thread : ih->ih_event->ie_thread;
-	KASSERT(ithd->it_thread == td,
-	    ("%s: ithread and proc linkage out of sync", __func__));
-	ie = ithd->it_event;
-	ie->ie_count = 0;
-	wake = 0;
-
-	/*
-	 * As long as we have interrupts outstanding, go through the
-	 * list of handlers, giving each one a go at it.
-	 */
-	for (;;) {
-		/*
-		 * If we are an orphaned thread, then just die.
-		 */
-		if (ithd->it_flags & IT_DEAD) {
-			CTR3(KTR_INTR, "%s: pid %d (%s) exiting", __func__,
-			    p->p_pid, td->td_name);
-			free(ithd, M_ITHREAD);
-			kthread_exit();
-		}
-
-		/*
-		 * Service interrupts.  If another interrupt arrives while
-		 * we are running, it will set it_need to note that we
-		 * should make another pass.
-		 *
-		 * The load_acq part of the following cmpset ensures
-		 * that the load of ih_need in ithread_execute_handlers()
-		 * is ordered after the load of it_need here.
-		 */
-		while (atomic_cmpset_acq_int(&ithd->it_need, 1, 0) != 0) {
-			if (priv)
-				priv_ithread_execute_handler(p, ih);
-			else 
-				ithread_execute_handlers(p, ie);
-		}
-		WITNESS_WARN(WARN_PANIC, NULL, "suspending ithread");
-		mtx_assert(&Giant, MA_NOTOWNED);
-
-		/*
-		 * Processed all our interrupts.  Now get the sched
-		 * lock.  This may take a while and it_need may get
-		 * set again, so we have to check it again.
-		 */
-		thread_lock(td);
-		if (atomic_load_acq_int(&ithd->it_need) == 0 &&
-		    (ithd->it_flags & (IT_DEAD | IT_WAIT)) == 0) {
-			TD_SET_IWAIT(td);
-			ie->ie_count = 0;
-			mi_switch(SW_VOL | SWT_IWAIT, NULL);
-		}
-		if (ithd->it_flags & IT_WAIT) {
-			wake = 1;
-			ithd->it_flags &= ~IT_WAIT;
-		}
-		thread_unlock(td);
-		if (wake) {
-			wakeup(ithd);
-			wake = 0;
-		}
-	}
-}
-
-/* 
- * Main loop for interrupt filter.
- *
- * Some architectures (i386, amd64 and arm) require the optional frame 
- * parameter, and use it as the main argument for fast handler execution
- * when ih_argument == NULL.
- *
- * Return value:
- * o FILTER_STRAY:              No filter recognized the event, and no
- *                              filter-less handler is registered on this 
- *                              line.
- * o FILTER_HANDLED:            A filter claimed the event and served it.
- * o FILTER_SCHEDULE_THREAD:    No filter claimed the event, but there's at
- *                              least one filter-less handler on this line.
- * o FILTER_HANDLED | 
- *   FILTER_SCHEDULE_THREAD:    A filter claimed the event, and asked for
- *                              scheduling the per-handler ithread.
- *
- * In case an ithread has to be scheduled, in *ithd there will be a 
- * pointer to a struct intr_thread containing the thread to be
- * scheduled.
- */
-
-static int
-intr_filter_loop(struct intr_event *ie, struct trapframe *frame, 
-		 struct intr_thread **ithd) 
-{
-	struct intr_handler *ih;
-	void *arg;
-	int ret, thread_only;
-
-	ret = 0;
-	thread_only = 0;
-	TAILQ_FOREACH(ih, &ie->ie_handlers, ih_next) {
-		/*
-		 * Execute fast interrupt handlers directly.
-		 * To support clock handlers, if a handler registers
-		 * with a NULL argument, then we pass it a pointer to
-		 * a trapframe as its argument.
-		 */
-		arg = ((ih->ih_argument == NULL) ? frame : ih->ih_argument);
-		
-		CTR5(KTR_INTR, "%s: exec %p/%p(%p) for %s", __func__,
-		     ih->ih_filter, ih->ih_handler, arg, ih->ih_name);
-
-		if (ih->ih_filter != NULL)
-			ret = ih->ih_filter(arg);
-		else {
-			thread_only = 1;
-			continue;
-		}
-		KASSERT(ret == FILTER_STRAY ||
-		    ((ret & (FILTER_SCHEDULE_THREAD | FILTER_HANDLED)) != 0 &&
-		    (ret & ~(FILTER_SCHEDULE_THREAD | FILTER_HANDLED)) == 0),
-		    ("%s: incorrect return value %#x from %s", __func__, ret,
-		    ih->ih_name));
-		if (ret & FILTER_STRAY)
-			continue;
-		else { 
-			*ithd = ih->ih_thread;
-			return (ret);
-		}
-	}
-
-	/*
-	 * No filters handled the interrupt and we have at least
-	 * one handler without a filter.  In this case, we schedule
-	 * all of the filter-less handlers to run in the ithread.
-	 */	
-	if (thread_only) {
-		*ithd = ie->ie_thread;
-		return (FILTER_SCHEDULE_THREAD);
-	}
-	return (FILTER_STRAY);
-}
-
-/*
- * Main interrupt handling body.
- *
- * Input:
- * o ie:                        the event connected to this interrupt.
- * o frame:                     some archs (i.e. i386) pass a frame to some.
- *                              handlers as their main argument.
- * Return value:
- * o 0:                         everything ok.
- * o EINVAL:                    stray interrupt.
- */
-int
-intr_event_handle(struct intr_event *ie, struct trapframe *frame)
-{
-	struct intr_thread *ithd;
-	struct trapframe *oldframe;
-	struct thread *td;
-	int thread;
-
-	ithd = NULL;
-	td = curthread;
-
-	if (ie == NULL || TAILQ_EMPTY(&ie->ie_handlers))
-		return (EINVAL);
-
-	td->td_intr_nesting_level++;
-	thread = 0;
-	critical_enter();
-	oldframe = td->td_intr_frame;
-	td->td_intr_frame = frame;
-	thread = intr_filter_loop(ie, frame, &ithd);	
-	if (thread & FILTER_HANDLED) {
-		if (ie->ie_post_filter != NULL)
-			ie->ie_post_filter(ie->ie_source);
-	} else {
-		if (ie->ie_pre_ithread != NULL)
-			ie->ie_pre_ithread(ie->ie_source);
-	}
-	td->td_intr_frame = oldframe;
-	critical_exit();
-	
-	/* Interrupt storm logic */
-	if (thread & FILTER_STRAY) {
-		ie->ie_count++;
-		if (ie->ie_count < intr_storm_threshold)
-			printf("Interrupt stray detection not present\n");
-	}
-
-	/* Schedule an ithread if needed. */
-	if (thread & FILTER_SCHEDULE_THREAD) {
-		if (intr_event_schedule_thread(ie, ithd) != 0)
-			panic("%s: impossible stray interrupt", __func__);
-	}
-	td->td_intr_nesting_level--;
-	return (0);
-}
-#endif
 
 #ifdef DDB
 /*

Modified: head/sys/modules/asmc/Makefile
==============================================================================
--- head/sys/modules/asmc/Makefile	Thu May 24 17:05:41 2018	(r334169)
+++ head/sys/modules/asmc/Makefile	Thu May 24 17:06:00 2018	(r334170)
@@ -3,6 +3,6 @@
 .PATH: ${SRCTOP}/sys/dev/asmc
 
 KMOD=	asmc
-SRCS=	asmc.c opt_acpi.h opt_intr_filter.h acpi_if.h bus_if.h device_if.h
+SRCS=	asmc.c opt_acpi.h acpi_if.h bus_if.h device_if.h
 
 .include <bsd.kmod.mk>



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201805241706.w4OH61Sd085792>