FreeBSD kernel kern code
kern_intr.c File Reference
#include <sys/cdefs.h>
#include "opt_ddb.h"
#include <sys/param.h>
#include <sys/bus.h>
#include <sys/conf.h>
#include <sys/cpuset.h>
#include <sys/rtprio.h>
#include <sys/systm.h>
#include <sys/interrupt.h>
#include <sys/kernel.h>
#include <sys/kthread.h>
#include <sys/ktr.h>
#include <sys/limits.h>
#include <sys/lock.h>
#include <sys/malloc.h>
#include <sys/mutex.h>
#include <sys/priv.h>
#include <sys/proc.h>
#include <sys/random.h>
#include <sys/resourcevar.h>
#include <sys/sched.h>
#include <sys/smp.h>
#include <sys/sysctl.h>
#include <sys/syslog.h>
#include <sys/unistd.h>
#include <sys/vmmeter.h>
#include <machine/atomic.h>
#include <machine/cpu.h>
#include <machine/md_var.h>
#include <machine/stdarg.h>
Include dependency graph for kern_intr.c:

Go to the source code of this file.

Data Structures

struct  intr_thread
 
struct  intr_entropy
 

Macros

#define IT_DEAD   0x000001 /* Thread is waiting to exit. */
 
#define IT_WAIT   0x000002 /* Thread is waiting for completion. */
 

Functions

 __FBSDID ("$BSDSUniX$")
 
static MALLOC_DEFINE (M_ITHREAD,"ithread","Interrupt Threads")
 
 TUNABLE_INT ("hw.intr_storm_threshold",&intr_storm_threshold)
 
 SYSCTL_INT (_hw, OID_AUTO, intr_storm_threshold, CTLFLAG_RW,&intr_storm_threshold, 0,"Number of consecutive interrupts before storm protection is enabled")
 
static TAILQ_HEAD (intr_event)
 
static void ithread_update (struct intr_thread *ithd)
 
static void intr_event_update (struct intr_event *ie)
 
int intr_event_create (struct intr_event **event, void *source, int flags, int irq, void(*pre_ithread)(void *), void(*post_ithread)(void *), void(*post_filter)(void *), int(*assign_cpu)(void *, u_char), const char *fmt,...)
 
int intr_event_bind (struct intr_event *ie, u_char cpu)
 
static struct intr_event * intr_lookup (int irq)
 
int intr_setaffinity (int irq, void *m)
 
int intr_getaffinity (int irq, void *m)
 
int intr_event_destroy (struct intr_event *ie)
 
static struct intr_threadithread_create (const char *name)
 
static void ithread_destroy (struct intr_thread *ithread)
 
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)
 
int intr_event_describe_handler (struct intr_event *ie, void *cookie, const char *descr)
 
void * intr_handler_source (void *cookie)
 
void _intr_drain (int irq)
 
int intr_event_remove_handler (void *cookie)
 
static int intr_event_schedule_thread (struct intr_event *ie)
 
static int swi_assign_cpu (void *arg, u_char cpu)
 
int swi_add (struct intr_event **eventp, const char *name, driver_intr_t handler, void *arg, int pri, enum intr_type flags, void **cookiep)
 
void swi_sched (void *cookie, int flags)
 
int swi_remove (void *cookie)
 
void intr_event_execute_handlers (struct proc *p, struct intr_event *ie)
 
static void ithread_execute_handlers (struct proc *p, struct intr_event *ie)
 
static void ithread_loop (void *arg)
 
int intr_event_handle (struct intr_event *ie, struct trapframe *frame)
 
static void start_softintr (void *dummy)
 
 SYSINIT (start_softintr, SI_SUB_SOFTINTR, SI_ORDER_FIRST, start_softintr, NULL)
 
static int sysctl_intrnames (SYSCTL_HANDLER_ARGS)
 
 SYSCTL_PROC (_hw, OID_AUTO, intrnames, CTLTYPE_OPAQUE|CTLFLAG_RD, NULL, 0, sysctl_intrnames,"","Interrupt Names")
 
static int sysctl_intrcnt (SYSCTL_HANDLER_ARGS)
 
 SYSCTL_PROC (_hw, OID_AUTO, intrcnt, CTLTYPE_OPAQUE|CTLFLAG_RD, NULL, 0, sysctl_intrcnt,"","Interrupt Counts")
 

Variables

struct intr_event * clk_intr_event
 
struct intr_event * tty_intr_event
 
void * vm_ih
 
struct proc * intrproc
 
static int intr_storm_threshold = 1000
 

Macro Definition Documentation

#define IT_DEAD   0x000001 /* Thread is waiting to exit. */

Definition at line 76 of file kern_intr.c.

Referenced by ithread_destroy(), and ithread_loop().

