lists.openwall.net | lists / announce owl-users owl-dev john-users john-dev passwdqc-users yescrypt popa3d-users / oss-security kernel-hardening musl sabotage tlsify passwords / crypt-dev xvendor / Bugtraq Full-Disclosure linux-kernel linux-netdev linux-ext4 linux-hardening linux-cve-announce PHC | |
Open Source and information security mailing list archives
| ||
|
Date: Wed, 2 Oct 2013 12:48:25 +0200 From: Alexander Gordeev <agordeev@...hat.com> To: linux-kernel@...r.kernel.org Cc: Alexander Gordeev <agordeev@...hat.com>, Bjorn Helgaas <bhelgaas@...gle.com>, Ralf Baechle <ralf@...ux-mips.org>, Michael Ellerman <michael@...erman.id.au>, Benjamin Herrenschmidt <benh@...nel.crashing.org>, Martin Schwidefsky <schwidefsky@...ibm.com>, Ingo Molnar <mingo@...hat.com>, Tejun Heo <tj@...nel.org>, Dan Williams <dan.j.williams@...el.com>, Andy King <acking@...are.com>, Jon Mason <jon.mason@...el.com>, Matt Porter <mporter@...nel.crashing.org>, linux-pci@...r.kernel.org, linux-mips@...ux-mips.org, linuxppc-dev@...ts.ozlabs.org, linux390@...ibm.com, linux-s390@...r.kernel.org, x86@...nel.org, linux-ide@...r.kernel.org, iss_storagedev@...com, linux-nvme@...ts.infradead.org, linux-rdma@...r.kernel.org, netdev@...r.kernel.org, e1000-devel@...ts.sourceforge.net, linux-driver@...gic.com, Solarflare linux maintainers <linux-net-drivers@...arflare.com>, "VMware, Inc." <pv-drivers@...are.com>, linux-scsi@...r.kernel.org Subject: [PATCH RFC 09/77] ahci: Update MSI/MSI-X interrupts enablement code As result of recent re-design of the MSI/MSI-X interrupts enabling pattern this driver has to be updated to use the new technique to obtain a optimal number of MSI/MSI-X interrupts required. Signed-off-by: Alexander Gordeev <agordeev@...hat.com> --- drivers/ata/ahci.c | 56 ++++++++++++++++++++++++++++++++------------------- 1 files changed, 35 insertions(+), 21 deletions(-) diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c index 9d715ae..f1c8838 100644 --- a/drivers/ata/ahci.c +++ b/drivers/ata/ahci.c @@ -1091,26 +1091,40 @@ static inline void ahci_gtf_filter_workaround(struct ata_host *host) {} #endif -int ahci_init_interrupts(struct pci_dev *pdev, struct ahci_host_priv *hpriv) +int ahci_init_interrupts(struct pci_dev *pdev, unsigned int n_ports, + struct ahci_host_priv *hpriv) { - int rc; - unsigned int maxvec; + int rc, nvec; - if (!(hpriv->flags & AHCI_HFLAG_NO_MSI)) { - rc = pci_enable_msi_block_auto(pdev, &maxvec); - if (rc > 0) { - if ((rc == maxvec) || (rc == 1)) - return rc; - /* - * Assume that advantage of multipe MSIs is negated, - * so fallback to single MSI mode to save resources - */ - pci_disable_msi(pdev); - if (!pci_enable_msi(pdev)) - return 1; - } - } + if (hpriv->flags & AHCI_HFLAG_NO_MSI) + goto intx; + + rc = pci_get_msi_cap(pdev); + if (rc < 0) + goto intx; + + /* + * If number of MSIs is less than number of ports then Sharing Last + * Message mode could be enforced. In this case assume that advantage + * of multipe MSIs is negated and use single MSI mode instead. + */ + if (rc < n_ports) + goto single_msi; + + nvec = rc; + rc = pci_enable_msi_block(pdev, nvec); + if (rc) + goto intx; + return nvec; + +single_msi: + rc = pci_enable_msi(pdev); + if (rc) + goto intx; + return 1; + +intx: pci_intx(pdev, 1); return 0; } @@ -1277,10 +1291,6 @@ static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) hpriv->mmio = pcim_iomap_table(pdev)[ahci_pci_bar]; - n_msis = ahci_init_interrupts(pdev, hpriv); - if (n_msis > 1) - hpriv->flags |= AHCI_HFLAG_MULTI_MSI; - /* save initial config */ ahci_pci_save_initial_config(pdev, hpriv); @@ -1335,6 +1345,10 @@ static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) */ n_ports = max(ahci_nr_ports(hpriv->cap), fls(hpriv->port_map)); + n_msis = ahci_init_interrupts(pdev, n_ports, hpriv); + if (n_msis > 1) + hpriv->flags |= AHCI_HFLAG_MULTI_MSI; + host = ata_host_alloc_pinfo(&pdev->dev, ppi, n_ports); if (!host) return -ENOMEM; -- 1.7.7.6 -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@...r.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Powered by blists - more mailing lists