From patchwork Sun Nov 13 10:37:11 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Thomas Gleixner X-Patchwork-Id: 19335 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:6687:0:0:0:0:0 with SMTP id l7csp1633292wru; Sun, 13 Nov 2022 03:00:26 -0800 (PST) X-Google-Smtp-Source: AA0mqf72l2j7dbh1CA86WhdNDHcP8yZFJl4Mr5idyFe604NPZVixuj5vg2m4yO/zfuxsl3qeEcpN X-Received: by 2002:a50:d4d1:0:b0:467:6ffe:e94c with SMTP id e17-20020a50d4d1000000b004676ffee94cmr6344760edj.417.1668337225980; Sun, 13 Nov 2022 03:00:25 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1668337225; cv=none; d=google.com; s=arc-20160816; b=cHljdht7xdLcE/szpHfl279T7qrbP6SYukZXeVg2skJUQEd5eLCZ+JhdxBR9UDtk1u d+DBYMmramG0UMM2AOvDugo3FuMZwR74KLwBixxVWYgpJ/MrDaD6uKYoJWajLSsUR0gp LG68vxVF778KdvGUsZvpUR4uTFmWSyYwJVHE9kZzvREexfSK5j2cX0vhpTUjuG6uX1r7 fko04Pz3YPn9XfsT9zG2IFkznG9QFKxRNWmxVP2lUOQ29c2B0jCuLm4LXru+2xSuRKSi e4B3umgZHX6EnhMeBQxVfooJZFCCK3ur42ShMBbdQmiJynW/v20En3hey9NIMrYbqD0S 46pw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:mime-version:message-id:date:references :in-reply-to:subject:cc:to:dkim-signature:dkim-signature:from; bh=6iF3n9tQ4g0XpllF0/tUEJazpwgIDBdGU1mjlOezwuI=; b=d06z3a/WkiPszpuhuRMcDXsdHpwPw9C/c0/0rgE6ixOCUF0xNAObXyXt6TtuIUjNAi hEQv0iqKl9Vgq4wRWRzarxx++YCgVukSNjf8HehgecFR2ypwetxnzGXWfl0soSCgCIlh 7OKribzBnDB+ghtgNKJRAxZyMVz6OFLWtHaviVTeiSIMhLAmiS7JVVoqU+uzLZaLtL5L Hep4aZA7BSvMtfFKD6CCZpMn7CAmZNmtdeXcBQ/VAuztbNLd2RRrkiSRF6O90WcBKsKs Xl7n8DjqWzepKSe1Vf9OySibC1/DnxGBPY/QiSVczc+XuY5GzbjMJ26BnZB1mTEF+VYg z3ZQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linutronix.de header.s=2020 header.b=oaHjeZQv; dkim=neutral (no key) header.i=@linutronix.de header.b=z12JJ0W0; 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 ay14-20020a170906d28e00b00783645da4e5si5578428ejb.582.2022.11.13.03.00.01; Sun, 13 Nov 2022 03:00:25 -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=oaHjeZQv; dkim=neutral (no key) header.i=@linutronix.de header.b=z12JJ0W0; 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 S231972AbiKMKhQ (ORCPT + 99 others); Sun, 13 Nov 2022 05:37:16 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:40694 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235242AbiKMKhO (ORCPT ); Sun, 13 Nov 2022 05:37:14 -0500 Received: from galois.linutronix.de (Galois.linutronix.de [IPv6:2a0a:51c0:0:12e:550::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 74A3F12767; Sun, 13 Nov 2022 02:37:13 -0800 (PST) From: Thomas Gleixner DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020; t=1668335832; 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: in-reply-to:in-reply-to:references:references; bh=6iF3n9tQ4g0XpllF0/tUEJazpwgIDBdGU1mjlOezwuI=; b=oaHjeZQvwwapqIZ/3Dp+D6uV3eiiiM/7nDPKzD9wMR0oy5PhAzDRzaOkLYwrF6N8xIJw+b 4EbfVhIIQ1BXexSlRGRqANYL0l1yqL51pHWKh4zW+SIYvmBW+rfkuVa63YRKl0OKVjYtFw DoVkJQPpyKPKa95rmzZ4jpgK9BR/BtLiCAIYMUwRZtHUwc/XxUJtDYROrmpo+Hc09unESK Au4qbPx0Ku26pgxEDkSqqz9aE2Igy+WdzN8R1iTB02CE+Ae/ih/JT/N+lKI4KBiAWllwDD BpZ2QyqCUmJDKlkBE3egZqdZfwsOrrHEbzOZgR4fezvGPpO+L61etNf2SYeKpA== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020e; t=1668335832; 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: in-reply-to:in-reply-to:references:references; bh=6iF3n9tQ4g0XpllF0/tUEJazpwgIDBdGU1mjlOezwuI=; b=z12JJ0W019T8fuL++/hlssOjR1r40/yC1M09M/nKAgS+3ysheu6CN2wKTzwYHzC458sKt1 fs7DoaQnipRZXrDQ== 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" , Reinette Chatre Subject: [patch V1A 09/20] genirq/msi: Make msi_get_virq() device domain aware In-Reply-To: <20221111132706.556889434@linutronix.de> References: <20221111131813.914374272@linutronix.de> <20221111132706.556889434@linutronix.de> Date: Sun, 13 Nov 2022 11:37:11 +0100 Message-ID: <87pmdrta20.ffs@tglx> MIME-Version: 1.0 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?1749208716804180141?= X-GMAIL-MSGID: =?utf-8?q?1749378375166823228?= 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 --- V1A: Fix the locking leak and a operator precedence issue (Dan, kernel robot) This was reported earlier and I missed to fold the fix before posting. :( --- include/linux/msi_api.h | 14 +++++++++++++- kernel/irq/msi.c | 27 +++++++++++++++++++++------ 2 files changed, 34 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 @@ -351,25 +351,38 @@ 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; + bool pcimsi = false; + int base; 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)) + 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); - desc = xa_load(&dev->msi.data->__store, pcimsi ? 0 : index); + + base = msi_get_domain_base_index(dev, domid); + if (base < 0) + goto unlock; + + base += pcimsi ? 0 : index; + desc = xa_load(&dev->msi.data->__store, base); if (desc && desc->irq) { /* * PCI-MSI has only one descriptor for multiple interrupts. @@ -383,10 +396,12 @@ unsigned int msi_get_virq(struct device ret = desc->irq; } } + +unlock: 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[] = {