#define IT_WAIT   0x000002 /* Thread is waiting for completion. */

Definition at line 77 of file kern_intr.c.

Referenced by _intr_drain(), and ithread_loop().

Function Documentation

__FBSDID ( "$BSDSUniX$"  )
void _intr_drain ( int  irq)

Definition at line 752 of file kern_intr.c.

References intr_lookup(), intr_thread::it_flags, intr_thread::it_thread, IT_WAIT, and pause().

Here is the call graph for this function:

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 
)

Definition at line 512 of file kern_intr.c.

References free(), intr_event_update(), intr_thread::it_event, ithread_create(), ithread_update(), malloc(), and wakeup().

Referenced by swi_add().

Here is the call graph for this function:

Here is the caller graph for this function:

int intr_event_bind ( struct intr_event *  ie,
u_char  cpu 
)

Definition at line 296 of file kern_intr.c.

References cpuset_root, cpuset_setthread(), mask, and priv_check().

Referenced by intr_setaffinity().

Here is the call graph for this function:

Here is the caller graph for this function:

int intr_event_create ( struct intr_event **  event,
void *  source,
int  flags,
int  irq,
void(*)(void *)  pre_ithread,
void(*)(void *)  post_ithread,
void(*)(void *)  post_filter,
int(*)(void *, u_char)  assign_cpu,
const char *  fmt,
  ... 
)

Definition at line 251 of file kern_intr.c.

References malloc(), mtx_init(), and vsnprintf().

Referenced by swi_add().

Here is the call graph for this function:

Here is the caller graph for this function:

int intr_event_describe_handler ( struct intr_event *  ie,
void *  cookie,
const char *  descr 
)

Definition at line 674 of file kern_intr.c.

References intr_event_update(), panic(), and start.

Here is the call graph for this function:

int intr_event_destroy ( struct intr_event *  ie)

Definition at line 420 of file kern_intr.c.

References free(), ithread_destroy(), and mtx_destroy().

Here is the call graph for this function:

void intr_event_execute_handlers ( struct proc *  p,
struct intr_event *  ie 
)

Definition at line 1231 of file kern_intr.c.

References Giant, and wakeup().

Referenced by ithread_execute_handlers().

Here is the call graph for this function:

Here is the caller graph for this function:

int intr_event_handle ( struct intr_event *  ie,
struct trapframe *  frame 
)

Definition at line 1410 of file kern_intr.c.

References critical_enter(), critical_exit(), intr_event_schedule_thread(), and log().

Here is the call graph for this function:

int intr_event_remove_handler ( void *  cookie)

Definition at line 786 of file kern_intr.c.

References free(), intr_event_update(), ithread_destroy(), and panic().

Referenced by swi_remove().

Here is the call graph for this function:

Here is the caller graph for this function:

static int intr_event_schedule_thread ( struct intr_event *  ie)
static

Definition at line 875 of file kern_intr.c.

References intr_entropy::event, intr_thread::it_need, intr_thread::it_thread, sched_add(), and intr_entropy::td.

Referenced by intr_event_handle(), and swi_sched().

Here is the call graph for this function:

Here is the caller graph for this function:

static void intr_event_update ( struct intr_event *  ie)
static

Definition at line 195 of file kern_intr.c.

References ithread_update().

Referenced by intr_event_add_handler(), intr_event_describe_handler(), and intr_event_remove_handler().

Here is the call graph for this function:

Here is the caller graph for this function:

int intr_getaffinity ( int  irq,
void *  m 
)

Definition at line 400 of file kern_intr.c.

References cpuset_root, intr_lookup(), and mask.

Here is the call graph for this function:

void* intr_handler_source ( void *  cookie)

Definition at line 729 of file kern_intr.c.

static struct intr_event* intr_lookup ( int  irq)
static

Definition at line 356 of file kern_intr.c.

Referenced by _intr_drain(), intr_getaffinity(), and intr_setaffinity().

Here is the caller graph for this function:

int intr_setaffinity ( int  irq,
void *  m 
)

Definition at line 371 of file kern_intr.c.

References cpuset_root, intr_event_bind(), intr_lookup(), and mask.

Here is the call graph for this function:

static struct intr_thread* ithread_create ( const char *  name)
static

Definition at line 446 of file kern_intr.c.

References intrproc, intr_thread::it_thread, ithread_loop(), kproc_kthread_add(), malloc(), panic(), and sched_class().

Referenced by intr_event_add_handler().

Here is the call graph for this function:

Here is the caller graph for this function:

static void ithread_destroy ( struct intr_thread ithread)
static

Definition at line 495 of file kern_intr.c.

References IT_DEAD, intr_thread::it_event, intr_thread::it_flags, intr_thread::it_thread, and sched_add().

Referenced by intr_event_destroy(), and intr_event_remove_handler().

