Print this page
3426 assertion failed: irq < 16 on VMware hardware version 9 (apix related)
Reviewed by: Albert Lee <trisk@nexenta.com>
Reviewed by: Dan McDonald <danmcd@nexenta.com>
        
*** 24,33 ****
--- 24,36 ----
   */
  /*
   * Copyright (c) 2010, Intel Corporation.
   * All rights reserved.
   */
+ /*
+  * Copyright 2013 Nexenta Systems, Inc.  All rights reserved.
+  */
  
  #include <sys/processor.h>
  #include <sys/time.h>
  #include <sys/psm.h>
  #include <sys/smp_impldefs.h>
*** 1827,1856 ****
          apic_irq_t *irqp;
          uchar_t ioapicindex, ipin;
          ulong_t iflag;
          struct autovec *avp;
  
-         irqp = apic_irq_table[irqno];
          ioapicindex = acpi_find_ioapic(irqno);
          ASSERT(ioapicindex != 0xFF);
          ipin = irqno - apic_io_vectbase[ioapicindex];
  
!         if ((irqp != NULL) && (irqp->airq_mps_intr_index == ACPI_INDEX)) {
                  ASSERT(irqp->airq_intin_no == ipin &&
                      irqp->airq_ioapicindex == ioapicindex);
                  vecp = xv_vector(irqp->airq_cpu, irqp->airq_vector);
                  ASSERT(!IS_VECT_FREE(vecp));
          } else {
!                 vecp = apix_alloc_intx(NULL, 0, irqno);
  
!                 irqp = apic_irq_table[irqno];
                  irqp->airq_mps_intr_index = ACPI_INDEX;
                  irqp->airq_ioapicindex = ioapicindex;
                  irqp->airq_intin_no = ipin;
                  irqp->airq_iflag = *flagp;
                  irqp->airq_share++;
!                 apic_record_rdt_entry(irqp, irqno);
          }
  
          /* copy over autovect */
          for (avp = autovect[irqno].avh_link; avp; avp = avp->av_link)
                  apix_insert_av(vecp, avp->av_intr_id, avp->av_vector,
--- 1830,1872 ----
          apic_irq_t *irqp;
          uchar_t ioapicindex, ipin;
          ulong_t iflag;
          struct autovec *avp;
  
          ioapicindex = acpi_find_ioapic(irqno);
          ASSERT(ioapicindex != 0xFF);
          ipin = irqno - apic_io_vectbase[ioapicindex];
  
!         mutex_enter(&airq_mutex);
!         irqp = apic_irq_table[irqno];
! 
!         /*
!          * The irq table entry should not exist unless the interrupts are shared.
!          * In that case, make sure it matches what we would initialize it to.
!          */
!         if (irqp != NULL) {
!                 ASSERT(irqp->airq_mps_intr_index == ACPI_INDEX);
                  ASSERT(irqp->airq_intin_no == ipin &&
                      irqp->airq_ioapicindex == ioapicindex);
                  vecp = xv_vector(irqp->airq_cpu, irqp->airq_vector);
                  ASSERT(!IS_VECT_FREE(vecp));
+                 mutex_exit(&airq_mutex);
          } else {
!                 irqp = kmem_zalloc(sizeof (apic_irq_t), KM_SLEEP);
  
!                 irqp->airq_cpu = IRQ_UNINIT;
!                 irqp->airq_origirq = (uchar_t)irqno;
                  irqp->airq_mps_intr_index = ACPI_INDEX;
                  irqp->airq_ioapicindex = ioapicindex;
                  irqp->airq_intin_no = ipin;
                  irqp->airq_iflag = *flagp;
                  irqp->airq_share++;
! 
!                 apic_irq_table[irqno] = irqp;
!                 mutex_exit(&airq_mutex);
! 
!                 vecp = apix_alloc_intx(NULL, 0, irqno);
          }
  
          /* copy over autovect */
          for (avp = autovect[irqno].avh_link; avp; avp = avp->av_link)
                  apix_insert_av(vecp, avp->av_intr_id, avp->av_vector,