Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755097AbbKWO12 (ORCPT ); Mon, 23 Nov 2015 09:27:28 -0500 Received: from foss.arm.com ([217.140.101.70]:56092 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755067AbbKWO11 (ORCPT ); Mon, 23 Nov 2015 09:27:27 -0500 From: Marc Zyngier To: Thomas Gleixner , Jiang Liu , Bjorn Helgaas Cc: Phil Edworthy , linux-kernel@vger.kernel.org, Wolfram Sang Subject: [PATCH] PCI: MSI: Only use the generic MSI layer when domain is hierarchical Date: Mon, 23 Nov 2015 14:27:06 +0000 Message-Id: <1448288826-19058-1-git-send-email-marc.zyngier@arm.com> X-Mailer: git-send-email 2.1.4 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 1851 Lines: 50 Since d8a1cb757550 ("PCI/MSI: Let pci_msi_get_domain use struct device::msi_domain"), we use the MSI domain associated to the PCI device. But finding a MSI domain doesn't mean that the domain is implemented using the generic MSI domain API, and a number of MSI controllers are still using the arch_setup_msi_irq/arch_teardown_msi_irqs. In order to avoid a firework on these systems, check that the domain we just obtained is hierarchical. If not, don't use the generic MSI stuff and stick with the old one. Not pretty, but reliable. Another insentive to rework those drivers and phase out this API. Reported-by: Phil Edworthy Tested-by: Phil Edworthy Signed-off-by: Marc Zyngier --- drivers/pci/msi.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/pci/msi.c b/drivers/pci/msi.c index 53e4632..7eaa4c8 100644 --- a/drivers/pci/msi.c +++ b/drivers/pci/msi.c @@ -54,7 +54,7 @@ static int pci_msi_setup_msi_irqs(struct pci_dev *dev, int nvec, int type) struct irq_domain *domain; domain = pci_msi_get_domain(dev); - if (domain) + if (domain && irq_domain_is_hierarchy(domain)) return pci_msi_domain_alloc_irqs(domain, dev, nvec, type); return arch_setup_msi_irqs(dev, nvec, type); @@ -65,7 +65,7 @@ static void pci_msi_teardown_msi_irqs(struct pci_dev *dev) struct irq_domain *domain; domain = pci_msi_get_domain(dev); - if (domain) + if (domain && irq_domain_is_hierarchy(domain)) pci_msi_domain_free_irqs(domain, dev); else arch_teardown_msi_irqs(dev); -- 2.1.4 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/