summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormav <mav@FreeBSD.org>2014-09-06 19:43:48 +0000
committermav <mav@FreeBSD.org>2014-09-06 19:43:48 +0000
commitc630f40d3c7ff7da7b03ede179b539e093c1fdc0 (patch)
treefd1cf4b93933215f5622ce98e92ac1df0eb5b1c1
parenta52df371a93b2ceaa0ee2bf480dfd489185f3e77 (diff)
downloadFreeBSD-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.c4
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)
OpenPOWER on IntegriCloud