Here is the call graph for this function:

Here is the caller graph for this function:

static void ithread_execute_handlers ( struct proc *  p,
struct intr_event *  ie 
)
static

Definition at line 1279 of file kern_intr.c.

References intr_event_execute_handlers(), intr_storm_threshold, pause(), ppsratecheck(), and printf().

Referenced by ithread_loop().

Here is the call graph for this function:

Here is the caller graph for this function:

static void ithread_loop ( void *  arg)
static

Definition at line 1324 of file kern_intr.c.

References free(), Giant, IT_DEAD, intr_thread::it_event, intr_thread::it_flags, intr_thread::it_need, intr_thread::it_thread, IT_WAIT, ithread_execute_handlers(), kthread_exit(), mi_switch(), and wakeup().

Referenced by ithread_create().

Here is the call graph for this function:

Here is the caller graph for this function:

static void ithread_update ( struct intr_thread ithd)
static

Definition at line 166 of file kern_intr.c.

References intr_thread::it_event, intr_thread::it_thread, and sched_prio().

Referenced by intr_event_add_handler(), and intr_event_update().

Here is the call graph for this function:

Here is the caller graph for this function:

static MALLOC_DEFINE ( M_ITHREAD  ,
"ithread"  ,
"Interrupt Threads"   
)
static
static void start_softintr ( void *  dummy)
static

Definition at line 1877 of file kern_intr.c.

References panic(), swi_add(), and vm_ih.

Here is the call graph for this function:

int swi_add ( struct intr_event **  eventp,
const char *  name,
driver_intr_t  handler,
void *  arg,
int  pri,
enum intr_type  flags,
void **  cookiep 
)

Definition at line 1103 of file kern_intr.c.

References intr_event_add_handler(), intr_event_create(), and swi_assign_cpu().

Referenced by start_softclock(), and start_softintr().

Here is the call graph for this function:

Here is the caller graph for this function:

static int swi_assign_cpu ( void *  arg,
u_char  cpu 
)
static

Definition at line 1092 of file kern_intr.c.

Referenced by swi_add().

Here is the caller graph for this function:

int swi_remove ( void *  cookie)

Definition at line 1187 of file kern_intr.c.

References intr_event_remove_handler().

Here is the call graph for this function:

void swi_sched ( void *  cookie,
int  flags 
)

Definition at line 1143 of file kern_intr.c.

References intr_entropy::event, intr_event_schedule_thread(), and intr_entropy::td.

Referenced by callout_tick(), taskqueue_fast_enqueue(), taskqueue_swi_enqueue(), and taskqueue_swi_giant_enqueue().

Here is the call graph for this function:

Here is the caller graph for this function:

SYSCTL_INT ( _hw  ,
OID_AUTO  ,
intr_storm_threshold  ,
CTLFLAG_RW  ,
intr_storm_threshold,
,
"Number of consecutive interrupts before storm protection is enabled"   
)
static int sysctl_intrcnt ( SYSCTL_HANDLER_ARGS  )
static

Definition at line 1905 of file kern_intr.c.

References sysctl_handle_opaque().

Here is the call graph for this function:

static int sysctl_intrnames ( SYSCTL_HANDLER_ARGS  )
static

Definition at line 1896 of file kern_intr.c.

References sysctl_handle_opaque().

Here is the call graph for this function:

SYSCTL_PROC ( _hw  ,
OID_AUTO  ,
intrnames  ,
CTLTYPE_OPAQUE|  CTLFLAG_RD,
NULL  ,
,
sysctl_intrnames  ,
""  ,
"Interrupt Names"   
)
SYSCTL_PROC ( _hw  ,
OID_AUTO  ,
intrcnt  ,
CTLTYPE_OPAQUE|  CTLFLAG_RD,
NULL  ,
,
sysctl_intrcnt  ,
""  ,
"Interrupt Counts"   
)
SYSINIT ( start_softintr  ,
SI_SUB_SOFTINTR  ,
SI_ORDER_FIRST  ,
start_softintr  ,
NULL   
)
static TAILQ_HEAD ( intr_event  )
static

Definition at line 96 of file kern_intr.c.

TUNABLE_INT ( "hw.intr_storm_threshold"  ,
intr_storm_threshold 
)

Variable Documentation

struct intr_event* clk_intr_event

Definition at line 84 of file kern_intr.c.

Referenced by start_softclock().

int intr_storm_threshold = 1000
static

Definition at line 91 of file kern_intr.c.

Referenced by ithread_execute_handlers().

struct proc* intrproc

Definition at line 87 of file kern_intr.c.

Referenced by ithread_create().

struct intr_event* tty_intr_event

Definition at line 85 of file kern_intr.c.

void* vm_ih

Definition at line 86 of file kern_intr.c.

Referenced by start_softintr().