]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/commit
Minor fixes and tweaks to the x86 interrupt code:
authorJohn Baldwin <jhb@FreeBSD.org>
Tue, 8 May 2007 21:29:14 +0000 (21:29 +0000)
committerJohn Baldwin <jhb@FreeBSD.org>
Tue, 8 May 2007 21:29:14 +0000 (21:29 +0000)
commitfb610ca1f90722fd133172ac73ab45c7980ea6e9
treeb0dfc79e653fe3855596822772a53089b1187f41
parentd287f590628fdf4fbdef05005ce3c2f9c0dc5a8f
Minor fixes and tweaks to the x86 interrupt code:
- Split the intr_table_lock into an sx lock used for most things, and a
  spin lock to protect intrcnt_index.  Originally I had this as a spin lock
  so interrupt code could use it to lookup sources.  However, we don't
  actually do that because it would add a lot of overhead to interrupts,
  and if we ever do support removing interrupt sources, we can use other
  means to safely do so w/o locking in the interrupt handling code.
- Replace is_enabled (boolean) with is_handlers (a count of handlers) to
  determine if a source is enabled or not.  This allows us to notice when
  a source is no longer in use.  When that happens, we now invoke a new
  PIC method (pic_disable_intr()) to inform the PIC driver that the
  source is no longer in use.  The I/O APIC driver frees the APIC IDT
  vector when this happens.  The MSI driver no longer needs to have a
  hack to clear is_enabled during msi_alloc() and msix_alloc() as a result
  of this change as well.
- Add an apic_disable_vector() to reset an IDT vector back to Xrsvd to
  complement apic_enable_vector() and use it in the I/O APIC and MSI code
  when freeing an IDT vector.
- Add a new nexus hook: nexus_add_irq() to ask the nexus driver to add an
  IRQ to its irq_rman.  The MSI code uses this when it creates new
  interrupt sources to let the nexus know about newly valid IRQs.
  Previously the msi_alloc() and msix_alloc() passed some extra stuff
  back to the nexus methods which then added the IRQs.  This approach is
  a bit cleaner.
- Change the MSI sx lock to a mutex.  If we need to create new sources,
  drop the lock, create the required number of sources, then get the lock
  and try the allocation again.
16 files changed:
sys/amd64/amd64/intr_machdep.c
sys/amd64/amd64/io_apic.c
sys/amd64/amd64/local_apic.c
sys/amd64/amd64/msi.c
sys/amd64/amd64/nexus.c
sys/amd64/include/apicvar.h
sys/amd64/include/intr_machdep.h
sys/amd64/isa/atpic.c
sys/i386/i386/intr_machdep.c
sys/i386/i386/io_apic.c
sys/i386/i386/local_apic.c
sys/i386/i386/msi.c
sys/i386/i386/nexus.c
sys/i386/include/apicvar.h
sys/i386/include/intr_machdep.h
sys/i386/isa/atpic.c