From patchwork Mon Nov 21 14:36:30 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Thomas Gleixner X-Patchwork-Id: 23798 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:adf:f944:0:0:0:0:0 with SMTP id q4csp1626745wrr; Mon, 21 Nov 2022 06:38:12 -0800 (PST) X-Google-Smtp-Source: AA0mqf4BIbFKyNCW/QQm+Qt+1rbZLqWU9Gd9XlnOApMKEpuwPSf6aZA1KeDTwI/sEyS429XJn6Jj X-Received: by 2002:a65:694e:0:b0:474:6749:407d with SMTP id w14-20020a65694e000000b004746749407dmr477585pgq.425.1669041492128; Mon, 21 Nov 2022 06:38:12 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1669041492; cv=none; d=google.com; s=arc-20160816; b=q+uiel8Fqs7Tc4O6WsgAyPcv5EuMT8XjlWCX4OEdfCXTDBzxB0Rep2vypuGY/7YANw ScTxIKZBZDaw9mmVxhSF2A0o3dlSLU+fZW2X3dkIebBZ1DjlWT2w+m0ymCgI9motyX9R DdS3A/IRGvSDR49kTh1KCn5rv7NyIpHU8AStDNYxZHzKYa3oPtsdIQtdSYksp4ud3c+E i44FK4WhTXLhXg+Uz/gfYHoacTbQuuQoOd4RHikF84uuDVpErBCAMLnsQLqWp5cyAz0f B64Wh/EeRCRWSFSXeSk7AhgTpKR+5yS+Ij0ufxN7cxMGg/t7WSA2fp48JlDlqCVr5Vq0 8Ozg== 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=XKtpijacgcV8/nCTByztO8f4qnhUrmimBQl8oQuyrjc=; b=WaocIQa34yGtLqsI7UAHeoC5oeVQzzutrVKzKXFdreiWSNJFsuZ8cT/oVibwSmhMbN rQ05kKss3NdqEWCycBqQ+yWXFIlFAd7kg+EVzbryoFgb5OKud8OikB6VGbirAuOqRwVn j0zk7U1E1CF3LOxsY7Z8Plhw1LzLH0nrDUhdJN8oiLxk9nrf6r/yu+LqdRhMvSCco3eH OB6hpGtelkLf96izyVPote//ss1YLkLcD+PyEsS/8A9Fmsd+mbLIpbJNTpHUeBNXG20q Fxc/5rQc+omF0BZo3k04sF+oTHjfsZxtzg49ocDldhL9mQHgg785qJvxjFdqI/OgWt8q auFQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linutronix.de header.s=2020 header.b=fmTlkmLm; dkim=neutral (no key) header.i=@linutronix.de header.b=SUifxZ3Y; 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 w5-20020a63af05000000b0047679c34e33si11235215pge.428.2022.11.21.06.37.58; Mon, 21 Nov 2022 06:38:12 -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=fmTlkmLm; dkim=neutral (no key) header.i=@linutronix.de header.b=SUifxZ3Y; 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 S231322AbiKUOh2 (ORCPT + 99 others); Mon, 21 Nov 2022 09:37:28 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:47634 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231279AbiKUOgm (ORCPT ); Mon, 21 Nov 2022 09:36:42 -0500 Received: from galois.linutronix.de (Galois.linutronix.de [193.142.43.55]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 6F2E1C7210; Mon, 21 Nov 2022 06:36:32 -0800 (PST) Message-ID: <20221121083326.056299459@linutronix.de> DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020; t=1669041391; 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=XKtpijacgcV8/nCTByztO8f4qnhUrmimBQl8oQuyrjc=; b=fmTlkmLmeCpYnQ2H384C1kftB37lQDAfjPUvbAxzkY6TKz4z1CMnXEhYFYOBbKR90REmp9 /Fbn+ghuUprcA0TS1MngifG+Hcf8OksUXJ3Q8E59tSyKCUe10iXuJQKzWZ02s4lJ/Dknmv 83HZoU36SrSzuabJ3Kifdcmq8iw1OckNtYx3tAV1COuknF81ZPFdqCaQF7AsNJKTCqG+YW pNI/LfXMbN7LQJxZUx6vB5tsJritM8Ymon9DE4g8uuXnR0lWgKN1ex/MZe0Z29i1d3gWo/ l5aJeQHmbAXvwAsp2jY2wHw9Wc43dpuzYW+pjbr8xMNUQldRA1WZ4i+jBdF5Iw== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020e; t=1669041391; 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=XKtpijacgcV8/nCTByztO8f4qnhUrmimBQl8oQuyrjc=; b=SUifxZ3Y0/AmPPpqvb6faM2hoCT6jLvDLeTgZ+9bYVKXEnuEhV/NLYlTe15YSGbT4T66N+ RIi40TUBSFPM9uDQ== 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 V2 10/21] genirq/msi: Make msi_get_virq() device domain aware References: <20221121083210.309161925@linutronix.de> MIME-Version: 1.0 Date: Mon, 21 Nov 2022 15:36:30 +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?1750116852007961227?= X-GMAIL-MSGID: =?utf-8?q?1750116852007961227?= 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) --- 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[] = {