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,