summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjhb <jhb@FreeBSD.org>2000-10-25 05:19:40 +0000
committerjhb <jhb@FreeBSD.org>2000-10-25 05:19:40 +0000
commitff18363a3e5e60f38c8f7a52c7e7f4ea1c8b797f (patch)
treed0f426694e386a2b666529e1e1ad06938c3d7e83
parent08451a100d3bc5d4373e28f7acd976df25f3f785 (diff)
downloadFreeBSD-src-ff18363a3e5e60f38c8f7a52c7e7f4ea1c8b797f.zip
FreeBSD-src-ff18363a3e5e60f38c8f7a52c7e7f4ea1c8b797f.tar.gz
- Overhaul the software interrupt code to use interrupt threads for each
type of software interrupt. Roughly, what used to be a bit in spending now maps to a swi thread. Each thread can have multiple handlers, just like a hardware interrupt thread. - Instead of using a bitmask of pending interrupts, we schedule the specific software interrupt thread to run, so spending, NSWI, and the shandlers array are no longer needed. We can now have an arbitrary number of software interrupt threads. When you register a software interrupt thread via sinthand_add(), you get back a struct intrhand that you pass to sched_swi() when you wish to schedule your swi thread to run. - Convert the name of 'struct intrec' to 'struct intrhand' as it is a bit more intuitive. Also, prefix all the members of struct intrhand with 'ih_'. - Make swi_net() a MI function since there is now no point in it being MD. Submitted by: cp
-rw-r--r--sys/alpha/alpha/busdma_machdep.c4
-rw-r--r--sys/alpha/alpha/clock.c1
-rw-r--r--sys/alpha/alpha/interrupt.c50
-rw-r--r--sys/alpha/alpha/ipl_funcs.c55
-rw-r--r--sys/alpha/alpha/mem.c6
-rw-r--r--sys/alpha/alpha/vm_machdep.c2
-rw-r--r--sys/alpha/include/ipl.h3
-rw-r--r--sys/alpha/include/md_var.h2
-rw-r--r--sys/amd64/amd64/busdma_machdep.c4
-rw-r--r--sys/amd64/amd64/tsc.c6
-rw-r--r--sys/amd64/amd64/vm_machdep.c2
-rw-r--r--sys/amd64/include/md_var.h3
-rw-r--r--sys/amd64/isa/clock.c6
-rw-r--r--sys/amd64/isa/intr_machdep.c66
-rw-r--r--sys/amd64/isa/intr_machdep.h4
-rw-r--r--sys/amd64/isa/ithread.c14
-rw-r--r--sys/amd64/isa/nmi.c66
-rw-r--r--sys/cam/cam_xpt.c46
-rw-r--r--sys/dev/cy/cy.c31
-rw-r--r--sys/dev/cy/cy_isa.c31
-rw-r--r--sys/dev/rc/rc.c13
-rw-r--r--sys/dev/sio/sio.c26
-rw-r--r--sys/i386/i386/busdma_machdep.c4
-rw-r--r--sys/i386/i386/tsc.c6
-rw-r--r--sys/i386/i386/vm_machdep.c2
-rw-r--r--sys/i386/include/ipl.h2
-rw-r--r--sys/i386/include/md_var.h3
-rw-r--r--sys/i386/isa/clock.c6
-rw-r--r--sys/i386/isa/cy.c31
-rw-r--r--sys/i386/isa/intr_machdep.c66
-rw-r--r--sys/i386/isa/intr_machdep.h4
-rw-r--r--sys/i386/isa/ipl.s34
-rw-r--r--sys/i386/isa/ipl_funcs.c5
-rw-r--r--sys/i386/isa/ithread.c14
-rw-r--r--sys/i386/isa/nmi.c66
-rw-r--r--sys/i386/isa/rc.c13
-rw-r--r--sys/ia64/ia64/busdma_machdep.c2
-rw-r--r--sys/ia64/ia64/ipl_funcs.c55
-rw-r--r--sys/ia64/ia64/mem.c6
-rw-r--r--sys/ia64/ia64/vm_machdep.c2
-rw-r--r--sys/ia64/include/ipl.h8
-rw-r--r--sys/ia64/include/md_var.h2
-rw-r--r--sys/isa/atrtc.c6
-rw-r--r--sys/isa/sio.c26
-rw-r--r--sys/kern/kern_clock.c4
-rw-r--r--sys/kern/kern_intr.c385
-rw-r--r--sys/kern/kern_timeout.c2
-rw-r--r--sys/kern/subr_taskqueue.c9
-rw-r--r--sys/net/netisr.h4
-rw-r--r--sys/pc98/cbus/clock.c2
-rw-r--r--sys/pc98/cbus/pcrtc.c2
-rw-r--r--sys/pc98/cbus/sio.c26
-rw-r--r--sys/pc98/pc98/clock.c2
-rw-r--r--sys/pc98/pc98/sio.c26
-rw-r--r--sys/powerpc/aim/vm_machdep.c2
-rw-r--r--sys/powerpc/include/md_var.h2
-rw-r--r--sys/powerpc/powerpc/vm_machdep.c2
-rw-r--r--sys/sys/interrupt.h39
-rw-r--r--sys/sys/proc.h2
-rw-r--r--sys/sys/systm.h18
60 files changed, 539 insertions, 792 deletions
diff --git a/sys/alpha/alpha/busdma_machdep.c b/sys/alpha/alpha/busdma_machdep.c
index a10f367..d6112ab 100644
--- a/sys/alpha/alpha/busdma_machdep.c
+++ b/sys/alpha/alpha/busdma_machdep.c
@@ -27,7 +27,9 @@
*/
#include <sys/param.h>
+#include <sys/bus.h>
#include <sys/systm.h>
+#include <sys/interrupt.h>
#include <sys/malloc.h>
#include <vm/vm.h>
@@ -689,7 +691,7 @@ free_bounce_page(bus_dma_tag_t dmat, struct bounce_page *bpage)
STAILQ_INSERT_TAIL(&bounce_map_callbacklist,
map, links);
busdma_swi_pending = 1;
- setsoftvm();
+ sched_swi(vm_ih, SWI_NOSWITCH);
}
}
splx(s);
diff --git a/sys/alpha/alpha/clock.c b/sys/alpha/alpha/clock.c
index 500d169..ef7cb65 100644
--- a/sys/alpha/alpha/clock.c
+++ b/sys/alpha/alpha/clock.c
@@ -398,7 +398,6 @@ handleclock(void* arg)
}
hardclock(arg);
- setdelayed();
}
/*
diff --git a/sys/alpha/alpha/interrupt.c b/sys/alpha/alpha/interrupt.c
index 42ea585..2df48a2 100644
--- a/sys/alpha/alpha/interrupt.c
+++ b/sys/alpha/alpha/interrupt.c
@@ -341,7 +341,7 @@ alpha_setup_intr(const char *name, int vector, driver_intr_t *handler,
{
int h = HASHVEC(vector);
struct alpha_intr *i;
- struct intrec *head, *idesc;
+ struct intrhand *head, *idesc;
struct ithd *ithd;
struct proc *p;
int s, errcode;
@@ -410,26 +410,26 @@ alpha_setup_intr(const char *name, int vector, driver_intr_t *handler,
}
/* Third, setup the interrupt descriptor for this handler. */
- idesc = malloc(sizeof (struct intrec), M_DEVBUF, M_WAITOK);
+ idesc = malloc(sizeof (struct intrhand), M_DEVBUF, M_WAITOK);
if (idesc == NULL)
return ENOMEM;
- bzero(idesc, sizeof(struct intrec));
+ bzero(idesc, sizeof(struct intrhand));
- idesc->handler = handler;
- idesc->argument = arg;
- idesc->name = malloc(strlen(name) + 1, M_DEVBUF, M_WAITOK);
- if (idesc->name == NULL) {
+ idesc->ih_handler = handler;
+ idesc->ih_argument = arg;
+ idesc->ih_name = malloc(strlen(name) + 1, M_DEVBUF, M_WAITOK);
+ if (idesc->ih_name == NULL) {
free(idesc, M_DEVBUF);
return(NULL);
}
- strcpy(idesc->name, name);
+ strcpy(idesc->ih_name, name);
/* Fourth, add our handler to the end of the ithread's handler list. */
head = ithd->it_ih;
if (head) {
- while (head->next != NULL)
- head = head->next;
- head->next = idesc;
+ while (head->ih_next != NULL)
+ head = head->ih_next;
+ head->ih_next = idesc;
} else
ithd->it_ih = idesc;
@@ -440,27 +440,27 @@ alpha_setup_intr(const char *name, int vector, driver_intr_t *handler,
int
alpha_teardown_intr(void *cookie)
{
- struct intrec *idesc = cookie;
+ struct intrhand *idesc = cookie;
struct ithd *ithd;
- struct intrec *head;
+ struct intrhand *head;
#if 0
struct alpha_intr *i;
int s;
#endif
/* First, detach ourself from our interrupt thread. */
- ithd = idesc->ithd;
+ ithd = idesc->ih_ithd;
KASSERT(ithd != NULL, ("idesc without an interrupt thread"));
head = ithd->it_ih;
if (head == idesc)
- ithd->it_ih = idesc->next;
+ ithd->it_ih = idesc->ih_next;
else {
- while (head != NULL && head->next != idesc)
- head = head->next;
+ while (head != NULL && head->ih_next != idesc)
+ head = head->ih_next;
if (head == NULL)
return (-1); /* couldn't find ourself */
- head->next = idesc->next;
+ head->ih_next = idesc->ih_next;
}
free(idesc, M_DEVBUF);
@@ -541,7 +541,7 @@ void
ithd_loop(void *dummy)
{
struct ithd *ithd; /* our thread context */
- struct intrec *ih; /* list of handlers */
+ struct intrhand *ih; /* list of handlers */
struct alpha_intr *i; /* interrupt source */
ithd = curproc->p_ithd;
@@ -565,17 +565,17 @@ ithd_loop(void *dummy)
alpha_wmb(); /* push out "it_need=0" */
- for (ih = ithd->it_ih; ih != NULL; ih = ih->next) {
+ for (ih = ithd->it_ih; ih != NULL; ih = ih->ih_next) {
CTR5(KTR_INTR,
"ithd_loop pid %d ih=%p: %p(%p) flg=%x",
ithd->it_proc->p_pid, (void *)ih,
- (void *)ih->handler, ih->argument,
- ih->flags);
+ (void *)ih->ih_handler, ih->ih_argument,
+ ih->ih_flags);
- if ((ih->flags & INTR_MPSAFE) == 0)
+ if ((ih->ih_flags & INTR_MPSAFE) == 0)
mtx_enter(&Giant, MTX_DEF);
- ih->handler(ih->argument);
- if ((ih->flags & INTR_MPSAFE) == 0)
+ ih->ih_handler(ih->ih_argument);
+ if ((ih->ih_flags & INTR_MPSAFE) == 0)
mtx_exit(&Giant, MTX_DEF);
}
diff --git a/sys/alpha/alpha/ipl_funcs.c b/sys/alpha/alpha/ipl_funcs.c
index e110c83..3f98cf7 100644
--- a/sys/alpha/alpha/ipl_funcs.c
+++ b/sys/alpha/alpha/ipl_funcs.c
@@ -27,64 +27,9 @@
*/
#include <sys/param.h>
-#include <sys/bus.h>
#include <sys/systm.h>
-#include <sys/kernel.h>
-#include <sys/sysctl.h>
-#include <sys/ipl.h>
-#include <sys/ktr.h>
-#include <sys/mutex.h>
-#include <sys/interrupt.h>
-#include <machine/cpu.h>
-#include <machine/globaldata.h>
-#include <machine/globals.h>
-#include <net/netisr.h>
-
-#include "sio.h"
unsigned int bio_imask; /* XXX */
unsigned int cam_imask; /* XXX */
unsigned int net_imask; /* XXX */
unsigned int tty_imask; /* XXX */
-
-static void swi_net(void);
-
-void (*netisrs[32]) __P((void));
-swihand_t *shandlers[NSWI] = { /* software interrupts */
- swi_null, swi_net, swi_null, swi_null,
- swi_null, swi_null, softclock, swi_null,
- swi_null, swi_null, swi_null, swi_null,
- swi_null, swi_null, swi_null, swi_null,
- swi_null, swi_null, swi_null, swi_null,
- swi_null, swi_null, swi_null, swi_null,
- swi_null, swi_null, swi_null, swi_null,
- swi_null, swi_null, swi_null, swi_null,
-};
-
-u_int32_t netisr;
-
-void
-swi_null()
-{
- /* No interrupt registered, do nothing */
-}
-
-void
-swi_generic()
-{
- /* Just a placeholder, we call swi_dispatcher directly */
- panic("swi_generic() called");
-}
-
-static void
-swi_net()
-{
- u_int32_t bits = atomic_readandclear_32(&netisr);
- int i;
-
- for (i = 0; i < 32; i++) {
- if (bits & 1)
- netisrs[i]();
- bits >>= 1;
- }
-}
diff --git a/sys/alpha/alpha/mem.c b/sys/alpha/alpha/mem.c
index 9bd09e0..4819a7a 100644
--- a/sys/alpha/alpha/mem.c
+++ b/sys/alpha/alpha/mem.c
@@ -96,12 +96,6 @@ static struct cdevsw mem_cdevsw = {
/* bmaj */ -1
};
-#if NHWI > 0
-#define ICU_LEN (NHWI)
-#else
-#define ICU_LEN (NSWI)
-#endif
-
struct mem_range_softc mem_range_softc;
static int
diff --git a/sys/alpha/alpha/vm_machdep.c b/sys/alpha/alpha/vm_machdep.c
index c766291..f260a26 100644
--- a/sys/alpha/alpha/vm_machdep.c
+++ b/sys/alpha/alpha/vm_machdep.c
@@ -470,7 +470,7 @@ vm_page_zero_idle()
* Software interrupt handler for queued VM system processing.
*/
void
-swi_vm()
+swi_vm(void *dummy)
{
if (busdma_swi_pending != 0)
busdma_swi();
diff --git a/sys/alpha/include/ipl.h b/sys/alpha/include/ipl.h
index 79de282..6d67020 100644
--- a/sys/alpha/include/ipl.h
+++ b/sys/alpha/include/ipl.h
@@ -32,9 +32,6 @@
#include <machine/cpu.h> /* for pal inlines */
-#define NSWI 32
-#define HWHI 0
-
/*
* Interprocessor interrupts for SMP.
*/
diff --git a/sys/alpha/include/md_var.h b/sys/alpha/include/md_var.h
index d3e4ea3..a2f70b6 100644
--- a/sys/alpha/include/md_var.h
+++ b/sys/alpha/include/md_var.h
@@ -50,7 +50,7 @@ void busdma_swi __P((void));
void cpu_halt __P((void));
void cpu_reset __P((void));
int is_physical_memory __P((vm_offset_t addr));
-void swi_vm __P((void));
+void swi_vm __P((void *));
int vm_page_zero_idle __P((void));
int fill_regs __P((struct proc *, struct reg *));
int set_regs __P((struct proc *, struct reg *));
diff --git a/sys/amd64/amd64/busdma_machdep.c b/sys/amd64/amd64/busdma_machdep.c
index 0868b7c..63c4038 100644
--- a/sys/amd64/amd64/busdma_machdep.c
+++ b/sys/amd64/amd64/busdma_machdep.c
@@ -29,6 +29,8 @@
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/malloc.h>
+#include <sys/bus.h>
+#include <sys/interrupt.h>
#include <vm/vm.h>
#include <vm/vm_page.h>
@@ -639,7 +641,7 @@ free_bounce_page(bus_dma_tag_t dmat, struct bounce_page *bpage)
STAILQ_INSERT_TAIL(&bounce_map_callbacklist,
map, links);
busdma_swi_pending = 1;
- setsoftvm();
+ sched_swi(vm_ih, SWI_NOSWITCH);
}
}
splx(s);
diff --git a/sys/amd64/amd64/tsc.c b/sys/amd64/amd64/tsc.c
index 3971cf5..1ad7bf4 100644
--- a/sys/amd64/amd64/tsc.c
+++ b/sys/amd64/amd64/tsc.c
@@ -216,7 +216,6 @@ clkintr(struct clockframe frame)
switch (timer0_state) {
case RELEASED:
- setdelayed();
break;
case ACQUIRED:
@@ -224,7 +223,6 @@ clkintr(struct clockframe frame)
>= hardclock_max_count) {
timer0_prescaler_count -= hardclock_max_count;
hardclock(&frame);
- setdelayed();
}
break;
@@ -239,7 +237,6 @@ clkintr(struct clockframe frame)
mtx_exit(&clock_lock, MTX_SPIN);
timer_func = new_function;
timer0_state = ACQUIRED;
- setdelayed();
break;
case RELEASE_PENDING:
@@ -258,7 +255,6 @@ clkintr(struct clockframe frame)
timer_func = hardclock;
timer0_state = RELEASED;
hardclock(&frame);
- setdelayed();
}
break;
}
@@ -967,7 +963,7 @@ cpu_initclocks()
int diag;
#ifdef APIC_IO
int apic_8254_trial;
- struct intrec *clkdesc;
+ struct intrhand *clkdesc;
#endif /* APIC_IO */
if (statclock_disable) {
diff --git a/sys/amd64/amd64/vm_machdep.c b/sys/amd64/amd64/vm_machdep.c
index 468351b..294a583 100644
--- a/sys/amd64/amd64/vm_machdep.c
+++ b/sys/amd64/amd64/vm_machdep.c
@@ -591,7 +591,7 @@ vm_page_zero_idle()
* Software interrupt handler for queued VM system processing.
*/
void
-swi_vm()
+swi_vm(void *dummy)
{
if (busdma_swi_pending != 0)
busdma_swi();
diff --git a/sys/amd64/include/md_var.h b/sys/amd64/include/md_var.h
index 1660a75..312d313 100644
--- a/sys/amd64/include/md_var.h
+++ b/sys/amd64/include/md_var.h
@@ -94,8 +94,7 @@ int is_physical_memory __P((vm_offset_t addr));
u_long kvtop __P((void *addr));
void setidt __P((int idx, alias_for_inthand_t *func, int typ, int dpl,
int selec));
-void swi_vm __P((void));
-void swi_net __P((void));
+void swi_vm __P((void *));
void userconfig __P((void));
int user_dbreg_trap __P((void));
int vm_page_zero_idle __P((void));
diff --git a/sys/amd64/isa/clock.c b/sys/amd64/isa/clock.c
index 3971cf5..1ad7bf4 100644
--- a/sys/amd64/isa/clock.c
+++ b/sys/amd64/isa/clock.c
@@ -216,7 +216,6 @@ clkintr(struct clockframe frame)
switch (timer0_state) {
case RELEASED:
- setdelayed();
break;
case ACQUIRED:
@@ -224,7 +223,6 @@ clkintr(struct clockframe frame)
>= hardclock_max_count) {
timer0_prescaler_count -= hardclock_max_count;
hardclock(&frame);
- setdelayed();
}
break;
@@ -239,7 +237,6 @@ clkintr(struct clockframe frame)
mtx_exit(&clock_lock, MTX_SPIN);
timer_func = new_function;
timer0_state = ACQUIRED;
- setdelayed();
break;
case RELEASE_PENDING:
@@ -258,7 +255,6 @@ clkintr(struct clockframe frame)
timer_func = hardclock;
timer0_state = RELEASED;
hardclock(&frame);
- setdelayed();
}
break;
}
@@ -967,7 +963,7 @@ cpu_initclocks()
int diag;
#ifdef APIC_IO
int apic_8254_trial;
- struct intrec *clkdesc;
+ struct intrhand *clkdesc;
#endif /* APIC_IO */
if (statclock_disable) {
diff --git a/sys/amd64/isa/intr_machdep.c b/sys/amd64/isa/intr_machdep.c
index d7e1b8e..f659ee3 100644
--- a/sys/amd64/isa/intr_machdep.c
+++ b/sys/amd64/isa/intr_machdep.c
@@ -531,13 +531,13 @@ icu_unset(intr, handler)
return (0);
}
-struct intrec *
+struct intrhand *
inthand_add(const char *name, int irq, driver_intr_t handler, void *arg,
int pri, int flags)
{
struct ithd *ithd = ithds[irq]; /* descriptor for the IRQ */
- struct intrec *head; /* chain of handlers for IRQ */
- struct intrec *idesc; /* descriptor for this handler */
+ struct intrhand *head; /* chain of handlers for IRQ */
+ struct intrhand *idesc; /* descriptor for this handler */
struct proc *p; /* interrupt thread */
int errcode = 0;
@@ -592,7 +592,7 @@ inthand_add(const char *name, int irq, driver_intr_t handler, void *arg,
panic("inthand_add: Can't initialize ICU");
}
} else if ((flags & INTR_EXCL) != 0
- || (ithd->it_ih->flags & INTR_EXCL) != 0) {
+ || (ithd->it_ih->ih_flags & INTR_EXCL) != 0) {
/*
* We can't append the new handler if either
* list ithd or new handler do not allow
@@ -601,14 +601,14 @@ inthand_add(const char *name, int irq, driver_intr_t handler, void *arg,
if (bootverbose)
printf("\tdevice combination %s and %s "
"doesn't support shared irq%d\n",
- ithd->it_ih->name, name, irq);
+ ithd->it_ih->ih_name, name, irq);
return(NULL);
} else if (flags & INTR_FAST) {
/* We can only have one fast interrupt by itself. */
if (bootverbose)
printf("\tCan't add fast interrupt %s"
" to normal interrupt %s on irq%d",
- name, ithd->it_ih->name, irq);
+ name, ithd->it_ih->ih_name, irq);
return (NULL);
} else { /* update p_comm */
p = ithd->it_proc;
@@ -620,42 +620,42 @@ inthand_add(const char *name, int irq, driver_intr_t handler, void *arg,
else
strcat(p->p_comm, "+");
}
- idesc = malloc(sizeof (struct intrec), M_DEVBUF, M_WAITOK);
+ idesc = malloc(sizeof (struct intrhand), M_DEVBUF, M_WAITOK);
if (idesc == NULL)
return (NULL);
- bzero(idesc, sizeof (struct intrec));
+ bzero(idesc, sizeof (struct intrhand));
- idesc->handler = handler;
- idesc->argument = arg;
- idesc->flags = flags;
- idesc->ithd = ithd;
+ idesc->ih_handler = handler;
+ idesc->ih_argument = arg;
+ idesc->ih_flags = flags;
+ idesc->ih_ithd = ithd;
- idesc->name = malloc(strlen(name) + 1, M_DEVBUF, M_WAITOK);
- if (idesc->name == NULL) {
+ idesc->ih_name = malloc(strlen(name) + 1, M_DEVBUF, M_WAITOK);
+ if (idesc->ih_name == NULL) {
free(idesc, M_DEVBUF);
return (NULL);
}
- strcpy(idesc->name, name);
+ strcpy(idesc->ih_name, name);
/* Slow interrupts got set up above. */
if ((flags & INTR_FAST)
- && (icu_setup(irq, idesc->handler, idesc->argument,
- idesc->flags) != 0) ) {
+ && (icu_setup(irq, idesc->ih_handler, idesc->ih_argument,
+ idesc->ih_flags) != 0) ) {
if (bootverbose)
printf("\tinthand_add(irq%d) failed, result=%d\n",
irq, errcode);
- free(idesc->name, M_DEVBUF);
+ free(idesc->ih_name, M_DEVBUF);
free(idesc, M_DEVBUF);
return NULL;
}
head = ithd->it_ih; /* look at chain of handlers */
if (head) {
- while (head->next != NULL)
- head = head->next; /* find the end */
- head->next = idesc; /* hook it in there */
+ while (head->ih_next != NULL)
+ head = head->ih_next; /* find the end */
+ head->ih_next = idesc; /* hook it in there */
} else
ithd->it_ih = idesc; /* put it up front */
- update_intrname(irq, idesc->name);
+ update_intrname(irq, idesc->ih_name);
return (idesc);
}
@@ -670,29 +670,29 @@ inthand_add(const char *name, int irq, driver_intr_t handler, void *arg,
*/
int
-inthand_remove(struct intrec *idesc)
+inthand_remove(struct intrhand *idesc)
{
struct ithd *ithd; /* descriptor for the IRQ */
- struct intrec *ih; /* chain of handlers */
+ struct intrhand *ih; /* chain of handlers */
if (idesc == NULL)
return (-1);
- ithd = idesc->ithd;
+ ithd = idesc->ih_ithd;
ih = ithd->it_ih;
if (ih == idesc) /* first in the chain */
- ithd->it_ih = idesc->next; /* unhook it */
+ ithd->it_ih = idesc->ih_next; /* unhook it */
else {
while ((ih != NULL)
- && (ih->next != idesc) )
- ih = ih->next;
- if (ih->next != idesc)
- return (-1);
- ih->next = ih->next->next;
- }
+ && (ih->ih_next != idesc) )
+ ih = ih->ih_next;
+ if (ih->ih_next != idesc)
+ return (-1);
+ ih->ih_next = ih->ih_next->ih_next;
+ }
if (ithd->it_ih == NULL) { /* no handlers left, */
- icu_unset(ithd->irq, idesc->handler);
+ icu_unset(ithd->irq, idesc->ih_handler);
ithds[ithd->irq] = NULL;
mtx_enter(&sched_lock, MTX_SPIN);
diff --git a/sys/amd64/isa/intr_machdep.h b/sys/amd64/isa/intr_machdep.h
index 999df15..011836d 100644
--- a/sys/amd64/isa/intr_machdep.h
+++ b/sys/amd64/isa/intr_machdep.h
@@ -218,9 +218,9 @@ int icu_unset __P((int intr, driver_intr_t *handler));
* WARNING: These are internal functions and not to be used by device drivers!
* They are subject to change without notice.
*/
-struct intrec *inthand_add(const char *name, int irq, driver_intr_t handler,
+struct intrhand *inthand_add(const char *name, int irq, driver_intr_t handler,
void *arg, int pri, int flags);
-int inthand_remove(struct intrec *idesc);
+int inthand_remove(struct intrhand *idesc);
void sched_ithd(void *);
void ithd_loop(void *);
void start_softintr(void *);
diff --git a/sys/amd64/isa/ithread.c b/sys/amd64/isa/ithread.c
index 735204e..17a91f4 100644
--- a/sys/amd64/isa/ithread.c
+++ b/sys/amd64/isa/ithread.c
@@ -165,7 +165,7 @@ void
ithd_loop(void *dummy)
{
struct ithd *me; /* our thread context */
- struct intrec *ih; /* and our interrupt handler chain */
+ struct intrhand *ih; /* and our interrupt handler chain */
me = curproc->p_ithd; /* point to myself */
@@ -200,17 +200,17 @@ ithd_loop(void *dummy)
#if 0
membar_unlock(); /* push out "it_need=0" */
#endif
- for (ih = me->it_ih; ih != NULL; ih = ih->next) {
+ for (ih = me->it_ih; ih != NULL; ih = ih->ih_next) {
CTR5(KTR_INTR,
"ithd_loop pid %d ih=%p: %p(%p) flg=%x",
me->it_proc->p_pid, (void *)ih,
- (void *)ih->handler, ih->argument,
- ih->flags);
+ (void *)ih->ih_handler, ih->ih_argument,
+ ih->ih_flags);
- if ((ih->flags & INTR_MPSAFE) == 0)
+ if ((ih->ih_flags & INTR_MPSAFE) == 0)
mtx_enter(&Giant, MTX_DEF);
- ih->handler(ih->argument);
- if ((ih->flags & INTR_MPSAFE) == 0)
+ ih->ih_handler(ih->ih_argument);
+ if ((ih->ih_flags & INTR_MPSAFE) == 0)
mtx_exit(&Giant, MTX_DEF);
}
}
diff --git a/sys/amd64/isa/nmi.c b/sys/amd64/isa/nmi.c
index d7e1b8e..f659ee3 100644
--- a/sys/amd64/isa/nmi.c
+++ b/sys/amd64/isa/nmi.c
@@ -531,13 +531,13 @@ icu_unset(intr, handler)
return (0);
}
-struct intrec *
+struct intrhand *
inthand_add(const char *name, int irq, driver_intr_t handler, void *arg,
int pri, int flags)
{
struct ithd *ithd = ithds[irq]; /* descriptor for the IRQ */
- struct intrec *head; /* chain of handlers for IRQ */
- struct intrec *idesc; /* descriptor for this handler */
+ struct intrhand *head; /* chain of handlers for IRQ */
+ struct intrhand *idesc; /* descriptor for this handler */
struct proc *p; /* interrupt thread */
int errcode = 0;
@@ -592,7 +592,7 @@ inthand_add(const char *name, int irq, driver_intr_t handler, void *arg,
panic("inthand_add: Can't initialize ICU");
}
} else if ((flags & INTR_EXCL) != 0
- || (ithd->it_ih->flags & INTR_EXCL) != 0) {
+ || (ithd->it_ih->ih_flags & INTR_EXCL) != 0) {
/*
* We can't append the new handler if either
* list ithd or new handler do not allow
@@ -601,14 +601,14 @@ inthand_add(const char *name, int irq, driver_intr_t handler, void *arg,
if (bootverbose)
printf("\tdevice combination %s and %s "
"doesn't support shared irq%d\n",
- ithd->it_ih->name, name, irq);
+ ithd->it_ih->ih_name, name, irq);
return(NULL);
} else if (flags & INTR_FAST) {
/* We can only have one fast interrupt by itself. */
if (bootverbose)
printf("\tCan't add fast interrupt %s"
" to normal interrupt %s on irq%d",
- name, ithd->it_ih->name, irq);
+ name, ithd->it_ih->ih_name, irq);
return (NULL);
} else { /* update p_comm */
p = ithd->it_proc;
@@ -620,42 +620,42 @@ inthand_add(const char *name, int irq, driver_intr_t handler, void *arg,
else
strcat(p->p_comm, "+");
}
- idesc = malloc(sizeof (struct intrec), M_DEVBUF, M_WAITOK);
+ idesc = malloc(sizeof (struct intrhand), M_DEVBUF, M_WAITOK);
if (idesc == NULL)
return (NULL);
- bzero(idesc, sizeof (struct intrec));
+ bzero(idesc, sizeof (struct intrhand));
- idesc->handler = handler;
- idesc->argument = arg;
- idesc->flags = flags;
- idesc->ithd = ithd;
+ idesc->ih_handler = handler;
+ idesc->ih_argument = arg;
+ idesc->ih_flags = flags;
+ idesc->ih_ithd = ithd;
- idesc->name = malloc(strlen(name) + 1, M_DEVBUF, M_WAITOK);
- if (idesc->name == NULL) {
+ idesc->ih_name = malloc(strlen(name) + 1, M_DEVBUF, M_WAITOK);
+ if (idesc->ih_name == NULL) {
free(idesc, M_DEVBUF);
return (NULL);
}
- strcpy(idesc->name, name);
+ strcpy(idesc->ih_name, name);
/* Slow interrupts got set up above. */
if ((flags & INTR_FAST)
- && (icu_setup(irq, idesc->handler, idesc->argument,
- idesc->flags) != 0) ) {
+ && (icu_setup(irq, idesc->ih_handler, idesc->ih_argument,
+ idesc->ih_flags) != 0) ) {
if (bootverbose)
printf("\tinthand_add(irq%d) failed, result=%d\n",
irq, errcode);
- free(idesc->name, M_DEVBUF);
+ free(idesc->ih_name, M_DEVBUF);
free(idesc, M_DEVBUF);
return NULL;
}
head = ithd->it_ih; /* look at chain of handlers */
if (head) {
- while (head->next != NULL)
- head = head->next; /* find the end */
- head->next = idesc; /* hook it in there */
+ while (head->ih_next != NULL)
+ head = head->ih_next; /* find the end */
+ head->ih_next = idesc; /* hook it in there */
} else
ithd->it_ih = idesc; /* put it up front */
- update_intrname(irq, idesc->name);
+ update_intrname(irq, idesc->ih_name);
return (idesc);
}
@@ -670,29 +670,29 @@ inthand_add(const char *name, int irq, driver_intr_t handler, void *arg,
*/
int
-inthand_remove(struct intrec *idesc)
+inthand_remove(struct intrhand *idesc)
{
struct ithd *ithd; /* descriptor for the IRQ */
- struct intrec *ih; /* chain of handlers */
+ struct intrhand *ih; /* chain of handlers */
if (idesc == NULL)
return (-1);
- ithd = idesc->ithd;
+ ithd = idesc->ih_ithd;
ih = ithd->it_ih;
if (ih == idesc) /* first in the chain */
- ithd->it_ih = idesc->next; /* unhook it */
+ ithd->it_ih = idesc->ih_next; /* unhook it */
else {
while ((ih != NULL)
- && (ih->next != idesc) )
- ih = ih->next;
- if (ih->next != idesc)
- return (-1);
- ih->next = ih->next->next;
- }
+ && (ih->ih_next != idesc) )
+ ih = ih->ih_next;
+ if (ih->ih_next != idesc)
+ return (-1);
+ ih->ih_next = ih->ih_next->ih_next;
+ }
if (ithd->it_ih == NULL) { /* no handlers left, */
- icu_unset(ithd->irq, idesc->handler);
+ icu_unset(ithd->irq, idesc->ih_handler);
ithds[ithd->irq] = NULL;
mtx_enter(&sched_lock, MTX_SPIN);
diff --git a/sys/cam/cam_xpt.c b/sys/cam/cam_xpt.c
index b498d61..4dd19c4 100644
--- a/sys/cam/cam_xpt.c
+++ b/sys/cam/cam_xpt.c
@@ -605,6 +605,10 @@ u_int32_t cam_dflags;
u_int32_t cam_debug_delay;
#endif
+/* Pointers to software interrupt handlers */
+struct intrhand *camnet_ih;
+struct intrhand *cambio_ih;
+
#if defined(CAM_DEBUG_FLAGS) && !defined(CAMDEBUG)
#error "You must have options CAMDEBUG to use options CAM_DEBUG_FLAGS"
#endif
@@ -693,9 +697,7 @@ static xpt_devicefunc_t xptpassannouncefunc;
static void xpt_finishconfig(struct cam_periph *periph, union ccb *ccb);
static void xptaction(struct cam_sim *sim, union ccb *work_ccb);
static void xptpoll(struct cam_sim *sim);
-static swihand_t swi_camnet;
-static swihand_t swi_cambio;
-static void camisr(cam_isrq_t *queue);
+static void camisr(void *);
#if 0
static void xptstart(struct cam_periph *periph, union ccb *work_ccb);
static void xptasync(struct cam_periph *periph,
@@ -1363,8 +1365,10 @@ xpt_init(dummy)
}
/* Install our software interrupt handlers */
- register_swi(SWI_CAMNET, swi_camnet);
- register_swi(SWI_CAMBIO, swi_cambio);
+ camnet_ih = sinthand_add("camnet", NULL, camisr, &cam_netq,
+ SWI_CAMNET, 0);
+ cambio_ih = sinthand_add("cambio", NULL, camisr, &cam_bioq,
+ SWI_CAMBIO, 0);
}
static cam_status
@@ -3400,8 +3404,8 @@ xpt_polled_action(union ccb *start_ccb)
&& (--timeout > 0)) {
DELAY(1000);
(*(sim->sim_poll))(sim);
- swi_camnet();
- swi_cambio();
+ camisr(&cam_netq);
+ camisr(&cam_bioq);
}
dev->ccbq.devq_openings++;
@@ -3411,8 +3415,8 @@ xpt_polled_action(union ccb *start_ccb)
xpt_action(start_ccb);
while(--timeout > 0) {
(*(sim->sim_poll))(sim);
- swi_camnet();
- swi_cambio();
+ camisr(&cam_netq);
+ camisr(&cam_bioq);
if ((start_ccb->ccb_h.status & CAM_STATUS_MASK)
!= CAM_REQ_INPROG)
break;
@@ -4527,13 +4531,13 @@ xpt_done(union ccb *done_ccb)
TAILQ_INSERT_TAIL(&cam_bioq, &done_ccb->ccb_h,
sim_links.tqe);
done_ccb->ccb_h.pinfo.index = CAM_DONEQ_INDEX;
- setsoftcambio();
+ sched_swi(cambio_ih, SWI_NOSWITCH);
break;
case CAM_PERIPH_NET:
TAILQ_INSERT_TAIL(&cam_netq, &done_ccb->ccb_h,
sim_links.tqe);
done_ccb->ccb_h.pinfo.index = CAM_DONEQ_INDEX;
- setsoftcamnet();
+ sched_swi(camnet_ih, SWI_NOSWITCH);
break;
}
}
@@ -6240,26 +6244,10 @@ xptpoll(struct cam_sim *sim)
{
}
-/*
- * Should only be called by the machine interrupt dispatch routines,
- * so put these prototypes here instead of in the header.
- */
-
-static void
-swi_camnet(void)
-{
- camisr(&cam_netq);
-}
-
-static void
-swi_cambio(void)
-{
- camisr(&cam_bioq);
-}
-
static void
-camisr(cam_isrq_t *queue)
+camisr(void *V_queue)
{
+ cam_isrq_t *queue = V_queue;
int s;
struct ccb_hdr *ccb_h;
diff --git a/sys/dev/cy/cy.c b/sys/dev/cy/cy.c
index 8b49cfa..3cd2b6f 100644
--- a/sys/dev/cy/cy.c
+++ b/sys/dev/cy/cy.c
@@ -133,7 +133,7 @@
#define siosetwater cysetwater
#define comstop cystop
#define siowrite cywrite
-#define sio_registered cy_registered
+#define sio_irec cy_irec
#define sio_timeout cy_timeout
#define sio_timeout_handle cy_timeout_handle
#define sio_timeouts_until_log cy_timeouts_until_log
@@ -391,7 +391,7 @@ static struct cdevsw sio_cdevsw = {
static int comconsole = -1;
static speed_t comdefaultrate = TTYDEF_SPEED;
static u_int com_events; /* input chars + weighted output completions */
-static bool_t sio_registered;
+static struct intrhand *sio_ih;
static int sio_timeout;
static int sio_timeouts_until_log;
static struct callout_handle sio_timeout_handle
@@ -607,10 +607,10 @@ cyattach_common(cy_iobase, cy_align)
com_addr(unit) = com;
splx(s);
- if (!sio_registered) {
+ if (sio_ih == NULL)
cdevsw_add(&sio_cdevsw);
- register_swi(SWI_TTY, siopoll);
- sio_registered = TRUE;
+ sio_ih = sinthand_add("tty:sio", &tty_ithd, siopoll, NULL,
+ SWI_TTY, 0);
}
make_dev(&sio_cdevsw, unit,
UID_ROOT, GID_WHEEL, 0600, "ttyc%r%r", adapter,
@@ -1174,7 +1174,8 @@ siointr(unit)
#ifndef SOFT_HOTCHAR
if (line_status & CD1400_RDSR_SPECIAL
&& com->hotchar != 0)
- setsofttty();
+ sched_swi(sio_ih, SWI_NOSWITCH);
+
#endif
#if 1 /* XXX "intelligent" PFO error handling would break O error handling */
if (line_status & (LSR_PE|LSR_FE|LSR_BI)) {
@@ -1201,7 +1202,7 @@ siointr(unit)
++com->bytes_in;
#ifdef SOFT_HOTCHAR
if (com->hotchar != 0 && recv_data == com->hotchar)
- setsofttty();
+ sched_swi(sio_ih, SWI_NOSWITCH);
#endif
ioptr = com->iptr;
if (ioptr >= com->ibufend)
@@ -1251,7 +1252,7 @@ siointr(unit)
if (com->hotchar != 0
&& recv_data
== com->hotchar)
- setsofttty();
+ sched_swi(sio_ih, SWI_NOSWITCH);
#endif
ioptr[0] = recv_data;
ioptr[com->ierroff] = 0;
@@ -1266,7 +1267,7 @@ siointr(unit)
#ifdef SOFT_HOTCHAR
if (com->hotchar != 0
&& recv_data == com->hotchar)
- setsofttty();
+ sched_swi(sio_ih, SWI_NOSWITCH);
#endif
} while (--count != 0);
} else {
@@ -1291,7 +1292,7 @@ siointr(unit)
#ifdef SOFT_HOTCHAR
if (com->hotchar != 0
&& recv_data == com->hotchar)
- setsofttty();
+ sched_swi(sio_ih, SWI_NOSWITCH);
#endif
ioptr[0] = recv_data;
ioptr[com->ierroff] = 0;
@@ -1356,7 +1357,7 @@ cont:
if (!(com->state & CS_CHECKMSR)) {
com_events += LOTS_OF_EVENTS;
com->state |= CS_CHECKMSR;
- setsofttty();
+ sched_swi(sio_ih, SWI_NOSWITCH);
}
#ifdef SOFT_CTS_OFLOW
@@ -1487,7 +1488,7 @@ cont:
if (!(com->state & CS_ODONE)) {
com_events += LOTS_OF_EVENTS;
com->state |= CS_ODONE;
- setsofttty();
+ sched_swi(sio_ih, SWI_NOSWITCH);
}
break;
case ETC_BREAK_ENDED:
@@ -1501,7 +1502,7 @@ cont:
if (!(com->extra_state & CSE_ODONE)) {
com_events += LOTS_OF_EVENTS;
com->extra_state |= CSE_ODONE;
- setsofttty();
+ sched_swi(sio_ih, SWI_NOSWITCH);
}
cd_outb(iobase, CD1400_SRER, cy_align,
com->intr_enable
@@ -1559,7 +1560,7 @@ cont:
com->state |= CS_ODONE;
/* handle at high level ASAP */
- setsofttty();
+ sched_swi(sio_ih, SWI_NOSWITCH);
}
}
}
@@ -1579,7 +1580,7 @@ terminate_tx_service:
/* ensure an edge for the next interrupt */
cy_outb(cy_iobase, CY_CLEAR_INTR, cy_align, 0);
- schedsofttty();
+ sched_swi(sio_ih, SWI_NOSWITCH);
COM_UNLOCK();
}
diff --git a/sys/dev/cy/cy_isa.c b/sys/dev/cy/cy_isa.c
index 8b49cfa..3cd2b6f 100644
--- a/sys/dev/cy/cy_isa.c
+++ b/sys/dev/cy/cy_isa.c
@@ -133,7 +133,7 @@
#define siosetwater cysetwater
#define comstop cystop
#define siowrite cywrite
-#define sio_registered cy_registered
+#define sio_irec cy_irec
#define sio_timeout cy_timeout
#define sio_timeout_handle cy_timeout_handle
#define sio_timeouts_until_log cy_timeouts_until_log
@@ -391,7 +391,7 @@ static struct cdevsw sio_cdevsw = {
static int comconsole = -1;
static speed_t comdefaultrate = TTYDEF_SPEED;
static u_int com_events; /* input chars + weighted output completions */
-static bool_t sio_registered;
+static struct intrhand *sio_ih;
static int sio_timeout;
static int sio_timeouts_until_log;
static struct callout_handle sio_timeout_handle
@@ -607,10 +607,10 @@ cyattach_common(cy_iobase, cy_align)
com_addr(unit) = com;
splx(s);
- if (!sio_registered) {
+ if (sio_ih == NULL)
cdevsw_add(&sio_cdevsw);
- register_swi(SWI_TTY, siopoll);
- sio_registered = TRUE;
+ sio_ih = sinthand_add("tty:sio", &tty_ithd, siopoll, NULL,
+ SWI_TTY, 0);
}
make_dev(&sio_cdevsw, unit,
UID_ROOT, GID_WHEEL, 0600, "ttyc%r%r", adapter,
@@ -1174,7 +1174,8 @@ siointr(unit)
#ifndef SOFT_HOTCHAR
if (line_status & CD1400_RDSR_SPECIAL
&& com->hotchar != 0)
- setsofttty();
+ sched_swi(sio_ih, SWI_NOSWITCH);
+
#endif
#if 1 /* XXX "intelligent" PFO error handling would break O error handling */
if (line_status & (LSR_PE|LSR_FE|LSR_BI)) {
@@ -1201,7 +1202,7 @@ siointr(unit)
++com->bytes_in;
#ifdef SOFT_HOTCHAR
if (com->hotchar != 0 && recv_data == com->hotchar)
- setsofttty();
+ sched_swi(sio_ih, SWI_NOSWITCH);
#endif
ioptr = com->iptr;
if (ioptr >= com->ibufend)
@@ -1251,7 +1252,7 @@ siointr(unit)
if (com->hotchar != 0
&& recv_data
== com->hotchar)
- setsofttty();
+ sched_swi(sio_ih, SWI_NOSWITCH);
#endif
ioptr[0] = recv_data;
ioptr[com->ierroff] = 0;
@@ -1266,7 +1267,7 @@ siointr(unit)
#ifdef SOFT_HOTCHAR
if (com->hotchar != 0
&& recv_data == com->hotchar)
- setsofttty();
+ sched_swi(sio_ih, SWI_NOSWITCH);
#endif
} while (--count != 0);
} else {
@@ -1291,7 +1292,7 @@ siointr(unit)
#ifdef SOFT_HOTCHAR
if (com->hotchar != 0
&& recv_data == com->hotchar)
- setsofttty();
+ sched_swi(sio_ih, SWI_NOSWITCH);
#endif
ioptr[0] = recv_data;
ioptr[com->ierroff] = 0;
@@ -1356,7 +1357,7 @@ cont:
if (!(com->state & CS_CHECKMSR)) {
com_events += LOTS_OF_EVENTS;
com->state |= CS_CHECKMSR;
- setsofttty();
+ sched_swi(sio_ih, SWI_NOSWITCH);
}
#ifdef SOFT_CTS_OFLOW
@@ -1487,7 +1488,7 @@ cont:
if (!(com->state & CS_ODONE)) {
com_events += LOTS_OF_EVENTS;
com->state |= CS_ODONE;
- setsofttty();
+ sched_swi(sio_ih, SWI_NOSWITCH);
}
break;
case ETC_BREAK_ENDED:
@@ -1501,7 +1502,7 @@ cont:
if (!(com->extra_state & CSE_ODONE)) {
com_events += LOTS_OF_EVENTS;
com->extra_state |= CSE_ODONE;
- setsofttty();
+ sched_swi(sio_ih, SWI_NOSWITCH);
}
cd_outb(iobase, CD1400_SRER, cy_align,
com->intr_enable
@@ -1559,7 +1560,7 @@ cont:
com->state |= CS_ODONE;
/* handle at high level ASAP */
- setsofttty();
+ sched_swi(sio_ih, SWI_NOSWITCH);
}
}
}
@@ -1579,7 +1580,7 @@ terminate_tx_service:
/* ensure an edge for the next interrupt */
cy_outb(cy_iobase, CY_CLEAR_INTR, cy_align, 0);
- schedsofttty();
+ sched_swi(sio_ih, SWI_NOSWITCH);
COM_UNLOCK();
}
diff --git a/sys/dev/rc/rc.c b/sys/dev/rc/rc.c
index 22c82c2..fc35bd5 100644
--- a/sys/dev/rc/rc.c
+++ b/sys/dev/rc/rc.c
@@ -172,6 +172,8 @@ static int rc_rcsrt[16] = {
TTY_BI|TTY_PE|TTY_FE|TTY_OE
};
+static struct intrhand *rc_ih;
+
/* Static prototypes */
static ointhand2_t rcintr;
static void rc_hwreset __P((int, int, unsigned int));
@@ -268,7 +270,8 @@ rcattach(dvp)
rcb->rcb_probed = RC_ATTACHED;
if (!rc_started) {
cdevsw_add(&rc_cdevsw);
- register_swi(SWI_TTY, rcpoll);
+ rc_ih = sinthand_add("tty:rc", &tty_ithd, rcpoll, NULL,
+ SWI_TTY, 0);
rc_wakeup((void *)NULL);
rc_started = 1;
}
@@ -362,7 +365,7 @@ rcintr(unit)
optr++;
rc_scheduled_event++;
if (val != 0 && val == rc->rc_hotchar)
- setsofttty();
+ sched_swi(rc_ih, SWI_NOSWITCH);
}
} else {
/* Store also status data */
@@ -393,7 +396,7 @@ rcintr(unit)
&& (rc->rc_tp->t_iflag & INPCK))))
val = 0;
else if (val != 0 && val == rc->rc_hotchar)
- setsofttty();
+ sched_swi(rc_ih, SWI_NOSWITCH);
optr[0] = val;
optr[INPUT_FLAGS_SHIFT] = iack;
optr++;
@@ -440,7 +443,7 @@ rcintr(unit)
if ((iack & MCR_CDchg) && !(rc->rc_flags & RC_MODCHG)) {
rc_scheduled_event += LOTS_OF_EVENTS;
rc->rc_flags |= RC_MODCHG;
- setsofttty();
+ sched_swi(rc_ih, SWI_NOSWITCH);
}
goto more_intrs;
}
@@ -481,7 +484,7 @@ rcintr(unit)
if (!(rc->rc_flags & RC_DOXXFER)) {
rc_scheduled_event += LOTS_OF_EVENTS;
rc->rc_flags |= RC_DOXXFER;
- setsofttty();
+ sched_swi(rc_ih, SWI_NOSWITCH);
}
}
}
diff --git a/sys/dev/sio/sio.c b/sys/dev/sio/sio.c
index 4c403d1..4dc22ea 100644
--- a/sys/dev/sio/sio.c
+++ b/sys/dev/sio/sio.c
@@ -300,7 +300,7 @@ static void siointr1 __P((struct com_s *com));
static void siointr __P((void *arg));
static int commctl __P((struct com_s *com, int bits, int how));
static int comparam __P((struct tty *tp, struct termios *t));
-static swihand_t siopoll;
+static void siopoll __P((void *));
static int sioprobe __P((device_t dev, int xrid));
static int sio_isa_probe __P((device_t dev));
static void siosettimeout __P((void));
@@ -413,7 +413,8 @@ static int siocnunit;
#endif
static Port_t siogdbiobase;
static int siogdbunit = -1;
-static bool_t sio_registered;
+static struct intrhand *sio_slow_ih;
+static struct intrhand *sio_fast_ih;
static int sio_timeout;
static int sio_timeouts_until_log;
static struct callout_handle sio_timeout_handle
@@ -1322,9 +1323,11 @@ determined_type: ;
printf(" with a bogus IIR_TXRDY register");
printf("\n");
- if (!sio_registered) {
- register_swi(SWI_TTY, siopoll);
- sio_registered = TRUE;
+ if (sio_fast_ih == NULL) {
+ sio_fast_ih = sinthand_add("tty:sio", &tty_ithd, siopoll,
+ NULL, SWI_TTY, 0);
+ sio_slow_ih = sinthand_add("tty:sio", &clk_ithd, siopoll,
+ NULL, SWI_TTY, 0);
}
com->devs[0] = make_dev(&sio_cdevsw, unit,
UID_ROOT, GID_WHEEL, 0600, "ttyd%r", unit);
@@ -1979,7 +1982,7 @@ siointr1(com)
}
++com->bytes_in;
if (com->hotchar != 0 && recv_data == com->hotchar)
- setsofttty();
+ sched_swi(sio_fast_ih, SWI_NOSWITCH);
ioptr = com->iptr;
if (ioptr >= com->ibufend)
CE_RECORD(com, CE_INTERRUPT_BUF_OVERFLOW);
@@ -1987,10 +1990,10 @@ siointr1(com)
if (com->do_timestamp)
microtime(&com->timestamp);
++com_events;
- schedsofttty();
+ sched_swi(sio_slow_ih, SWI_DELAY);
#if 0 /* for testing input latency vs efficiency */
if (com->iptr - com->ibuf == 8)
- setsofttty();
+ sched_swi(sio_fast_ih, SWI_NOSWITCH);
#endif
ioptr[0] = recv_data;
ioptr[com->ierroff] = line_status;
@@ -2028,7 +2031,7 @@ cont:
if (!(com->state & CS_CHECKMSR)) {
com_events += LOTS_OF_EVENTS;
com->state |= CS_CHECKMSR;
- setsofttty();
+ sched_swi(sio_fast_ih, SWI_NOSWITCH);
}
/* handle CTS change immediately for crisp flow ctl */
@@ -2082,7 +2085,8 @@ cont:
if (!(com->state & CS_ODONE)) {
com_events += LOTS_OF_EVENTS;
com->state |= CS_ODONE;
- setsofttty(); /* handle at high level ASAP */
+ /* handle at high level ASAP */
+ sched_swi(sio_fast_ih, SWI_NOSWITCH);
}
}
if (COM_IIR_TXRDYBUG(com->flags) && (int_ctl != int_ctl_new)) {
@@ -2257,7 +2261,7 @@ sioioctl(dev, cmd, data, flag, p)
/* software interrupt handler for SWI_TTY */
static void
-siopoll()
+siopoll(void *dummy)
{
int unit;
int intrsave;
diff --git a/sys/i386/i386/busdma_machdep.c b/sys/i386/i386/busdma_machdep.c
index 0868b7c..63c4038 100644
--- a/sys/i386/i386/busdma_machdep.c
+++ b/sys/i386/i386/busdma_machdep.c
@@ -29,6 +29,8 @@
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/malloc.h>
+#include <sys/bus.h>
+#include <sys/interrupt.h>
#include <vm/vm.h>
#include <vm/vm_page.h>
@@ -639,7 +641,7 @@ free_bounce_page(bus_dma_tag_t dmat, struct bounce_page *bpage)
STAILQ_INSERT_TAIL(&bounce_map_callbacklist,
map, links);
busdma_swi_pending = 1;
- setsoftvm();
+ sched_swi(vm_ih, SWI_NOSWITCH);
}
}
splx(s);
diff --git a/sys/i386/i386/tsc.c b/sys/i386/i386/tsc.c
index 3971cf5..1ad7bf4 100644
--- a/sys/i386/i386/tsc.c
+++ b/sys/i386/i386/tsc.c
@@ -216,7 +216,6 @@ clkintr(struct clockframe frame)
switch (timer0_state) {
case RELEASED:
- setdelayed();
break;
case ACQUIRED:
@@ -224,7 +223,6 @@ clkintr(struct clockframe frame)
>= hardclock_max_count) {
timer0_prescaler_count -= hardclock_max_count;
hardclock(&frame);
- setdelayed();
}
break;
@@ -239,7 +237,6 @@ clkintr(struct clockframe frame)
mtx_exit(&clock_lock, MTX_SPIN);
timer_func = new_function;
timer0_state = ACQUIRED;
- setdelayed();
break;
case RELEASE_PENDING:
@@ -258,7 +255,6 @@ clkintr(struct clockframe frame)
timer_func = hardclock;
timer0_state = RELEASED;
hardclock(&frame);
- setdelayed();
}
break;
}
@@ -967,7 +963,7 @@ cpu_initclocks()
int diag;
#ifdef APIC_IO
int apic_8254_trial;
- struct intrec *clkdesc;
+ struct intrhand *clkdesc;
#endif /* APIC_IO */
if (statclock_disable) {
diff --git a/sys/i386/i386/vm_machdep.c b/sys/i386/i386/vm_machdep.c
index 468351b..294a583 100644
--- a/sys/i386/i386/vm_machdep.c
+++ b/sys/i386/i386/vm_machdep.c
@@ -591,7 +591,7 @@ vm_page_zero_idle()
* Software interrupt handler for queued VM system processing.
*/
void
-swi_vm()
+swi_vm(void *dummy)
{
if (busdma_swi_pending != 0)
busdma_swi();
diff --git a/sys/i386/include/ipl.h b/sys/i386/include/ipl.h
index ca701fb..61b5513 100644
--- a/sys/i386/include/ipl.h
+++ b/sys/i386/include/ipl.h
@@ -42,6 +42,4 @@
#include <i386/isa/icu_ipl.h>
#endif
-#define NSWI 7
-
#endif /* !_MACHINE_IPL_H_ */
diff --git a/sys/i386/include/md_var.h b/sys/i386/include/md_var.h
index 1660a75..312d313 100644
--- a/sys/i386/include/md_var.h
+++ b/sys/i386/include/md_var.h
@@ -94,8 +94,7 @@ int is_physical_memory __P((vm_offset_t addr));
u_long kvtop __P((void *addr));
void setidt __P((int idx, alias_for_inthand_t *func, int typ, int dpl,
int selec));
-void swi_vm __P((void));
-void swi_net __P((void));
+void swi_vm __P((void *));
void userconfig __P((void));
int user_dbreg_trap __P((void));
int vm_page_zero_idle __P((void));
diff --git a/sys/i386/isa/clock.c b/sys/i386/isa/clock.c
index 3971cf5..1ad7bf4 100644
--- a/sys/i386/isa/clock.c
+++ b/sys/i386/isa/clock.c
@@ -216,7 +216,6 @@ clkintr(struct clockframe frame)
switch (timer0_state) {
case RELEASED:
- setdelayed();
break;
case ACQUIRED:
@@ -224,7 +223,6 @@ clkintr(struct clockframe frame)
>= hardclock_max_count) {
timer0_prescaler_count -= hardclock_max_count;
hardclock(&frame);
- setdelayed();
}
break;
@@ -239,7 +237,6 @@ clkintr(struct clockframe frame)
mtx_exit(&clock_lock, MTX_SPIN);
timer_func = new_function;
timer0_state = ACQUIRED;
- setdelayed();
break;
case RELEASE_PENDING:
@@ -258,7 +255,6 @@ clkintr(struct clockframe frame)
timer_func = hardclock;
timer0_state = RELEASED;
hardclock(&frame);
- setdelayed();
}
break;
}
@@ -967,7 +963,7 @@ cpu_initclocks()
int diag;
#ifdef APIC_IO
int apic_8254_trial;
- struct intrec *clkdesc;
+ struct intrhand *clkdesc;
#endif /* APIC_IO */
if (statclock_disable) {
diff --git a/sys/i386/isa/cy.c b/sys/i386/isa/cy.c
index 8b49cfa..3cd2b6f 100644
--- a/sys/i386/isa/cy.c
+++ b/sys/i386/isa/cy.c
@@ -133,7 +133,7 @@
#define siosetwater cysetwater
#define comstop cystop
#define siowrite cywrite
-#define sio_registered cy_registered
+#define sio_irec cy_irec
#define sio_timeout cy_timeout
#define sio_timeout_handle cy_timeout_handle
#define sio_timeouts_until_log cy_timeouts_until_log
@@ -391,7 +391,7 @@ static struct cdevsw sio_cdevsw = {
static int comconsole = -1;
static speed_t comdefaultrate = TTYDEF_SPEED;
static u_int com_events; /* input chars + weighted output completions */
-static bool_t sio_registered;
+static struct intrhand *sio_ih;
static int sio_timeout;
static int sio_timeouts_until_log;
static struct callout_handle sio_timeout_handle
@@ -607,10 +607,10 @@ cyattach_common(cy_iobase, cy_align)
com_addr(unit) = com;
splx(s);
- if (!sio_registered) {
+ if (sio_ih == NULL)
cdevsw_add(&sio_cdevsw);
- register_swi(SWI_TTY, siopoll);
- sio_registered = TRUE;
+ sio_ih = sinthand_add("tty:sio", &tty_ithd, siopoll, NULL,
+ SWI_TTY, 0);
}
make_dev(&sio_cdevsw, unit,
UID_ROOT, GID_WHEEL, 0600, "ttyc%r%r", adapter,
@@ -1174,7 +1174,8 @@ siointr(unit)
#ifndef SOFT_HOTCHAR
if (line_status & CD1400_RDSR_SPECIAL
&& com->hotchar != 0)
- setsofttty();
+ sched_swi(sio_ih, SWI_NOSWITCH);
+
#endif
#if 1 /* XXX "intelligent" PFO error handling would break O error handling */
if (line_status & (LSR_PE|LSR_FE|LSR_BI)) {
@@ -1201,7 +1202,7 @@ siointr(unit)
++com->bytes_in;
#ifdef SOFT_HOTCHAR
if (com->hotchar != 0 && recv_data == com->hotchar)
- setsofttty();
+ sched_swi(sio_ih, SWI_NOSWITCH);
#endif
ioptr = com->iptr;
if (ioptr >= com->ibufend)
@@ -1251,7 +1252,7 @@ siointr(unit)
if (com->hotchar != 0
&& recv_data
== com->hotchar)
- setsofttty();
+ sched_swi(sio_ih, SWI_NOSWITCH);
#endif
ioptr[0] = recv_data;
ioptr[com->ierroff] = 0;
@@ -1266,7 +1267,7 @@ siointr(unit)
#ifdef SOFT_HOTCHAR
if (com->hotchar != 0
&& recv_data == com->hotchar)
- setsofttty();
+ sched_swi(sio_ih, SWI_NOSWITCH);
#endif
} while (--count != 0);
} else {
@@ -1291,7 +1292,7 @@ siointr(unit)
#ifdef SOFT_HOTCHAR
if (com->hotchar != 0
&& recv_data == com->hotchar)
- setsofttty();
+ sched_swi(sio_ih, SWI_NOSWITCH);
#endif
ioptr[0] = recv_data;
ioptr[com->ierroff] = 0;
@@ -1356,7 +1357,7 @@ cont:
if (!(com->state & CS_CHECKMSR)) {
com_events += LOTS_OF_EVENTS;
com->state |= CS_CHECKMSR;
- setsofttty();
+ sched_swi(sio_ih, SWI_NOSWITCH);
}
#ifdef SOFT_CTS_OFLOW
@@ -1487,7 +1488,7 @@ cont:
if (!(com->state & CS_ODONE)) {
com_events += LOTS_OF_EVENTS;
com->state |= CS_ODONE;
- setsofttty();
+ sched_swi(sio_ih, SWI_NOSWITCH);
}
break;
case ETC_BREAK_ENDED:
@@ -1501,7 +1502,7 @@ cont:
if (!(com->extra_state & CSE_ODONE)) {
com_events += LOTS_OF_EVENTS;
com->extra_state |= CSE_ODONE;
- setsofttty();
+ sched_swi(sio_ih, SWI_NOSWITCH);
}
cd_outb(iobase, CD1400_SRER, cy_align,
com->intr_enable
@@ -1559,7 +1560,7 @@ cont:
com->state |= CS_ODONE;
/* handle at high level ASAP */
- setsofttty();
+ sched_swi(sio_ih, SWI_NOSWITCH);
}
}
}
@@ -1579,7 +1580,7 @@ terminate_tx_service:
/* ensure an edge for the next interrupt */
cy_outb(cy_iobase, CY_CLEAR_INTR, cy_align, 0);
- schedsofttty();
+ sched_swi(sio_ih, SWI_NOSWITCH);
COM_UNLOCK();
}
diff --git a/sys/i386/isa/intr_machdep.c b/sys/i386/isa/intr_machdep.c
index d7e1b8e..f659ee3 100644
--- a/sys/i386/isa/intr_machdep.c
+++ b/sys/i386/isa/intr_machdep.c
@@ -531,13 +531,13 @@ icu_unset(intr, handler)
return (0);
}
-struct intrec *
+struct intrhand *
inthand_add(const char *name, int irq, driver_intr_t handler, void *arg,
int pri, int flags)
{
struct ithd *ithd = ithds[irq]; /* descriptor for the IRQ */
- struct intrec *head; /* chain of handlers for IRQ */
- struct intrec *idesc; /* descriptor for this handler */
+ struct intrhand *head; /* chain of handlers for IRQ */
+ struct intrhand *idesc; /* descriptor for this handler */
struct proc *p; /* interrupt thread */
int errcode = 0;
@@ -592,7 +592,7 @@ inthand_add(const char *name, int irq, driver_intr_t handler, void *arg,
panic("inthand_add: Can't initialize ICU");
}
} else if ((flags & INTR_EXCL) != 0
- || (ithd->it_ih->flags & INTR_EXCL) != 0) {
+ || (ithd->it_ih->ih_flags & INTR_EXCL) != 0) {
/*
* We can't append the new handler if either
* list ithd or new handler do not allow
@@ -601,14 +601,14 @@ inthand_add(const char *name, int irq, driver_intr_t handler, void *arg,
if (bootverbose)
printf("\tdevice combination %s and %s "
"doesn't support shared irq%d\n",
- ithd->it_ih->name, name, irq);
+ ithd->it_ih->ih_name, name, irq);
return(NULL);
} else if (flags & INTR_FAST) {
/* We can only have one fast interrupt by itself. */
if (bootverbose)
printf("\tCan't add fast interrupt %s"
" to normal interrupt %s on irq%d",
- name, ithd->it_ih->name, irq);
+ name, ithd->it_ih->ih_name, irq);
return (NULL);
} else { /* update p_comm */
p = ithd->it_proc;
@@ -620,42 +620,42 @@ inthand_add(const char *name, int irq, driver_intr_t handler, void *arg,
else
strcat(p->p_comm, "+");
}
- idesc = malloc(sizeof (struct intrec), M_DEVBUF, M_WAITOK);
+ idesc = malloc(sizeof (struct intrhand), M_DEVBUF, M_WAITOK);
if (idesc == NULL)
return (NULL);
- bzero(idesc, sizeof (struct intrec));
+ bzero(idesc, sizeof (struct intrhand));
- idesc->handler = handler;
- idesc->argument = arg;
- idesc->flags = flags;
- idesc->ithd = ithd;
+ idesc->ih_handler = handler;
+ idesc->ih_argument = arg;
+ idesc->ih_flags = flags;
+ idesc->ih_ithd = ithd;
- idesc->name = malloc(strlen(name) + 1, M_DEVBUF, M_WAITOK);
- if (idesc->name == NULL) {
+ idesc->ih_name = malloc(strlen(name) + 1, M_DEVBUF, M_WAITOK);
+ if (idesc->ih_name == NULL) {
free(idesc, M_DEVBUF);
return (NULL);
}
- strcpy(idesc->name, name);
+ strcpy(idesc->ih_name, name);
/* Slow interrupts got set up above. */
if ((flags & INTR_FAST)
- && (icu_setup(irq, idesc->handler, idesc->argument,
- idesc->flags) != 0) ) {
+ && (icu_setup(irq, idesc->ih_handler, idesc->ih_argument,
+ idesc->ih_flags) != 0) ) {
if (bootverbose)
printf("\tinthand_add(irq%d) failed, result=%d\n",
irq, errcode);
- free(idesc->name, M_DEVBUF);
+ free(idesc->ih_name, M_DEVBUF);
free(idesc, M_DEVBUF);
return NULL;
}
head = ithd->it_ih; /* look at chain of handlers */
if (head) {
- while (head->next != NULL)
- head = head->next; /* find the end */
- head->next = idesc; /* hook it in there */
+ while (head->ih_next != NULL)
+ head = head->ih_next; /* find the end */
+ head->ih_next = idesc; /* hook it in there */
} else
ithd->it_ih = idesc; /* put it up front */
- update_intrname(irq, idesc->name);
+ update_intrname(irq, idesc->ih_name);
return (idesc);
}
@@ -670,29 +670,29 @@ inthand_add(const char *name, int irq, driver_intr_t handler, void *arg,
*/
int
-inthand_remove(struct intrec *idesc)
+inthand_remove(struct intrhand *idesc)
{
struct ithd *ithd; /* descriptor for the IRQ */
- struct intrec *ih; /* chain of handlers */
+ struct intrhand *ih; /* chain of handlers */
if (idesc == NULL)
return (-1);
- ithd = idesc->ithd;
+ ithd = idesc->ih_ithd;
ih = ithd->it_ih;
if (ih == idesc) /* first in the chain */
- ithd->it_ih = idesc->next; /* unhook it */
+ ithd->it_ih = idesc->ih_next; /* unhook it */
else {
while ((ih != NULL)
- && (ih->next != idesc) )
- ih = ih->next;
- if (ih->next != idesc)
- return (-1);
- ih->next = ih->next->next;
- }
+ && (ih->ih_next != idesc) )
+ ih = ih->ih_next;
+ if (ih->ih_next != idesc)
+ return (-1);
+ ih->ih_next = ih->ih_next->ih_next;
+ }
if (ithd->it_ih == NULL) { /* no handlers left, */
- icu_unset(ithd->irq, idesc->handler);
+ icu_unset(ithd->irq, idesc->ih_handler);
ithds[ithd->irq] = NULL;
mtx_enter(&sched_lock, MTX_SPIN);
diff --git a/sys/i386/isa/intr_machdep.h b/sys/i386/isa/intr_machdep.h
index 999df15..011836d 100644
--- a/sys/i386/isa/intr_machdep.h
+++ b/sys/i386/isa/intr_machdep.h
@@ -218,9 +218,9 @@ int icu_unset __P((int intr, driver_intr_t *handler));
* WARNING: These are internal functions and not to be used by device drivers!
* They are subject to change without notice.
*/
-struct intrec *inthand_add(const char *name, int irq, driver_intr_t handler,
+struct intrhand *inthand_add(const char *name, int irq, driver_intr_t handler,
void *arg, int pri, int flags);
-int inthand_remove(struct intrec *idesc);
+int inthand_remove(struct intrhand *idesc);
void sched_ithd(void *);
void ithd_loop(void *);
void start_softintr(void *);
diff --git a/sys/i386/isa/ipl.s b/sys/i386/isa/ipl.s
index 9bd36cf..8b2380b 100644
--- a/sys/i386/isa/ipl.s
+++ b/sys/i386/isa/ipl.s
@@ -173,43 +173,11 @@ doreti_ast:
jmp doreti_next
ALIGN_TEXT
- .globl _swi_net
- .type _swi_net,@function
-_swi_net:
- MCOUNT
- bsfl _netisr,%eax
- je swi_net_done
-swi_net_more:
- btrl %eax,_netisr
- jnc swi_net_next
- call *_netisrs(,%eax,4)
-swi_net_next:
- bsfl _netisr,%eax
- jne swi_net_more
-swi_net_done:
- ret
-
- ALIGN_TEXT
dummynetisr:
MCOUNT
ret
-/*
- * The arg is in a nonstandard place, so swi_dispatcher() can't be called
- * directly and swi_generic() can't use ENTRY() or MCOUNT.
- */
- ALIGN_TEXT
- .globl _swi_generic
- .type _swi_generic,@function
-_swi_generic:
- pushl %ecx
- FAKE_MCOUNT(4(%esp))
- call _swi_dispatcher
- popl %ecx
- ret
-
-ENTRY(swi_null)
- ret
+
#ifdef APIC_IO
#include "i386/isa/apic_ipl.s"
diff --git a/sys/i386/isa/ipl_funcs.c b/sys/i386/isa/ipl_funcs.c
index 5ee8fa5..16a814e 100644
--- a/sys/i386/isa/ipl_funcs.c
+++ b/sys/i386/isa/ipl_funcs.c
@@ -32,8 +32,3 @@
#include <sys/ipl.h>
#include <sys/interrupt.h>
#include <machine/md_var.h>
-
-swihand_t *shandlers[NSWI] = { /* software interrupts */
- swi_null, swi_net, swi_null, swi_null,
- swi_vm, swi_null, softclock
-};
diff --git a/sys/i386/isa/ithread.c b/sys/i386/isa/ithread.c
index 735204e..17a91f4 100644
--- a/sys/i386/isa/ithread.c
+++ b/sys/i386/isa/ithread.c
@@ -165,7 +165,7 @@ void
ithd_loop(void *dummy)
{
struct ithd *me; /* our thread context */
- struct intrec *ih; /* and our interrupt handler chain */
+ struct intrhand *ih; /* and our interrupt handler chain */
me = curproc->p_ithd; /* point to myself */
@@ -200,17 +200,17 @@ ithd_loop(void *dummy)
#if 0
membar_unlock(); /* push out "it_need=0" */
#endif
- for (ih = me->it_ih; ih != NULL; ih = ih->next) {
+ for (ih = me->it_ih; ih != NULL; ih = ih->ih_next) {
CTR5(KTR_INTR,
"ithd_loop pid %d ih=%p: %p(%p) flg=%x",
me->it_proc->p_pid, (void *)ih,
- (void *)ih->handler, ih->argument,
- ih->flags);
+ (void *)ih->ih_handler, ih->ih_argument,
+ ih->ih_flags);
- if ((ih->flags & INTR_MPSAFE) == 0)
+ if ((ih->ih_flags & INTR_MPSAFE) == 0)
mtx_enter(&Giant, MTX_DEF);
- ih->handler(ih->argument);
- if ((ih->flags & INTR_MPSAFE) == 0)
+ ih->ih_handler(ih->ih_argument);
+ if ((ih->ih_flags & INTR_MPSAFE) == 0)
mtx_exit(&Giant, MTX_DEF);
}
}
diff --git a/sys/i386/isa/nmi.c b/sys/i386/isa/nmi.c
index d7e1b8e..f659ee3 100644
--- a/sys/i386/isa/nmi.c
+++ b/sys/i386/isa/nmi.c
@@ -531,13 +531,13 @@ icu_unset(intr, handler)
return (0);
}
-struct intrec *
+struct intrhand *
inthand_add(const char *name, int irq, driver_intr_t handler, void *arg,
int pri, int flags)
{
struct ithd *ithd = ithds[irq]; /* descriptor for the IRQ */
- struct intrec *head; /* chain of handlers for IRQ */
- struct intrec *idesc; /* descriptor for this handler */
+ struct intrhand *head; /* chain of handlers for IRQ */
+ struct intrhand *idesc; /* descriptor for this handler */
struct proc *p; /* interrupt thread */
int errcode = 0;
@@ -592,7 +592,7 @@ inthand_add(const char *name, int irq, driver_intr_t handler, void *arg,
panic("inthand_add: Can't initialize ICU");
}
} else if ((flags & INTR_EXCL) != 0
- || (ithd->it_ih->flags & INTR_EXCL) != 0) {
+ || (ithd->it_ih->ih_flags & INTR_EXCL) != 0) {
/*
* We can't append the new handler if either
* list ithd or new handler do not allow
@@ -601,14 +601,14 @@ inthand_add(const char *name, int irq, driver_intr_t handler, void *arg,
if (bootverbose)
printf("\tdevice combination %s and %s "
"doesn't support shared irq%d\n",
- ithd->it_ih->name, name, irq);
+ ithd->it_ih->ih_name, name, irq);
return(NULL);
} else if (flags & INTR_FAST) {
/* We can only have one fast interrupt by itself. */
if (bootverbose)
printf("\tCan't add fast interrupt %s"
" to normal interrupt %s on irq%d",
- name, ithd->it_ih->name, irq);
+ name, ithd->it_ih->ih_name, irq);
return (NULL);
} else { /* update p_comm */
p = ithd->it_proc;
@@ -620,42 +620,42 @@ inthand_add(const char *name, int irq, driver_intr_t handler, void *arg,
else
strcat(p->p_comm, "+");
}
- idesc = malloc(sizeof (struct intrec), M_DEVBUF, M_WAITOK);
+ idesc = malloc(sizeof (struct intrhand), M_DEVBUF, M_WAITOK);
if (idesc == NULL)
return (NULL);
- bzero(idesc, sizeof (struct intrec));
+ bzero(idesc, sizeof (struct intrhand));
- idesc->handler = handler;
- idesc->argument = arg;
- idesc->flags = flags;
- idesc->ithd = ithd;
+ idesc->ih_handler = handler;
+ idesc->ih_argument = arg;
+ idesc->ih_flags = flags;
+ idesc->ih_ithd = ithd;
- idesc->name = malloc(strlen(name) + 1, M_DEVBUF, M_WAITOK);
- if (idesc->name == NULL) {
+ idesc->ih_name = malloc(strlen(name) + 1, M_DEVBUF, M_WAITOK);
+ if (idesc->ih_name == NULL) {
free(idesc, M_DEVBUF);
return (NULL);
}
- strcpy(idesc->name, name);
+ strcpy(idesc->ih_name, name);
/* Slow interrupts got set up above. */
if ((flags & INTR_FAST)
- && (icu_setup(irq, idesc->handler, idesc->argument,
- idesc->flags) != 0) ) {
+ && (icu_setup(irq, idesc->ih_handler, idesc->ih_argument,
+ idesc->ih_flags) != 0) ) {
if (bootverbose)
printf("\tinthand_add(irq%d) failed, result=%d\n",
irq, errcode);
- free(idesc->name, M_DEVBUF);
+ free(idesc->ih_name, M_DEVBUF);
free(idesc, M_DEVBUF);
return NULL;
}
head = ithd->it_ih; /* look at chain of handlers */
if (head) {
- while (head->next != NULL)
- head = head->next; /* find the end */
- head->next = idesc; /* hook it in there */
+ while (head->ih_next != NULL)
+ head = head->ih_next; /* find the end */
+ head->ih_next = idesc; /* hook it in there */
} else
ithd->it_ih = idesc; /* put it up front */
- update_intrname(irq, idesc->name);
+ update_intrname(irq, idesc->ih_name);
return (idesc);
}
@@ -670,29 +670,29 @@ inthand_add(const char *name, int irq, driver_intr_t handler, void *arg,
*/
int
-inthand_remove(struct intrec *idesc)
+inthand_remove(struct intrhand *idesc)
{
struct ithd *ithd; /* descriptor for the IRQ */
- struct intrec *ih; /* chain of handlers */
+ struct intrhand *ih; /* chain of handlers */
if (idesc == NULL)
return (-1);
- ithd = idesc->ithd;
+ ithd = idesc->ih_ithd;
ih = ithd->it_ih;
if (ih == idesc) /* first in the chain */
- ithd->it_ih = idesc->next; /* unhook it */
+ ithd->it_ih = idesc->ih_next; /* unhook it */
else {
while ((ih != NULL)
- && (ih->next != idesc) )
- ih = ih->next;
- if (ih->next != idesc)
- return (-1);
- ih->next = ih->next->next;
- }
+ && (ih->ih_next != idesc) )
+ ih = ih->ih_next;
+ if (ih->ih_next != idesc)
+ return (-1);
+ ih->ih_next = ih->ih_next->ih_next;
+ }
if (ithd->it_ih == NULL) { /* no handlers left, */
- icu_unset(ithd->irq, idesc->handler);
+ icu_unset(ithd->irq, idesc->ih_handler);
ithds[ithd->irq] = NULL;
mtx_enter(&sched_lock, MTX_SPIN);
diff --git a/sys/i386/isa/rc.c b/sys/i386/isa/rc.c
index 22c82c2..fc35bd5 100644
--- a/sys/i386/isa/rc.c
+++ b/sys/i386/isa/rc.c
@@ -172,6 +172,8 @@ static int rc_rcsrt[16] = {
TTY_BI|TTY_PE|TTY_FE|TTY_OE
};
+static struct intrhand *rc_ih;
+
/* Static prototypes */
static ointhand2_t rcintr;
static void rc_hwreset __P((int, int, unsigned int));
@@ -268,7 +270,8 @@ rcattach(dvp)
rcb->rcb_probed = RC_ATTACHED;
if (!rc_started) {
cdevsw_add(&rc_cdevsw);
- register_swi(SWI_TTY, rcpoll);
+ rc_ih = sinthand_add("tty:rc", &tty_ithd, rcpoll, NULL,
+ SWI_TTY, 0);
rc_wakeup((void *)NULL);
rc_started = 1;
}
@@ -362,7 +365,7 @@ rcintr(unit)
optr++;
rc_scheduled_event++;
if (val != 0 && val == rc->rc_hotchar)
- setsofttty();
+ sched_swi(rc_ih, SWI_NOSWITCH);
}
} else {
/* Store also status data */
@@ -393,7 +396,7 @@ rcintr(unit)
&& (rc->rc_tp->t_iflag & INPCK))))
val = 0;
else if (val != 0 && val == rc->rc_hotchar)
- setsofttty();
+ sched_swi(rc_ih, SWI_NOSWITCH);
optr[0] = val;
optr[INPUT_FLAGS_SHIFT] = iack;
optr++;
@@ -440,7 +443,7 @@ rcintr(unit)
if ((iack & MCR_CDchg) && !(rc->rc_flags & RC_MODCHG)) {
rc_scheduled_event += LOTS_OF_EVENTS;
rc->rc_flags |= RC_MODCHG;
- setsofttty();
+ sched_swi(rc_ih, SWI_NOSWITCH);
}
goto more_intrs;
}
@@ -481,7 +484,7 @@ rcintr(unit)
if (!(rc->rc_flags & RC_DOXXFER)) {
rc_scheduled_event += LOTS_OF_EVENTS;
rc->rc_flags |= RC_DOXXFER;
- setsofttty();
+ sched_swi(rc_ih, SWI_NOSWITCH);
}
}
}
diff --git a/sys/ia64/ia64/busdma_machdep.c b/sys/ia64/ia64/busdma_machdep.c
index 6696c58..5fa3ee5 100644
--- a/sys/ia64/ia64/busdma_machdep.c
+++ b/sys/ia64/ia64/busdma_machdep.c
@@ -694,7 +694,7 @@ free_bounce_page(bus_dma_tag_t dmat, struct bounce_page *bpage)
STAILQ_INSERT_TAIL(&bounce_map_callbacklist,
map, links);
busdma_swi_pending = 1;
- setsoftvm();
+ sched_swi(vm_ih, SWI_NOSWITCH);
}
}
splx(s);
diff --git a/sys/ia64/ia64/ipl_funcs.c b/sys/ia64/ia64/ipl_funcs.c
index 8acc1f2..3f98cf7 100644
--- a/sys/ia64/ia64/ipl_funcs.c
+++ b/sys/ia64/ia64/ipl_funcs.c
@@ -27,64 +27,9 @@
*/
#include <sys/param.h>
-#include <sys/bus.h>
#include <sys/systm.h>
-#include <sys/kernel.h>
-#include <sys/sysctl.h>
-#include <sys/ktr.h>
-#include <sys/interrupt.h>
-#include <machine/ipl.h>
-#include <machine/cpu.h>
-#include <machine/globaldata.h>
-#include <machine/globals.h>
-#include <machine/mutex.h>
-#include <net/netisr.h>
-
-#include "sio.h"
unsigned int bio_imask; /* XXX */
unsigned int cam_imask; /* XXX */
unsigned int net_imask; /* XXX */
unsigned int tty_imask; /* XXX */
-
-static void swi_net(void);
-
-void (*netisrs[32]) __P((void));
-swihand_t *shandlers[32] = { /* software interrupts */
- swi_null, swi_net, swi_null, swi_null,
- swi_null, swi_null, softclock, swi_null,
- swi_null, swi_null, swi_null, swi_null,
- swi_null, swi_null, swi_null, swi_null,
- swi_null, swi_null, swi_null, swi_null,
- swi_null, swi_null, swi_null, swi_null,
- swi_null, swi_null, swi_null, swi_null,
- swi_null, swi_null, swi_null, swi_null,
-};
-
-u_int32_t netisr;
-
-void
-swi_null()
-{
- /* No interrupt registered, do nothing */
-}
-
-void
-swi_generic()
-{
- /* Just a placeholder, we call swi_dispatcher directly */
- panic("swi_generic() called");
-}
-
-static void
-swi_net()
-{
- u_int32_t bits = atomic_readandclear_32(&netisr);
- int i;
-
- for (i = 0; i < 32; i++) {
- if (bits & 1)
- netisrs[i]();
- bits >>= 1;
- }
-}
diff --git a/sys/ia64/ia64/mem.c b/sys/ia64/ia64/mem.c
index b3f5531..1522ecf 100644
--- a/sys/ia64/ia64/mem.c
+++ b/sys/ia64/ia64/mem.c
@@ -95,12 +95,6 @@ static struct cdevsw mem_cdevsw = {
/* bmaj */ -1
};
-#if NHWI > 0
-#define ICU_LEN (NHWI)
-#else
-#define ICU_LEN (NSWI)
-#endif
-
struct mem_range_softc mem_range_softc;
static int
diff --git a/sys/ia64/ia64/vm_machdep.c b/sys/ia64/ia64/vm_machdep.c
index fee46d6..1c57552 100644
--- a/sys/ia64/ia64/vm_machdep.c
+++ b/sys/ia64/ia64/vm_machdep.c
@@ -519,7 +519,7 @@ vm_page_zero_idle()
* Software interrupt handler for queued VM system processing.
*/
void
-swi_vm()
+swi_vm(void *dummy)
{
#if 0
if (busdma_swi_pending != 0)
diff --git a/sys/ia64/include/ipl.h b/sys/ia64/include/ipl.h
index bb62be4..dd1f129 100644
--- a/sys/ia64/include/ipl.h
+++ b/sys/ia64/include/ipl.h
@@ -30,12 +30,6 @@
#define _MACHINE_IPL_H_
/*
- * Software interrupt bit numbers
- */
-#define NSWI 32
-#define NHWI 0
-
-/*
* Interprocessor interrupts for SMP.
*/
#define IPI_INVLTLB 0x0001
@@ -50,4 +44,4 @@ void smp_ipi_all_but_self(u_int64_t ipi);
void smp_ipi_self(u_int64_t ipi);
void smp_handle_ipi(struct trapframe *frame);
-#endif /* !_MACHINE_MD_VAR_H_ */
+#endif /* !_MACHINE_IPL_H_ */
diff --git a/sys/ia64/include/md_var.h b/sys/ia64/include/md_var.h
index eeaff20..fb1b4b5 100644
--- a/sys/ia64/include/md_var.h
+++ b/sys/ia64/include/md_var.h
@@ -47,7 +47,7 @@ void busdma_swi __P((void));
void cpu_halt __P((void));
void cpu_reset __P((void));
int is_physical_memory __P((vm_offset_t addr));
-void swi_vm __P((void));
+void swi_vm __P((void *));
int vm_page_zero_idle __P((void));
int fill_regs __P((struct proc *, struct reg *));
int set_regs __P((struct proc *, struct reg *));
diff --git a/sys/isa/atrtc.c b/sys/isa/atrtc.c
index 3971cf5..1ad7bf4 100644
--- a/sys/isa/atrtc.c
+++ b/sys/isa/atrtc.c
@@ -216,7 +216,6 @@ clkintr(struct clockframe frame)
switch (timer0_state) {
case RELEASED:
- setdelayed();
break;
case ACQUIRED:
@@ -224,7 +223,6 @@ clkintr(struct clockframe frame)
>= hardclock_max_count) {
timer0_prescaler_count -= hardclock_max_count;
hardclock(&frame);
- setdelayed();
}
break;
@@ -239,7 +237,6 @@ clkintr(struct clockframe frame)
mtx_exit(&clock_lock, MTX_SPIN);
timer_func = new_function;
timer0_state = ACQUIRED;
- setdelayed();
break;
case RELEASE_PENDING:
@@ -258,7 +255,6 @@ clkintr(struct clockframe frame)
timer_func = hardclock;
timer0_state = RELEASED;
hardclock(&frame);
- setdelayed();
}
break;
}
@@ -967,7 +963,7 @@ cpu_initclocks()
int diag;
#ifdef APIC_IO
int apic_8254_trial;
- struct intrec *clkdesc;
+ struct intrhand *clkdesc;
#endif /* APIC_IO */
if (statclock_disable) {
diff --git a/sys/isa/sio.c b/sys/isa/sio.c
index 4c403d1..4dc22ea 100644
--- a/sys/isa/sio.c
+++ b/sys/isa/sio.c
@@ -300,7 +300,7 @@ static void siointr1 __P((struct com_s *com));
static void siointr __P((void *arg));
static int commctl __P((struct com_s *com, int bits, int how));
static int comparam __P((struct tty *tp, struct termios *t));
-static swihand_t siopoll;
+static void siopoll __P((void *));
static int sioprobe __P((device_t dev, int xrid));
static int sio_isa_probe __P((device_t dev));
static void siosettimeout __P((void));
@@ -413,7 +413,8 @@ static int siocnunit;
#endif
static Port_t siogdbiobase;
static int siogdbunit = -1;
-static bool_t sio_registered;
+static struct intrhand *sio_slow_ih;
+static struct intrhand *sio_fast_ih;
static int sio_timeout;
static int sio_timeouts_until_log;
static struct callout_handle sio_timeout_handle
@@ -1322,9 +1323,11 @@ determined_type: ;
printf(" with a bogus IIR_TXRDY register");
printf("\n");
- if (!sio_registered) {
- register_swi(SWI_TTY, siopoll);
- sio_registered = TRUE;
+ if (sio_fast_ih == NULL) {
+ sio_fast_ih = sinthand_add("tty:sio", &tty_ithd, siopoll,
+ NULL, SWI_TTY, 0);
+ sio_slow_ih = sinthand_add("tty:sio", &clk_ithd, siopoll,
+ NULL, SWI_TTY, 0);
}
com->devs[0] = make_dev(&sio_cdevsw, unit,
UID_ROOT, GID_WHEEL, 0600, "ttyd%r", unit);
@@ -1979,7 +1982,7 @@ siointr1(com)
}
++com->bytes_in;
if (com->hotchar != 0 && recv_data == com->hotchar)
- setsofttty();
+ sched_swi(sio_fast_ih, SWI_NOSWITCH);
ioptr = com->iptr;
if (ioptr >= com->ibufend)
CE_RECORD(com, CE_INTERRUPT_BUF_OVERFLOW);
@@ -1987,10 +1990,10 @@ siointr1(com)
if (com->do_timestamp)
microtime(&com->timestamp);
++com_events;
- schedsofttty();
+ sched_swi(sio_slow_ih, SWI_DELAY);
#if 0 /* for testing input latency vs efficiency */
if (com->iptr - com->ibuf == 8)
- setsofttty();
+ sched_swi(sio_fast_ih, SWI_NOSWITCH);
#endif
ioptr[0] = recv_data;
ioptr[com->ierroff] = line_status;
@@ -2028,7 +2031,7 @@ cont:
if (!(com->state & CS_CHECKMSR)) {
com_events += LOTS_OF_EVENTS;
com->state |= CS_CHECKMSR;
- setsofttty();
+ sched_swi(sio_fast_ih, SWI_NOSWITCH);
}
/* handle CTS change immediately for crisp flow ctl */
@@ -2082,7 +2085,8 @@ cont:
if (!(com->state & CS_ODONE)) {
com_events += LOTS_OF_EVENTS;
com->state |= CS_ODONE;
- setsofttty(); /* handle at high level ASAP */
+ /* handle at high level ASAP */
+ sched_swi(sio_fast_ih, SWI_NOSWITCH);
}
}
if (COM_IIR_TXRDYBUG(com->flags) && (int_ctl != int_ctl_new)) {
@@ -2257,7 +2261,7 @@ sioioctl(dev, cmd, data, flag, p)
/* software interrupt handler for SWI_TTY */
static void
-siopoll()
+siopoll(void *dummy)
{
int unit;
int intrsave;
diff --git a/sys/kern/kern_clock.c b/sys/kern/kern_clock.c
index c01b68e..74f346e 100644
--- a/sys/kern/kern_clock.c
+++ b/sys/kern/kern_clock.c
@@ -58,6 +58,8 @@
#include <vm/pmap.h>
#include <vm/vm_map.h>
#include <sys/sysctl.h>
+#include <sys/bus.h>
+#include <sys/interrupt.h>
#include <machine/cpu.h>
#include <machine/limits.h>
@@ -192,7 +194,7 @@ hardclock(frame)
* relatively high clock interrupt priority any longer than necessary.
*/
if (TAILQ_FIRST(&callwheel[ticks & callwheelmask]) != NULL) {
- setsoftclock();
+ sched_swi(softclock_ih, SWI_NOSWITCH);
} else if (softticks + 1 == ticks)
++softticks;
}
diff --git a/sys/kern/kern_intr.c b/sys/kern/kern_intr.c
index 40d5f84..da687aa 100644
--- a/sys/kern/kern_intr.c
+++ b/sys/kern/kern_intr.c
@@ -44,105 +44,18 @@
#include <sys/vmmeter.h>
#include <machine/atomic.h>
#include <machine/cpu.h>
+#include <machine/md_var.h>
-struct swilist {
- swihand_t *sl_handler;
- struct swilist *sl_next;
-};
+#include <net/netisr.h> /* prototype for legacy_setsoftnet */
-static struct swilist swilists[NSWI];
-u_long softintr_count[NSWI];
-static struct proc *softithd;
-volatile u_int sdelayed;
-volatile u_int spending;
+struct intrhand *net_ih;
+struct intrhand *vm_ih;
+struct intrhand *softclock_ih;
+struct ithd *clk_ithd;
+struct ithd *tty_ithd;
static void start_softintr(void *);
-static void intr_soft(void *);
-
-void
-register_swi(intr, handler)
- int intr;
- swihand_t *handler;
-{
- struct swilist *slp, *slq;
- int s;
-
- if (intr < 0 || intr >= NSWI)
- panic("register_swi: bad intr %d", intr);
- if (handler == swi_generic || handler == swi_null)
- panic("register_swi: bad handler %p", (void *)handler);
- slp = &swilists[intr];
- s = splhigh();
- if (shandlers[intr] == swi_null)
- shandlers[intr] = handler;
- else {
- if (slp->sl_next == NULL) {
- slp->sl_handler = shandlers[intr];
- shandlers[intr] = swi_generic;
- }
- slq = malloc(sizeof(*slq), M_DEVBUF, M_NOWAIT);
- if (slq == NULL)
- panic("register_swi: malloc failed");
- slq->sl_handler = handler;
- slq->sl_next = NULL;
- while (slp->sl_next != NULL)
- slp = slp->sl_next;
- slp->sl_next = slq;
- }
- splx(s);
-}
-
-void
-swi_dispatcher(intr)
- int intr;
-{
- struct swilist *slp;
-
- slp = &swilists[intr];
- do {
- (*slp->sl_handler)();
- slp = slp->sl_next;
- } while (slp != NULL);
-}
-
-void
-unregister_swi(intr, handler)
- int intr;
- swihand_t *handler;
-{
- struct swilist *slfoundpred, *slp, *slq;
- int s;
-
- if (intr < 0 || intr >= NSWI)
- panic("unregister_swi: bad intr %d", intr);
- if (handler == swi_generic || handler == swi_null)
- panic("unregister_swi: bad handler %p", (void *)handler);
- slp = &swilists[intr];
- s = splhigh();
- if (shandlers[intr] == handler)
- shandlers[intr] = swi_null;
- else if (slp->sl_next != NULL) {
- slfoundpred = NULL;
- for (slq = slp->sl_next; slq != NULL;
- slp = slq, slq = slp->sl_next)
- if (slq->sl_handler == handler)
- slfoundpred = slp;
- slp = &swilists[intr];
- if (slfoundpred != NULL) {
- slq = slfoundpred->sl_next;
- slfoundpred->sl_next = slq->sl_next;
- free(slq, M_DEVBUF);
- } else if (slp->sl_handler == handler) {
- slq = slp->sl_next;
- slp->sl_next = slq->sl_next;
- slp->sl_handler = slq->sl_handler;
- free(slq, M_DEVBUF);
- }
- if (slp->sl_next == NULL)
- shandlers[intr] = slp->sl_handler;
- }
- splx(s);
-}
+static void swi_net(void *);
int
ithread_priority(flags)
@@ -181,177 +94,199 @@ ithread_priority(flags)
return pri;
}
-/*
- * Schedule the soft interrupt handler thread.
- */
-void
-sched_softintr(void)
-{
- atomic_add_int(&cnt.v_intr, 1); /* one more global interrupt */
-
- /*
- * If we don't have an interrupt resource or an interrupt thread for
- * this IRQ, log it as a stray interrupt.
- */
- if (softithd == NULL)
- panic("soft interrupt scheduled too early");
-
- CTR3(KTR_INTR, "sched_softintr pid %d(%s) spending=0x%x",
- softithd->p_pid, softithd->p_comm, spending);
+void sithd_loop(void *);
- /*
- * Get the sched lock and see if the thread is on whichkqs yet.
- * If not, put it on there. In any case, kick everyone so that if
- * the new thread is higher priority than their current thread, it
- * gets run now.
- */
- mtx_enter(&sched_lock, MTX_SPIN);
- if (softithd->p_stat == SWAIT) { /* not on run queue */
- CTR1(KTR_INTR, "sched_softintr: setrunqueue %d",
- softithd->p_pid);
-/* membar_lock(); */
- softithd->p_stat = SRUN;
- setrunqueue(softithd);
- aston();
+struct intrhand *
+sinthand_add(const char *name, struct ithd **ithdp, driver_intr_t handler,
+ void *arg, int pri, int flags)
+{
+ struct proc *p;
+ struct ithd *ithd;
+ struct intrhand *ih;
+ struct intrhand *this_ih;
+
+ ithd = (ithdp != NULL) ? *ithdp : NULL;
+
+
+ if (ithd == NULL) {
+ int error;
+ ithd = malloc(sizeof (struct ithd), M_DEVBUF, M_WAITOK | M_ZERO);
+ error = kthread_create(sithd_loop, NULL, &p,
+ RFSTOPPED | RFHIGHPID, "swi%d: %s", pri, name);
+ if (error)
+ panic("inthand_add: Can't create interrupt thread");
+ ithd->it_proc = p;
+ p->p_ithd = ithd;
+ p->p_rtprio.type = RTP_PRIO_ITHREAD;
+ p->p_rtprio.prio = pri + PI_SOFT; /* soft interrupt */
+ p->p_stat = SWAIT; /* we're idle */
+ /* XXX - some hacks are _really_ gross */
+ if (pri == SWI_CLOCK)
+ p->p_flag |= P_NOLOAD;
+ if (ithdp != NULL)
+ *ithdp = ithd;
}
- mtx_exit(&sched_lock, MTX_SPIN);
-#if 0
- aston(); /* ??? check priorities first? */
-#else
- need_resched();
-#endif
+ this_ih = malloc(sizeof (struct intrhand), M_DEVBUF, M_WAITOK | M_ZERO);
+ this_ih->ih_handler = handler;
+ this_ih->ih_argument = arg;
+ this_ih->ih_flags = flags;
+ this_ih->ih_ithd = ithd;
+ this_ih->ih_name = malloc(strlen(name) + 1, M_DEVBUF, M_WAITOK);
+ if ((ih = ithd->it_ih)) {
+ while (ih->ih_next != NULL)
+ ih = ih->ih_next;
+ ih->ih_next = this_ih;
+ } else
+ ithd->it_ih = this_ih;
+ strcpy(this_ih->ih_name, name);
+ return (this_ih);
}
-SYSINIT(start_softintr, SI_SUB_SOFTINTR, SI_ORDER_FIRST, start_softintr, NULL)
/*
- * Start soft interrupt thread.
+ * Schedule a heavyweight software interrupt process.
*/
-static void
-start_softintr(dummy)
- void *dummy;
+void
+sched_swi(struct intrhand *ih, int flag)
{
- int error;
-
- if (softithd != NULL) { /* we already have a thread */
- printf("start_softintr: already running");
- return;
- }
+ struct ithd *it = ih->ih_ithd; /* and the process that does it */
+ struct proc *p = it->it_proc;
- error = kthread_create(intr_soft, NULL, &softithd,
- RFSTOPPED | RFHIGHPID, "softinterrupt");
- if (error)
- panic("start_softintr: kthread_create error %d\n", error);
+ atomic_add_int(&cnt.v_intr, 1); /* one more global interrupt */
+
+ CTR3(KTR_INTR, "sched_sihand pid %d(%s) need=%d",
+ p->p_pid, p->p_comm, it->it_need);
- softithd->p_rtprio.type = RTP_PRIO_ITHREAD;
- softithd->p_rtprio.prio = PI_SOFT; /* soft interrupt */
- softithd->p_stat = SWAIT; /* we're idle */
- softithd->p_flag |= P_NOLOAD;
+ /*
+ * Set it_need so that if the thread is already running but close
+ * to done, it will do another go-round. Then get the sched lock
+ * and see if the thread is on whichkqs yet. If not, put it on
+ * there. In any case, kick everyone so that if the new thread
+ * is higher priority than their current thread, it gets run now.
+ */
+ ih->ih_need = 1;
+ if (!(flag & SWI_DELAY)) {
+ it->it_need = 1;
+ mtx_enter(&sched_lock, MTX_SPIN);
+ if (p->p_stat == SWAIT) { /* not on run queue */
+ CTR1(KTR_INTR, "sched_ithd: setrunqueue %d", p->p_pid);
+/* membar_lock(); */
+ p->p_stat = SRUN;
+ setrunqueue(p);
+ aston();
+ }
+ else {
+ CTR3(KTR_INTR, "sched_ithd %d: it_need %d, state %d",
+ p->p_pid, it->it_need, p->p_stat );
+ }
+ mtx_exit(&sched_lock, MTX_SPIN);
+ need_resched();
+ }
}
/*
- * Software interrupt process code.
+ * This is the main code for soft interrupt threads.
*/
-static void
-intr_soft(dummy)
- void *dummy;
+void
+sithd_loop(void *dummy)
{
- int i;
- u_int pend;
+ struct ithd *it; /* our thread context */
+ struct intrhand *ih; /* and our interrupt handler chain */
+
+ struct proc *p = curproc;
+ it = p->p_ithd; /* point to myself */
- /* Main loop */
+ /*
+ * As long as we have interrupts outstanding, go through the
+ * list of handlers, giving each one a go at it.
+ */
for (;;) {
- CTR3(KTR_INTR, "intr_soft pid %d(%s) spending=0x%x",
- curproc->p_pid, curproc->p_comm, spending);
-
- /*
- * Service interrupts. If another interrupt arrives
- * while we are running, they will set spending to
- * denote that we should make another pass.
- */
- pend = atomic_readandclear_int(&spending);
- while ((i = ffs(pend))) {
- i--;
- atomic_add_long(&softintr_count[i], 1);
- pend &= ~ (1 << i);
- mtx_enter(&Giant, MTX_DEF);
- if (shandlers[i] == swi_generic)
- swi_dispatcher(i);
- else
- (shandlers[i])();
- mtx_exit(&Giant, MTX_DEF);
+ CTR3(KTR_INTR, "sithd_loop pid %d(%s) need=%d",
+ p->p_pid, p->p_comm, it->it_need);
+ while (it->it_need) {
+ /*
+ * Service interrupts. If another interrupt
+ * arrives while we are running, they will set
+ * it_need to denote that we should make
+ * another pass.
+ */
+ it->it_need = 0;
+ for (ih = it->it_ih; ih != NULL; ih = ih->ih_next) {
+ if (!ih->ih_need)
+ continue;
+ ih->ih_need = 0;
+ CTR5(KTR_INTR,
+ "ithd_loop pid %d ih=%p: %p(%p) flg=%x",
+ p->p_pid, (void *)ih,
+ (void *)ih->ih_handler, ih->ih_argument,
+ ih->ih_flags);
+
+ if ((ih->ih_flags & INTR_MPSAFE) == 0)
+ mtx_enter(&Giant, MTX_DEF);
+ ih->ih_handler(ih->ih_argument);
+ if ((ih->ih_flags & INTR_MPSAFE) == 0)
+ mtx_exit(&Giant, MTX_DEF);
+ }
}
+
/*
* Processed all our interrupts. Now get the sched
- * lock. This may take a while and spending may get
+ * lock. This may take a while and it_need may get
* set again, so we have to check it again.
*/
mtx_enter(&sched_lock, MTX_SPIN);
- if (spending == 0) {
- CTR1(KTR_INTR, "intr_soft pid %d: done",
- curproc->p_pid);
- curproc->p_stat = SWAIT; /* we're idle */
+ if (!it->it_need) {
+ p->p_stat = SWAIT; /* we're idle */
+ CTR1(KTR_INTR, "sithd_loop pid %d: done", p->p_pid);
mi_switch();
- CTR1(KTR_INTR, "intr_soft pid %d: resumed",
- curproc->p_pid);
+ CTR1(KTR_INTR, "sithd_loop pid %d: resumed", p->p_pid);
}
mtx_exit(&sched_lock, MTX_SPIN);
}
}
+SYSINIT(start_softintr, SI_SUB_SOFTINTR, SI_ORDER_FIRST, start_softintr, NULL)
+
/*
- * Bits in the spending bitmap variable must be set atomically because
- * spending may be manipulated by interrupts or other cpu's without holding
- * any locks.
- *
- * Note: setbits uses a locked or, making simple cases MP safe.
+ * Start standard software interrupt threads
*/
-#define DO_SETBITS(name, var, bits) \
-void name(void) \
-{ \
- atomic_set_int(var, bits); \
- sched_softintr(); \
+static void
+start_softintr(dummy)
+ void *dummy;
+{
+ net_ih = sinthand_add("net", NULL, swi_net, NULL, SWI_NET, 0);
+ softclock_ih =
+ sinthand_add("clock", &clk_ithd, softclock, NULL, SWI_CLOCK, 0);
+ vm_ih = sinthand_add("vm", NULL, swi_vm, NULL, SWI_VM, 0);
}
-#define DO_SETBITS_AND_NO_MORE(name, var, bits) \
-void name(void) \
-{ \
- atomic_set_int(var, bits); \
+void
+legacy_setsoftnet()
+{
+ sched_swi(net_ih, SWI_NOSWITCH);
}
-DO_SETBITS(setsoftcamnet,&spending, SWI_CAMNET_PENDING)
-DO_SETBITS(setsoftcambio,&spending, SWI_CAMBIO_PENDING)
-DO_SETBITS(setsoftclock, &spending, SWI_CLOCK_PENDING)
-DO_SETBITS(setsoftnet, &spending, SWI_NET_PENDING)
-DO_SETBITS(setsofttty, &spending, SWI_TTY_PENDING)
-DO_SETBITS(setsoftvm, &spending, SWI_VM_PENDING)
-DO_SETBITS(setsofttq, &spending, SWI_TQ_PENDING)
-
-DO_SETBITS_AND_NO_MORE(schedsoftcamnet, &sdelayed, SWI_CAMNET_PENDING)
-DO_SETBITS_AND_NO_MORE(schedsoftcambio, &sdelayed, SWI_CAMBIO_PENDING)
-DO_SETBITS_AND_NO_MORE(schedsoftnet, &sdelayed, SWI_NET_PENDING)
-DO_SETBITS_AND_NO_MORE(schedsofttty, &sdelayed, SWI_TTY_PENDING)
-DO_SETBITS_AND_NO_MORE(schedsoftvm, &sdelayed, SWI_VM_PENDING)
-DO_SETBITS_AND_NO_MORE(schedsofttq, &sdelayed, SWI_TQ_PENDING)
+/*
+ * XXX: This should really be in the network code somewhere and installed
+ * via a SI_SUB_SOFINTR, SI_ORDER_MIDDLE sysinit.
+ */
+void (*netisrs[32]) __P((void));
+u_int netisr;
-void
-setdelayed(void)
+static void
+swi_net(void *dummy)
{
- int pend;
+ u_int bits;
+ int i;
- pend = atomic_readandclear_int(&sdelayed);
- if (pend != 0) {
- atomic_set_int(&spending, pend);
- sched_softintr();
+ bits = atomic_readandclear_int(&netisr);
+ while ((i = ffs(bits)) != 0) {
+ i--;
+ netisrs[i]();
+ bits &= ~(1 << i);
}
}
-intrmask_t
-softclockpending(void)
-{
- return (spending & SWI_CLOCK_PENDING);
-}
-
/*
* Dummy spl calls. The only reason for these is to not break
* all the code which expects to call them.
diff --git a/sys/kern/kern_timeout.c b/sys/kern/kern_timeout.c
index e73d371..fb6cda3 100644
--- a/sys/kern/kern_timeout.c
+++ b/sys/kern/kern_timeout.c
@@ -75,7 +75,7 @@ static struct callout *nextsoftcheck; /* Next callout to be checked. */
* Run periodic events from timeout queue.
*/
void
-softclock()
+softclock(void *dummy)
{
register struct callout *c;
register struct callout_tailq *bucket;
diff --git a/sys/kern/subr_taskqueue.c b/sys/kern/subr_taskqueue.c
index 3fa0f05..ba25c7f 100644
--- a/sys/kern/subr_taskqueue.c
+++ b/sys/kern/subr_taskqueue.c
@@ -40,6 +40,8 @@ MALLOC_DEFINE(M_TASKQUEUE, "taskqueue", "Task Queues");
static STAILQ_HEAD(taskqueue_list, taskqueue) taskqueue_queues;
+static struct intrhand *taskqueue_ih;
+
struct taskqueue {
STAILQ_ENTRY(taskqueue) tq_link;
STAILQ_HEAD(, task) tq_queue;
@@ -191,14 +193,15 @@ taskqueue_run(struct taskqueue *queue)
static void
taskqueue_swi_enqueue(void *context)
{
- setsofttq();
+ sched_swi(taskqueue_ih, SWI_NOSWITCH);
}
static void
-taskqueue_swi_run(void)
+taskqueue_swi_run(void *dummy)
{
taskqueue_run(taskqueue_swi);
}
TASKQUEUE_DEFINE(swi, taskqueue_swi_enqueue, 0,
- register_swi(SWI_TQ, taskqueue_swi_run));
+ taskqueue_ih = sinthand_add("task queue", NULL,
+ taskqueue_swi_run, NULL, SWI_TQ, 0));
diff --git a/sys/net/netisr.h b/sys/net/netisr.h
index 07f6b7c..f227fb2 100644
--- a/sys/net/netisr.h
+++ b/sys/net/netisr.h
@@ -68,8 +68,10 @@
#ifndef LOCORE
#ifdef _KERNEL
+void legacy_setsoftnet __P((void));
+
extern volatile unsigned int netisr; /* scheduling bits for network */
-#define schednetisr(anisr) { netisr |= 1 << (anisr); setsoftnet(); }
+#define schednetisr(anisr) { netisr |= 1 << (anisr); legacy_setsoftnet(); }
typedef void netisr_t __P((void));
diff --git a/sys/pc98/cbus/clock.c b/sys/pc98/cbus/clock.c
index 3cbf693..f757a6a 100644
--- a/sys/pc98/cbus/clock.c
+++ b/sys/pc98/cbus/clock.c
@@ -1298,7 +1298,7 @@ cpu_initclocks()
{
#ifdef APIC_IO
int apic_8254_trial;
- struct intrec *clkdesc;
+ struct intrhand *clkdesc;
#endif /* APIC_IO */
#ifndef PC98
int diag;
diff --git a/sys/pc98/cbus/pcrtc.c b/sys/pc98/cbus/pcrtc.c
index 3cbf693..f757a6a 100644
--- a/sys/pc98/cbus/pcrtc.c
+++ b/sys/pc98/cbus/pcrtc.c
@@ -1298,7 +1298,7 @@ cpu_initclocks()
{
#ifdef APIC_IO
int apic_8254_trial;
- struct intrec *clkdesc;
+ struct intrhand *clkdesc;
#endif /* APIC_IO */
#ifndef PC98
int diag;
diff --git a/sys/pc98/cbus/sio.c b/sys/pc98/cbus/sio.c
index 8905654..4477cac 100644
--- a/sys/pc98/cbus/sio.c
+++ b/sys/pc98/cbus/sio.c
@@ -533,7 +533,8 @@ static int siocnunit;
#endif
static Port_t siogdbiobase;
static int siogdbunit = -1;
-static bool_t sio_registered;
+static struct intrhand *sio_slow_ih;
+static struct intrhand *sio_fast_ih;
static int sio_timeout;
static int sio_timeouts_until_log;
static struct callout_handle sio_timeout_handle
@@ -2083,9 +2084,11 @@ determined_type: ;
printf(" with a bogus IIR_TXRDY register");
printf("\n");
- if (!sio_registered) {
- register_swi(SWI_TTY, siopoll);
- sio_registered = TRUE;
+ if (sio_fast_ih == NULL) {
+ sio_fast_ih = sinthand_add("tty:sio", &tty_ithd, siopoll,
+ NULL, SWI_TTY, 0);
+ sio_slow_ih = sinthand_add("tty:sio", &clk_ithd, siopoll,
+ NULL, SWI_TTY, 0);
}
make_dev(&sio_cdevsw, unit,
UID_ROOT, GID_WHEEL, 0600, "ttyd%r", unit);
@@ -2917,7 +2920,7 @@ more_intr:
}
++com->bytes_in;
if (com->hotchar != 0 && recv_data == com->hotchar)
- setsofttty();
+ sched_swi(sio_fast_ih, SWI_NOSWITCH);
ioptr = com->iptr;
if (ioptr >= com->ibufend)
CE_RECORD(com, CE_INTERRUPT_BUF_OVERFLOW);
@@ -2926,14 +2929,10 @@ more_intr:
microtime(&com->timestamp);
++com_events;
/* XXX - needs to go away when alpha gets ithreads */
-#ifdef __alpha__
- schedsofttty();
-#else
- setsofttty();
-#endif
+ sched_swi(sio_slow_ih, SWI_DELAY);
#if 0 /* for testing input latency vs efficiency */
if (com->iptr - com->ibuf == 8)
- setsofttty();
+ sched_swi(sio_fast_ih, SWI_NOSWITCH);
#endif
ioptr[0] = recv_data;
ioptr[com->ierroff] = line_status;
@@ -2987,7 +2986,7 @@ cont:
if (!(com->state & CS_CHECKMSR)) {
com_events += LOTS_OF_EVENTS;
com->state |= CS_CHECKMSR;
- setsofttty();
+ sched_swi(sio_fast_ih, SWI_NOSWITCH);
}
/* handle CTS change immediately for crisp flow ctl */
@@ -3089,7 +3088,8 @@ cont:
if (!(com->state & CS_ODONE)) {
com_events += LOTS_OF_EVENTS;
com->state |= CS_ODONE;
- setsofttty(); /* handle at high level ASAP */
+ /* handle at high level ASAP */
+ sched_swi(sio_fast_ih, SWI_NOSWITCH);
}
}
if (COM_IIR_TXRDYBUG(com->flags) && (int_ctl != int_ctl_new)) {
diff --git a/sys/pc98/pc98/clock.c b/sys/pc98/pc98/clock.c
index 3cbf693..f757a6a 100644
--- a/sys/pc98/pc98/clock.c
+++ b/sys/pc98/pc98/clock.c
@@ -1298,7 +1298,7 @@ cpu_initclocks()
{
#ifdef APIC_IO
int apic_8254_trial;
- struct intrec *clkdesc;
+ struct intrhand *clkdesc;
#endif /* APIC_IO */
#ifndef PC98
int diag;
diff --git a/sys/pc98/pc98/sio.c b/sys/pc98/pc98/sio.c
index 8905654..4477cac 100644
--- a/sys/pc98/pc98/sio.c
+++ b/sys/pc98/pc98/sio.c
@@ -533,7 +533,8 @@ static int siocnunit;
#endif
static Port_t siogdbiobase;
static int siogdbunit = -1;
-static bool_t sio_registered;
+static struct intrhand *sio_slow_ih;
+static struct intrhand *sio_fast_ih;
static int sio_timeout;
static int sio_timeouts_until_log;
static struct callout_handle sio_timeout_handle
@@ -2083,9 +2084,11 @@ determined_type: ;
printf(" with a bogus IIR_TXRDY register");
printf("\n");
- if (!sio_registered) {
- register_swi(SWI_TTY, siopoll);
- sio_registered = TRUE;
+ if (sio_fast_ih == NULL) {
+ sio_fast_ih = sinthand_add("tty:sio", &tty_ithd, siopoll,
+ NULL, SWI_TTY, 0);
+ sio_slow_ih = sinthand_add("tty:sio", &clk_ithd, siopoll,
+ NULL, SWI_TTY, 0);
}
make_dev(&sio_cdevsw, unit,
UID_ROOT, GID_WHEEL, 0600, "ttyd%r", unit);
@@ -2917,7 +2920,7 @@ more_intr:
}
++com->bytes_in;
if (com->hotchar != 0 && recv_data == com->hotchar)
- setsofttty();
+ sched_swi(sio_fast_ih, SWI_NOSWITCH);
ioptr = com->iptr;
if (ioptr >= com->ibufend)
CE_RECORD(com, CE_INTERRUPT_BUF_OVERFLOW);
@@ -2926,14 +2929,10 @@ more_intr:
microtime(&com->timestamp);
++com_events;
/* XXX - needs to go away when alpha gets ithreads */
-#ifdef __alpha__
- schedsofttty();
-#else
- setsofttty();
-#endif
+ sched_swi(sio_slow_ih, SWI_DELAY);
#if 0 /* for testing input latency vs efficiency */
if (com->iptr - com->ibuf == 8)
- setsofttty();
+ sched_swi(sio_fast_ih, SWI_NOSWITCH);
#endif
ioptr[0] = recv_data;
ioptr[com->ierroff] = line_status;
@@ -2987,7 +2986,7 @@ cont:
if (!(com->state & CS_CHECKMSR)) {
com_events += LOTS_OF_EVENTS;
com->state |= CS_CHECKMSR;
- setsofttty();
+ sched_swi(sio_fast_ih, SWI_NOSWITCH);
}
/* handle CTS change immediately for crisp flow ctl */
@@ -3089,7 +3088,8 @@ cont:
if (!(com->state & CS_ODONE)) {
com_events += LOTS_OF_EVENTS;
com->state |= CS_ODONE;
- setsofttty(); /* handle at high level ASAP */
+ /* handle at high level ASAP */
+ sched_swi(sio_fast_ih, SWI_NOSWITCH);
}
}
if (COM_IIR_TXRDYBUG(com->flags) && (int_ctl != int_ctl_new)) {
diff --git a/sys/powerpc/aim/vm_machdep.c b/sys/powerpc/aim/vm_machdep.c
index c766291..f260a26 100644
--- a/sys/powerpc/aim/vm_machdep.c
+++ b/sys/powerpc/aim/vm_machdep.c
@@ -470,7 +470,7 @@ vm_page_zero_idle()
* Software interrupt handler for queued VM system processing.
*/
void
-swi_vm()
+swi_vm(void *dummy)
{
if (busdma_swi_pending != 0)
busdma_swi();
diff --git a/sys/powerpc/include/md_var.h b/sys/powerpc/include/md_var.h
index d3e4ea3..a2f70b6 100644
--- a/sys/powerpc/include/md_var.h
+++ b/sys/powerpc/include/md_var.h
@@ -50,7 +50,7 @@ void busdma_swi __P((void));
void cpu_halt __P((void));
void cpu_reset __P((void));
int is_physical_memory __P((vm_offset_t addr));
-void swi_vm __P((void));
+void swi_vm __P((void *));
int vm_page_zero_idle __P((void));
int fill_regs __P((struct proc *, struct reg *));
int set_regs __P((struct proc *, struct reg *));
diff --git a/sys/powerpc/powerpc/vm_machdep.c b/sys/powerpc/powerpc/vm_machdep.c
index c766291..f260a26 100644
--- a/sys/powerpc/powerpc/vm_machdep.c
+++ b/sys/powerpc/powerpc/vm_machdep.c
@@ -470,7 +470,7 @@ vm_page_zero_idle()
* Software interrupt handler for queued VM system processing.
*/
void
-swi_vm()
+swi_vm(void *dummy)
{
if (busdma_swi_pending != 0)
busdma_swi();
diff --git a/sys/sys/interrupt.h b/sys/sys/interrupt.h
index 8fe63f4..54fd11c 100644
--- a/sys/sys/interrupt.h
+++ b/sys/sys/interrupt.h
@@ -36,27 +36,30 @@
* together via the 'next' pointer.
*/
-struct ithd;
-
-struct intrec {
- driver_intr_t *handler; /* code address of handler */
- void *argument; /* argument to pass to handler */
- enum intr_type flags; /* flag bits (sys/bus.h) */
- char *name; /* name of handler */
- struct ithd *ithd; /* handler we're connected to */
- struct intrec *next; /* next handler for this irq */
+struct intrhand {
+ driver_intr_t *ih_handler; /* code address of handler */
+ void *ih_argument; /* argument to pass to handler */
+ enum intr_type ih_flags; /* flag bits (sys/bus.h) */
+ char *ih_name; /* name of handler */
+ struct ithd *ih_ithd; /* handler we're connected to */
+ struct intrhand *ih_next; /* next handler for this irq */
+ int ih_need; /* need interrupt */
};
-typedef void swihand_t __P((void));
+int ithread_priority __P((int flags));
+void sched_swi __P((struct intrhand *, int));
+#define SWI_SWITCH 0x1
+#define SWI_NOSWITCH 0x2
+#define SWI_DELAY 0x4 /* implies NOSWITCH */
-extern swihand_t *shandlers[];
+struct intrhand * sinthand_add __P((const char *name, struct ithd **,
+ driver_intr_t, void *arg, int pri, int flags));
-void register_swi __P((int intr, swihand_t *handler));
-void swi_dispatcher __P((int intr));
-swihand_t swi_generic;
-swihand_t swi_null;
-void unregister_swi __P((int intr, swihand_t *handler));
-int ithread_priority __P((int flags));
-void sched_softintr __P((void));
+extern struct ithd *tty_ithd;
+extern struct ithd *clk_ithd;
+
+extern struct intrhand *net_ih;
+extern struct intrhand *softclock_ih;
+extern struct intrhand *vm_ih;
#endif
diff --git a/sys/sys/proc.h b/sys/sys/proc.h
index 24ed708..0d9e0a9 100644
--- a/sys/sys/proc.h
+++ b/sys/sys/proc.h
@@ -348,7 +348,7 @@ struct ithd {
LIST_ENTRY(ithd) it_list; /* All interrupt threads */
int it_need; /* Needs service */
int irq; /* irq */
- struct intrec *it_ih; /* head of handler queue */
+ struct intrhand *it_ih; /* head of handler queue */
struct ithd *it_interrupted; /* Who we interrupted */
/* Fields used only for hard interrupt threads */
diff --git a/sys/sys/systm.h b/sys/sys/systm.h
index 5d4b554..ae0dea9 100644
--- a/sys/sys/systm.h
+++ b/sys/sys/systm.h
@@ -159,7 +159,7 @@ int susword __P((void *base, int word));
void realitexpire __P((void *));
void hardclock __P((struct clockframe *frame));
-void softclock __P((void));
+void softclock __P((void *));
void statclock __P((struct clockframe *frame));
void startprofclock __P((struct proc *));
@@ -204,22 +204,6 @@ struct callout_handle timeout __P((timeout_t *, void *, int));
void untimeout __P((timeout_t *, void *, struct callout_handle));
/* Interrupt management */
-void setdelayed __P((void));
-void setsoftast __P((void));
-void setsoftcambio __P((void));
-void setsoftcamnet __P((void));
-void setsoftclock __P((void));
-void setsoftnet __P((void));
-void setsofttty __P((void));
-void setsoftvm __P((void));
-void setsofttq __P((void));
-void schedsoftcamnet __P((void));
-void schedsoftcambio __P((void));
-void schedsoftnet __P((void));
-void schedsofttty __P((void));
-void schedsoftvm __P((void));
-void schedsofttq __P((void));
-intrmask_t softclockpending __P((void));
void spl0 __P((void));
intrmask_t splbio __P((void));
intrmask_t splcam __P((void));
OpenPOWER on IntegriCloud