From patchwork Thu Nov 24 23:24:25 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Thomas Gleixner X-Patchwork-Id: 25728 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:adf:f944:0:0:0:0:0 with SMTP id q4csp3659796wrr; Thu, 24 Nov 2022 15:26:04 -0800 (PST) X-Google-Smtp-Source: AA0mqf4hDMru5/wdJ+3iR/pPDR2n8kXtsi6sbeLz156hxjubnp2rid2cRFTb1j1h2nTeY/X9Ky0P X-Received: by 2002:a17:902:e415:b0:179:f94a:6fda with SMTP id m21-20020a170902e41500b00179f94a6fdamr29083970ple.118.1669332364123; Thu, 24 Nov 2022 15:26:04 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1669332364; cv=none; d=google.com; s=arc-20160816; b=n7aH6kQVidjwP1QISUskCGtreolcZMFHF1C3hBkTIJz5At+mCAb5mGW2k72vUqsamv Bn+kRx+ZzfcB8kri32TPVieff1+eho4Odcj2KOXmRa2YSTrj3hlyN0VmCK8qQjnZ9s6j WZF/q+enSD+ZiYfhUrlTsx733Us3pKMWsUrcyYD28UDnn33VP2urdGEQopn4YspYFmkb 3DV8gH4CbigbtSS8D9tex4BRtdog9U9EALUwPJEdDhWeNAvgO99KmL98TVpaDXK7SHTQ 6IT7DtveHfTQ2vfHa9Aw95sk+j+Vd6QDPUreROBdLtUEwE94CE7uUHvsVU6f62Psd4hn lKUg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:date:mime-version:references:subject:cc:to:from :dkim-signature:dkim-signature:message-id; bh=x2FLCuF8Xx8AySp9OHgOheEghQq8ehPfwhiGfgwepSM=; b=oHF6pxcGXmSzOmNsPWG0+DDh5iK1dfekqxOGpZjiqIE2YdN5bsEjmPjeJVfgVhkKn5 rTJPGjwXBGL1lFbLbOOxTQtw3moPxVeRL+wtLEFxq7WKZ4Wu9cHhu3gACawTznTZLxQ2 6nEDTfUWyNnHcfNNjxFJcRnQv6Y4f4h8aBGAbLwEuNk3gTyB+Jvqq7U2mvnFv0RxKzt+ x5AI490ReuTdeMz/CdfEQ50E7hdDY/PdqkJw7noElOFGCMWTrwgxGok3hf95/X7LHODi qg3EMUevMUVzAui3p+g7+B0u8lIakjrisStnNHoSSabbhrvEwbUFr5qKmHEg1qAgwrgj E1ww== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linutronix.de header.s=2020 header.b=fSdVbg+u; dkim=neutral (no key) header.i=@linutronix.de header.s=2020e; 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=QUARANTINE dis=NONE) header.from=linutronix.de Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id o20-20020a056a0015d400b005397c4ad9e1si2470655pfu.134.2022.11.24.15.25.49; Thu, 24 Nov 2022 15:26:04 -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=@linutronix.de header.s=2020 header.b=fSdVbg+u; dkim=neutral (no key) header.i=@linutronix.de header.s=2020e; 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=QUARANTINE dis=NONE) header.from=linutronix.de Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229766AbiKXXZG (ORCPT + 99 others); Thu, 24 Nov 2022 18:25:06 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:43120 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229610AbiKXXYj (ORCPT ); Thu, 24 Nov 2022 18:24:39 -0500 Received: from galois.linutronix.de (Galois.linutronix.de [IPv6:2a0a:51c0:0:12e:550::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 0FA11898CB; Thu, 24 Nov 2022 15:24:28 -0800 (PST) Message-ID: <20221124230314.044613697@linutronix.de> DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020; t=1669332266; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: references:references; bh=x2FLCuF8Xx8AySp9OHgOheEghQq8ehPfwhiGfgwepSM=; b=fSdVbg+u/TWqJfbPCEQESo8FLiGMdEKgTWQub3f7agTq3Eg+So028TFvzEddwh7jLwS9cE /q15t8aieHFexWg2CqZolhQAXhrs+juCOajxl4rmjue6Ehtvw3qGSmcmta9av8HgCG0w7+ HANaj/SFfLBG9//yUJLmtWNcgocyJnnmRce6QMcmNljPwnJ66gd7At6Nkqp+1qrxB6l1XI AR2UrY8ypKxwjj0wKEHVy43qgN0ecBsZBHrz0J/4gVCW1Et/Si2xAFdvNS3tKFlpzZmLTm ZdDpL6ObTmsGALslVk3rhyGJwwf0vWGYgEzxY94uVJMr1Do9SnQmhNRo5+zyvQ== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020e; t=1669332266; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: references:references; bh=x2FLCuF8Xx8AySp9OHgOheEghQq8ehPfwhiGfgwepSM=; b=hJ/ILqaggPKEbceqhzx7lHfxS10XTJZTdjXuLEcMMEAShh3J70ripCmsMbLriR4qyZfKvo kXej1vPYj58UKPCA== From: Thomas Gleixner To: LKML Cc: 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 , "Ahmed S. Darwish" Subject: [patch V3 11/22] genirq/msi: Make msi_get_virq() device domain aware References: <20221124225331.464480443@linutronix.de> MIME-Version: 1.0 Date: Fri, 25 Nov 2022 00:24:25 +0100 (CET) X-Spam-Status: No, score=-4.4 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_MED,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 X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1750421853033308178?= X-GMAIL-MSGID: =?utf-8?q?1750421853033308178?= From: Ahmed S. Darwish In preparation of the upcoming per device multi MSI domain support, change the interface to support lookups based on domain id and zero based index within the domain. Signed-off-by: Ahmed S. Darwish Signed-off-by: Thomas Gleixner --- V2: Fix the locking leak and the operator precedence issue (kernel robot) V3: Adopt to the domain/xarray storage change --- include/linux/msi_api.h | 14 +++++++++++++- kernel/irq/msi.c | 19 +++++++++++++------ 2 files changed, 26 insertions(+), 7 deletions(-) --- a/include/linux/msi_api.h +++ b/include/linux/msi_api.h @@ -18,6 +18,18 @@ enum msi_domain_ids { MSI_MAX_DEVICE_IRQDOMAINS, }; -unsigned int msi_get_virq(struct device *dev, unsigned int index); +unsigned int msi_domain_get_virq(struct device *dev, unsigned int domid, unsigned int index); + +/** + * msi_get_virq - Lookup the Linux interrupt number for a MSI index on the default interrupt domain + * @dev: Device for which the lookup happens + * @index: The MSI index to lookup + * + * Return: The Linux interrupt number on success (> 0), 0 if not found + */ +static inline unsigned int msi_get_virq(struct device *dev, unsigned int index) +{ + return msi_domain_get_virq(dev, MSI_DEFAULT_DOMAIN, index); +} #endif --- a/kernel/irq/msi.c +++ b/kernel/irq/msi.c @@ -338,26 +338,32 @@ struct msi_desc *msi_next_desc(struct de EXPORT_SYMBOL_GPL(msi_next_desc); /** - * msi_get_virq - Return Linux interrupt number of a MSI interrupt + * msi_domain_get_virq - Lookup the Linux interrupt number for a MSI index on a interrupt domain * @dev: Device to operate on + * @domid: Domain ID of the interrupt domain associated to the device * @index: MSI interrupt index to look for (0-based) * * Return: The Linux interrupt number on success (> 0), 0 if not found */ -unsigned int msi_get_virq(struct device *dev, unsigned int index) +unsigned int msi_domain_get_virq(struct device *dev, unsigned int domid, unsigned int index) { struct msi_desc *desc; unsigned int ret = 0; + bool pcimsi = false; struct xarray *xa; - bool pcimsi; if (!dev->msi.data) return 0; - pcimsi = dev_is_pci(dev) ? to_pci_dev(dev)->msi_enabled : false; + if (WARN_ON_ONCE(index > MSI_MAX_INDEX || domid >= MSI_MAX_DEVICE_IRQDOMAINS)) + return 0; + + /* This check is only valid for the PCI default MSI domain */ + if (dev_is_pci(dev) && domid == MSI_DEFAULT_DOMAIN) + pcimsi = to_pci_dev(dev)->msi_enabled; msi_lock_descs(dev); - xa = &dev->msi.data->__domains[MSI_DEFAULT_DOMAIN].store; + xa = &dev->msi.data->__domains[domid].store; desc = xa_load(xa, pcimsi ? 0 : index); if (desc && desc->irq) { /* @@ -372,10 +378,11 @@ unsigned int msi_get_virq(struct device ret = desc->irq; } } + msi_unlock_descs(dev); return ret; } -EXPORT_SYMBOL_GPL(msi_get_virq); +EXPORT_SYMBOL_GPL(msi_domain_get_virq); #ifdef CONFIG_SYSFS static struct attribute *msi_dev_attrs[] = {