From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1030811AbdADNqp (ORCPT ); Wed, 4 Jan 2017 08:46:45 -0500 Received: from foss.arm.com ([217.140.101.70]:51276 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1030464AbdADNq2 (ORCPT ); Wed, 4 Jan 2017 08:46:28 -0500 Subject: Re: [PATCH v5 13/17] irqdomain: irq_domain_check_msi_remap To: Eric Auger , eric.auger.pro@gmail.com, christoffer.dall@linaro.org, robin.murphy@arm.com, alex.williamson@redhat.com, will.deacon@arm.com, joro@8bytes.org, tglx@linutronix.de, jason@lakedaemon.net, linux-arm-kernel@lists.infradead.org References: <1483536746-2725-1-git-send-email-eric.auger@redhat.com> <1483536746-2725-14-git-send-email-eric.auger@redhat.com> Cc: kvm@vger.kernel.org, drjones@redhat.com, linux-kernel@vger.kernel.org, pranav.sawargaonkar@gmail.com, iommu@lists.linux-foundation.org, punit.agrawal@arm.com, diana.craciun@nxp.com, gpkulkarni@gmail.com, shankerd@codeaurora.org, bharat.bhushan@nxp.com, geethasowjanya.akula@gmail.com From: Marc Zyngier X-Enigmail-Draft-Status: N1110 Organization: ARM Ltd Message-ID: Date: Wed, 4 Jan 2017 13:46:22 +0000 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Icedove/45.5.1 MIME-Version: 1.0 In-Reply-To: <1483536746-2725-14-git-send-email-eric.auger@redhat.com> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi Eric, On 04/01/17 13:32, Eric Auger wrote: > This new function checks whether all platform and PCI > MSI domains implement IRQ remapping. This is useful to > understand whether VFIO passthrough is safe with respect > to interrupts. > > On ARM typically an MSI controller can sit downstream > to the IOMMU without preventing VFIO passthrough. > As such any assigned device can write into the MSI doorbell. > In case the MSI controller implements IRQ remapping, assigned > devices will not be able to trigger interrupts towards the > host. On the contrary, the assignment must be emphasized as > unsafe with respect to interrupts. > > Signed-off-by: Eric Auger > > --- > > v4 -> v5: > - Handle DOMAIN_BUS_FSL_MC_MSI domains > - Check parents > --- > include/linux/irqdomain.h | 1 + > kernel/irq/irqdomain.c | 41 +++++++++++++++++++++++++++++++++++++++++ > 2 files changed, 42 insertions(+) > > diff --git a/include/linux/irqdomain.h b/include/linux/irqdomain.h > index ab017b2..281a40f 100644 > --- a/include/linux/irqdomain.h > +++ b/include/linux/irqdomain.h > @@ -219,6 +219,7 @@ struct irq_domain *irq_domain_add_legacy(struct device_node *of_node, > void *host_data); > extern struct irq_domain *irq_find_matching_fwspec(struct irq_fwspec *fwspec, > enum irq_domain_bus_token bus_token); > +extern bool irq_domain_check_msi_remap(void); > extern void irq_set_default_host(struct irq_domain *host); > extern int irq_domain_alloc_descs(int virq, unsigned int nr_irqs, > irq_hw_number_t hwirq, int node, > diff --git a/kernel/irq/irqdomain.c b/kernel/irq/irqdomain.c > index 8c0a0ae..700caea 100644 > --- a/kernel/irq/irqdomain.c > +++ b/kernel/irq/irqdomain.c > @@ -278,6 +278,47 @@ struct irq_domain *irq_find_matching_fwspec(struct irq_fwspec *fwspec, > EXPORT_SYMBOL_GPL(irq_find_matching_fwspec); > > /** > + * irq_domain_is_msi_remap - Check if @domain or any parent > + * has MSI remapping support > + * @domain: domain pointer > + */ > +static bool irq_domain_is_msi_remap(struct irq_domain *domain) > +{ > + struct irq_domain *h = domain; > + > + for (; h; h = h->parent) { > + if (h->flags & IRQ_DOMAIN_FLAG_MSI_REMAP) > + return true; > + } > + return false; > +} > + > +/** > + * irq_domain_check_msi_remap() - Checks whether all MSI > + * irq domains implement IRQ remapping > + */ > +bool irq_domain_check_msi_remap(void) > +{ > + struct irq_domain *h; > + bool ret = true; > + > + mutex_lock(&irq_domain_mutex); > + list_for_each_entry(h, &irq_domain_list, link) { > + if (((h->bus_token & DOMAIN_BUS_PCI_MSI) || > + (h->bus_token & DOMAIN_BUS_PLATFORM_MSI) || > + (h->bus_token & DOMAIN_BUS_FSL_MC_MSI)) && > + !irq_domain_is_msi_remap(h)) { (h->bus_token & DOMAIN_BUS_PCI_MSI) and co looks quite wrong. bus_token is not a bitmap, and DOMAIN_BUS_* not a single bit value (see enum irq_domain_bus_token). Surely this should read (h->bus_token == DOMAIN_BUS_PCI_MSI). Thanks, M. -- Jazz is not dead. It just smells funny...