Digium TE420 Quad Span Card only uses one processor core

I have a FreePBX v14.0.3.19 (Asterisk v13.22.0) server with a Digium TE420 PCIe Quad Span Card that I’ve been troubleshooting some issues with for the last few weeks (which is a PRI saturation and choppy audio during high call loads problem that I’m working with the provider on setting better choking on) and found something when looking at the info provided below.

It looks like the card driver (wct4xxp) is only using one core of my multi-core processor server. I guess my question is if this is normal or is it even possible for this model of card or driver to utilize all the cores of the server’s processor?

I’ve done a lot of research regarding this model of telephony card, but perhaps someone can point out something I’m missing.

cat /proc/interrupts
           CPU0       CPU1       CPU2       CPU3
  0:         42          0          0          0   IO-APIC-edge      timer
  1:          1          0          2          0   IO-APIC-edge      i8042
  8:          1          0          0          0   IO-APIC-edge      rtc0
  9:          0          0          0          0   IO-APIC-fasteoi   acpi
 12:          2          1          0          1   IO-APIC-edge      i8042
 16:    2010840       2823       1257       1898   IO-APIC-fasteoi   ehci_hcd:usb1, 3w-9xxx
 18:          0          0          0          0   IO-APIC-fasteoi   i801_smbus
 19:  144170931          0          0          0   IO-APIC-fasteoi   wct4xxp
 23:        222         14         25         32   IO-APIC-fasteoi   ehci_hcd:usb2
 29:         66        295        194      69923   PCI-MSI-edge      0000:00:1f.2
 30:        111       6847       3987    1097566   PCI-MSI-edge      eth1-rx-0
 31:       1612       1263       7636      92252   PCI-MSI-edge      eth1-tx-0
 32:          0          1          0          0   PCI-MSI-edge      eth1
 33:     124021      33400     267576     963063   PCI-MSI-edge      eth2-rx-0
 34:      18409      57794      74132     909597   PCI-MSI-edge      eth2-tx-0
 35:          1          0          1          0   PCI-MSI-edge      eth2
NMI:        656        336        335        355   Non-maskable interrupts
LOC:   33590407   31496365   31938144   31847255   Local timer interrupts
SPU:          0          0          0          0   Spurious interrupts
PMI:        656        336        335        355   Performance monitoring interrupts
IWI:      43920      37899      51778     158339   IRQ work interrupts
RTR:          0          0          0          0   APIC ICR read retries
RES:     512913     439692     427012     432873   Rescheduling interrupts
CAL: 4294911223 4294926655 4294926374 4294930116   Function call interrupts
TLB:    5767001    5356194    5231205    5442913   TLB shootdowns
TRM:          0          0          0          0   Thermal event interrupts
THR:          0          0          0          0   Threshold APIC interrupts
DFR:          0          0          0          0   Deferred Error APIC interrupts
MCE:          0          0          0          0   Machine check exceptions
MCP:        482        482        482        482   Machine check polls
ERR:          0
MIS:          0
PIN:          0          0          0          0   Posted-interrupt notification event
NPI:          0          0          0          0   Nested posted-interrupt event
PIW:          0          0          0          0   Posted-interrupt wakeup event

From my point of view, these is no reason for an interrupt driven device driver use more than one core anyway.

This server that I have here is running flawlessly four wcte12x cards on Asterisk 13.23.1 under CentOS 7:

# cat /proc/interrupts 
           CPU0       CPU1       CPU2       CPU3       
  0:         34          0          0          0  IR-IO-APIC-edge      timer
  1:          3          0          0          0  IR-IO-APIC-edge      i8042
  8:          1          0          0          0  IR-IO-APIC-edge      rtc0
  9:          0          0          0          0  IR-IO-APIC-fasteoi   acpi
 12:          4          0          0          0  IR-IO-APIC-edge      i8042
 16: 1389000316          0          0          0  IR-IO-APIC-fasteoi   uhci_hcd:usb3, hpilo, wcte12xp0, wcte12xp2
 17:  714182962          0          0          0  IR-IO-APIC-fasteoi   ata_piix, wcte12xp1
 18:  714147603          0          0          0  IR-IO-APIC-fasteoi   wcte12xp3
 20:         31          0          0          0  IR-IO-APIC-fasteoi   ehci_hcd:usb2
 21:         25          0          0          0  IR-IO-APIC-fasteoi   ehci_hcd:usb1
 24:          0          0          0          0  DMAR_MSI-edge      dmar0
 27:       1508          0          0          0  IR-PCI-MSI-edge      xhci_hcd
 28:          1          0          0     261120  IR-PCI-MSI-edge      eno1-tx-0
 29:      17123      17994     274502          0  IR-PCI-MSI-edge      eno1-rx-1
 30:       4441      12428          0          0  IR-PCI-MSI-edge      eno1-rx-2
 31:          1          0       7737      31687  IR-PCI-MSI-edge      eno1-rx-3
 32:          1          0          0     295551  IR-PCI-MSI-edge      eno1-rx-4
 33:          1          0          0          0  IR-PCI-MSI-edge      eno2-tx-0
 34:          1          0          0          0  IR-PCI-MSI-edge      eno2-rx-1
 35:          1          0          0          0  IR-PCI-MSI-edge      eno2-rx-2
 36:          1          0          0          0  IR-PCI-MSI-edge      eno2-rx-3
 37:          1          0          0          0  IR-PCI-MSI-edge      eno2-rx-4
NMI:       5451        266        100         71   Non-maskable interrupts
LOC:  217234826  123625084   26393443   24044505   Local timer interrupts
SPU:          0          0          0          0   Spurious interrupts
PMI:       5451        266        100         71   Performance monitoring interrupts
IWI:      27729      44870      81741     144478   IRQ work interrupts
RTR:          1          0          0          0   APIC ICR read retries
RES:    2711411      80958       6667       3950   Rescheduling interrupts
CAL:       1022       1203       1266       1126   Function call interrupts
TLB:        848        693        772        572   TLB shootdowns
TRM:          0          0          0          0   Thermal event interrupts
THR:          0          0          0          0   Threshold APIC interrupts
DFR:          0          0          0          0   Deferred Error APIC interrupts
MCE:          0          0          0          0   Machine check exceptions
MCP:       2382       2382       2382       2382   Machine check polls
ERR:          0
MIS:          0
PIN:          0          0          0          0   Posted-interrupt notification event
NPI:          0          0          0          0   Nested posted-interrupt event
PIW:          0          0          0          0   Posted-interrupt wakeup event

As you can see, all interrupts are handled by processor 0, meaning that their device driver runs only on that core.

The greatest changes I had to do on that server where:

  • Disable Linux framebuffer
  • Choose the PCI IRQs in a way that each card use a different one.