diff options
author | mav <mav@FreeBSD.org> | 2014-09-06 19:43:48 +0000 |
---|---|---|
committer | mav <mav@FreeBSD.org> | 2014-09-06 19:43:48 +0000 |
commit | c630f40d3c7ff7da7b03ede179b539e093c1fdc0 (patch) | |
tree | fd1cf4b93933215f5622ce98e92ac1df0eb5b1c1 | |
parent | a52df371a93b2ceaa0ee2bf480dfd489185f3e77 (diff) | |
download | FreeBSD-src-c630f40d3c7ff7da7b03ede179b539e093c1fdc0.zip FreeBSD-src-c630f40d3c7ff7da7b03ede179b539e093c1fdc0.tar.gz |
Save one register read (AHCI_IS) for AHCI controllers with only one port.
For controllers with only one port (like PCIe or M.2 SSDs) interrupt can
come from only one source, and skipping read saves few percents of CPU time.
MFC after: 1 month
H/W donated by: I/O Switch
-rw-r--r-- | sys/dev/ahci/ahci.c | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/sys/dev/ahci/ahci.c b/sys/dev/ahci/ahci.c index 61be530..b15a3b4 100644 --- a/sys/dev/ahci/ahci.c +++ b/sys/dev/ahci/ahci.c @@ -359,7 +359,9 @@ ahci_setup_interrupt(device_t dev) for (i = 0; i < ctlr->numirqs; i++) { ctlr->irqs[i].ctlr = ctlr; ctlr->irqs[i].r_irq_rid = i + (ctlr->msi ? 1 : 0); - if (ctlr->numirqs == 1 || i >= ctlr->channels || + if (ctlr->channels == 1 && !ctlr->ccc) + ctlr->irqs[i].mode = AHCI_IRQ_MODE_ONE; + else if (ctlr->numirqs == 1 || i >= ctlr->channels || (ctlr->ccc && i == ctlr->cccv)) ctlr->irqs[i].mode = AHCI_IRQ_MODE_ALL; else if (i == ctlr->numirqs - 1) |