Received: by 2002:a05:6358:d09b:b0:dc:cd0c:909e with SMTP id jc27csp899441rwb; Wed, 16 Nov 2022 09:06:03 -0800 (PST) X-Google-Smtp-Source: AA0mqf54yuchO3tPAU2zqbfUJ3wxGzML53fAIoR+svnjRkC8baVQgqdbd1/EXE7lGyzRCQHURs5c X-Received: by 2002:a63:4711:0:b0:474:4380:cca6 with SMTP id u17-20020a634711000000b004744380cca6mr21105677pga.229.1668618362943; Wed, 16 Nov 2022 09:06:02 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1668618362; cv=none; d=google.com; s=arc-20160816; b=nep9WnkPZq3BCkXlzEO31urBCTdQHxJBaS0yPY7uUpEjAfBG77S3NRxvFJ7SacaOlm k0N50B73GSE5deuViuk72HbdqR5SVoZb43QNlflElsUhshdaBQHAaTwl3ddnV+GiQFcT PLbihF4GT6JoWGcHC1Qwm6Ei9nqtY8ky8Lr3E+m7ElXKHX0O768jPSKEsPQ3rSFeSVT/ Ms4qpsXKHmCUHWI4OvoTkEC9P0bO1vY76BSuRb4d/vCfxCgcATIn9wwEk2YwdGbMoxcV qqAKLSYsS3rm/Mr5RbaZTMZAx4T/nqjzZ+sxj9/z/viBW7+4xYolDvvrvH+JPIsnRTOp femA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:in-reply-to:content-disposition:mime-version :message-id:subject:cc:to:from:date:dkim-signature; bh=K/KEc1Cgkc0kfLysMqFT0Oq6oNDdZ9veovajUX2PtTM=; b=DgJWDDyaun083uP6eERrU6eqg2mYmkFMGHFjD3hXy3BQIkLzEUgXGC4ZuaRgIgeXJn Bnvp/J/FCnGs1xwWeHYv+b65A1amStntR9FAiuMw1zBUAYV0dVUcURHmmKHJQe31VBJV yFPPh3ftcm42eOYRNPuVHyIEkMMLKkf5zeyjEZn1/2bnHyRhN/+eu+0NS2TpW5TImYRk FINUXJxEE4gGPmCrz1bQVj9WVJKAqAmeH8YMnUVoFUMlkI4KudhU0of1vFtOmSAGJpkr 8F1sB3DOafH97D9a4sC9w5yWkv+LMS+RPQ4d7MCpboEiBx/teFVxKuXq9gnGH57hRIfq RvrA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=F3if8fsP; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id i189-20020a6387c6000000b00476e640ddfesi2475368pge.80.2022.11.16.09.05.18; Wed, 16 Nov 2022 09:06:02 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=F3if8fsP; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233755AbiKPQiN (ORCPT + 91 others); Wed, 16 Nov 2022 11:38:13 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:45932 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233827AbiKPQhj (ORCPT ); Wed, 16 Nov 2022 11:37:39 -0500 Received: from ams.source.kernel.org (ams.source.kernel.org [145.40.68.75]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 6A56F5E3E1; Wed, 16 Nov 2022 08:31:22 -0800 (PST) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ams.source.kernel.org (Postfix) with ESMTPS id 1D787B81DB9; Wed, 16 Nov 2022 16:31:21 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 7B8F9C43150; Wed, 16 Nov 2022 16:31:19 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1668616279; bh=jmn/eepB0DIDFxOFu+/KtMmJJA+nW4C/Pt+OKJfWu1c=; h=Date:From:To:Cc:Subject:In-Reply-To:From; b=F3if8fsPODhEgaNJWILnJb37FdgCXbeMFIjp54W0pwFKt5sT0Iw1UMp5TuHpYpit8 tOdLuWl/Z69WnTg8DcAxKqSXOlFylW4Kf178W06YC6KzQhKoNkfHR8eId8dsntQnI7 g51Cm5bcPIRA/z4LCRJnx/GvsBZoCZWIllysP2p2zlr1Qd0AQQW4WsYpxbs+9WnzkB LbO7VqK8NEPnzll7xPECReCcVhZC8jWL66SsLBN1Hv9553Of1+WJwbbsjofzyMVh6j fhMR7Lq9azFChp09TIyRnrFymHU9byRjcJNfw8LpBdrHr1WX15uv2beNKTFCDtZSaE skG08ejR82xOw== Date: Wed, 16 Nov 2022 10:31:18 -0600 From: Bjorn Helgaas To: Thomas Gleixner Cc: LKML , x86@kernel.org, Joerg Roedel , Will Deacon , linux-pci@vger.kernel.org, Bjorn Helgaas , Lorenzo Pieralisi , Marc Zyngier , Greg Kroah-Hartman , Jason Gunthorpe , Dave Jiang , Alex Williamson , Kevin Tian , Dan Williams , Logan Gunthorpe , Ashok Raj , Jon Mason , Allen Hubbe , Michael Ellerman , Christophe Leroy , linuxppc-dev@lists.ozlabs.org, "Ahmed S. Darwish" , Reinette Chatre Subject: Re: [patch 34/39] PCI/MSI: Reject multi-MSI early Message-ID: <20221116163118.GA1116261@bhelgaas> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20221111122015.574339988@linutronix.de> X-Spam-Status: No, score=-7.1 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_HI, SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Fri, Nov 11, 2022 at 02:55:09PM +0100, Thomas Gleixner wrote: > When hierarchical MSI interrupt domains are enabled then there is no point > to do tons of work and detect the missing support for multi-MSI late in the > allocation path. > > Just query the domain feature flags right away. The query function is going > to be used for other purposes later and has a mode argument which influences > the result: > > ALLOW_LEGACY returns true when: > - there is no irq domain attached (legacy support) > - there is a irq domain attached which has the feature flag set > > DENY_LEGACY returns only true when: > - there is a irq domain attached which has the feature flag set > > This allows to use the function universally without ifdeffery in the > calling code. > > Signed-off-by: Thomas Gleixner Acked-by: Bjorn Helgaas > --- > drivers/pci/msi/irqdomain.c | 22 ++++++++++++++++++++++ > drivers/pci/msi/msi.c | 4 ++++ > drivers/pci/msi/msi.h | 9 +++++++++ > 3 files changed, 35 insertions(+) > > --- a/drivers/pci/msi/irqdomain.c > +++ b/drivers/pci/msi/irqdomain.c > @@ -187,6 +187,28 @@ struct irq_domain *pci_msi_create_irq_do > } > EXPORT_SYMBOL_GPL(pci_msi_create_irq_domain); > > +/** > + * pci_msi_domain_supports - Check for support of a particular feature flag > + * @pdev: The PCI device to operate on > + * @feature_mask: The feature mask to check for (full match) > + * @mode: If ALLOW_LEGACY this grants the feature when there is no irq domain > + * associated to the device. If DENY_LEGACY the lack of an irq domain > + * makes the feature unsupported Looks like some of these might be wider than 80 columns, which I think was the typical width of this file. > + */ > +bool pci_msi_domain_supports(struct pci_dev *pdev, unsigned int feature_mask, > + enum support_mode mode) > +{ > + struct msi_domain_info *info; > + struct irq_domain *domain; > + > + domain = dev_get_msi_domain(&pdev->dev); > + > + if (!domain || !irq_domain_is_hierarchy(domain)) > + return mode == ALLOW_LEGACY; > + info = domain->host_data; > + return (info->flags & feature_mask) == feature_mask; > +} > + > /* > * Users of the generic MSI infrastructure expect a device to have a single ID, > * so with DMA aliases we have to pick the least-worst compromise. Devices with > --- a/drivers/pci/msi/msi.c > +++ b/drivers/pci/msi/msi.c > @@ -347,6 +347,10 @@ static int msi_capability_init(struct pc > struct msi_desc *entry; > int ret; > > + /* Reject multi-MSI early on irq domain enabled architectures */ > + if (nvec > 1 && !pci_msi_domain_supports(dev, MSI_FLAG_MULTI_PCI_MSI, ALLOW_LEGACY)) > + return 1; > + > /* > * Disable MSI during setup in the hardware, but mark it enabled > * so that setup code can evaluate it. > --- a/drivers/pci/msi/msi.h > +++ b/drivers/pci/msi/msi.h > @@ -97,6 +97,15 @@ int __pci_enable_msix_range(struct pci_d > void __pci_restore_msi_state(struct pci_dev *dev); > void __pci_restore_msix_state(struct pci_dev *dev); > > +/* irq_domain related functionality */ > + > +enum support_mode { > + ALLOW_LEGACY, > + DENY_LEGACY, > +}; > + > +bool pci_msi_domain_supports(struct pci_dev *dev, unsigned int feature_mask, enum support_mode mode); > + > /* Legacy (!IRQDOMAIN) fallbacks */ > > #ifdef CONFIG_PCI_MSI_ARCH_FALLBACKS >