I think we want level triggered interrupts to be handled before EOI because we may want to set IF during the service routine to capture nested ones and I'm not sure if the current handling of level triggered interrupts will allow that (?)
I have split this patch in half so that the irqinfo struct helper is an atomic commit by itself. The second commit makes use of the irqinfo struct to condition on trigger mode to perform EOI in two different orderings. UP with PIC is unchanged behaviour because all interrupts are edge triggered in this configuration. I am not 100% certain about the second change but it does seem to fix 2x concurrent usb stacks from completely breaking a shared irq and the system can be restored without a reboot on SMP. TESTED: UP+pic works, UP+apic works, SMP works.
