From patchwork Fri Nov 11 13:56:56 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Thomas Gleixner X-Patchwork-Id: 18809 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:6687:0:0:0:0:0 with SMTP id l7csp757106wru; Fri, 11 Nov 2022 06:04:12 -0800 (PST) X-Google-Smtp-Source: AA0mqf6oqCnhMOv94bmvcAeIk8pYHzFwKGHYwKnhR6PHma/HsOpDuX/rZATKg9d0RJWBn7MCAKCT X-Received: by 2002:a17:902:edca:b0:188:abcc:249f with SMTP id q10-20020a170902edca00b00188abcc249fmr2024405plk.44.1668175452612; Fri, 11 Nov 2022 06:04:12 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1668175452; cv=none; d=google.com; s=arc-20160816; b=1LxQMsq1hPmmcTpGDo0j+ELPTElzB5GRNSN4JTarXRzOmHaOGnINK1qGMzF+k5jHIK p7mrYw3UFbSTwK0xvGmw5GbN9R3PKBaE/4pYVgggduEP8y0dmQhScNO/NvOhdJfk1xXC FeVj5CqmLrZA9+B1olJkfOnCNG2wLR8zXyfjoD9MOBXw11r6tTl2XO/mpO6RjUVf5laU Qk2fUV5Qkb1t1x+6NOd0Ifm+HIsjXcFviRv9+18bLm57Ta9iC1Lxkq9jUmAJpPcXoMXg YfiYVgFYDV1wDUU4YSZl6P5MdFk1oXb+7e37ZkohxkZv+k3hvYdBni89k6IihLk6/OL+ i8/A== 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=YtbDzWpnrwwWvyENpRXFEkCRkWQeuna82et5GcBOaeQ=; b=jKLrGs7V4d9Fcf6K2eGIgeQBDJRF2hh+kQh8rf2oJ3JPjnx1O9xGCbEGwkfXo6frbz 0dvPR8tVjzUWBGHbIfvEqKbx86u7HG3BzJ9CiEPO59R6S7sdDmyt5gPpO4XZwDejQIo0 MWfh6L3e+pswA8ITcxEmfUFPbRKDH74bXe0/w7m+ferjiG4xT97/vMVmJ92XwJy4+HvF 5Y28u5T7QSBEO+SDGQlvKNyl6xWEq67F4JGiCRnWZaYch/FZiDPg5SwGa5toSM9Gwqkd JbgULSjoD1gxbAKQzk3ysqSyqWKiG2WgoFydX7jhFsydU+sDbt2c1kmLkQbAIH5F14Nq xsZg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linutronix.de header.s=2020 header.b=I8oj1tOx; dkim=neutral (no key) header.i=@linutronix.de header.s=2020e header.b=KlhnSQSi; 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 e9-20020a056a001a8900b00565eb80af7fsi2577835pfv.343.2022.11.11.06.03.25; Fri, 11 Nov 2022 06:04: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=I8oj1tOx; dkim=neutral (no key) header.i=@linutronix.de header.s=2020e header.b=KlhnSQSi; 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 S234370AbiKKOCH (ORCPT + 99 others); Fri, 11 Nov 2022 09:02:07 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:43518 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234234AbiKKOBN (ORCPT ); Fri, 11 Nov 2022 09:01:13 -0500 Received: from galois.linutronix.de (Galois.linutronix.de [193.142.43.55]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id DC537814E1; Fri, 11 Nov 2022 05:56:58 -0800 (PST) Message-ID: <20221111132706.726275059@linutronix.de> DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020; t=1668175017; 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=YtbDzWpnrwwWvyENpRXFEkCRkWQeuna82et5GcBOaeQ=; b=I8oj1tOxDQINripBgyYjlotza6hp2yQpXUO5MhuSBEr788JcnzCCG6WEV1NmYZm3AeUehZ 51WZuuKl4kZndKjJf6HLtVGA7JvvUld4zewT+BB3HzK5qB9M6BhGj/JdZAzmEd0IlrWnyI nkKxjXwci2K0XFvcZOzcqGzWaHS56Y1awosMNsbmQLRDyF5wCDBkwrikiLW7KbMMpv/LPl X6BZnMU0TibrEtJ0FsYy9bLVLfX+D8hiQvyPPVJHSGP+VDQWZIvzyWGzsnIuXNYssEWrzU XucdxL20GLIAR7Wx8SXV477Tf8s2SCY6fiq/zSfVsQ1xI5Yk6IRcqSfwkvCg5w== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020e; t=1668175017; 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=YtbDzWpnrwwWvyENpRXFEkCRkWQeuna82et5GcBOaeQ=; b=KlhnSQSinKHnMC5rAQCdApjO39ut/EiYB/N16OKSyQ/HLcMYcfZfTT/9GxgxVoZTBCxXLw qF7dM3ZQU4byrWDw== 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" , Reinette Chatre Subject: [patch 12/20] genirq/msi: Make descriptor freeing domain aware References: <20221111131813.914374272@linutronix.de> MIME-Version: 1.0 Date: Fri, 11 Nov 2022 14:56:56 +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?1749208743338162693?= X-GMAIL-MSGID: =?utf-8?q?1749208743338162693?= Change the descriptor free functions to take a domain id to prepare for the upcoming multi MSI domain per device support. To avoid changing and extending the interfaces over and over use an core internal control struct and hand the pointer through the various functions. Signed-off-by: Thomas Gleixner --- include/linux/msi.h | 22 ++++++++++++++++--- kernel/irq/msi.c | 60 ++++++++++++++++++++++++++++++++++++++++++---------- 2 files changed, 68 insertions(+), 14 deletions(-) --- a/include/linux/msi.h +++ b/include/linux/msi.h @@ -277,7 +277,8 @@ static inline void msi_desc_set_iommu_co int msi_domain_insert_msi_desc(struct device *dev, unsigned int domid, struct msi_desc *init_desc); /** - * msi_insert_msi_desc - Allocate and initialize a MSI descriptor in the default domain + * msi_insert_msi_desc - Allocate and initialize a MSI descriptor in the default irqdomain + * * @dev: Pointer to the device for which the descriptor is allocated * @init_desc: Pointer to an MSI descriptor to initialize the new descriptor * @@ -288,10 +289,25 @@ static inline int msi_insert_msi_desc(st return msi_domain_insert_msi_desc(dev, MSI_DEFAULT_DOMAIN, init_desc); } -void msi_free_msi_descs_range(struct device *dev, unsigned int first_index, unsigned int last_index); +void msi_domain_free_msi_descs_range(struct device *dev, unsigned int domid, + unsigned int first, unsigned int last); + +/** + * msi_free_msi_descs_range - Free a range of MSI descriptors of a device + * in the default irqdomain + * + * @dev: Device for which to free the descriptors + * @first: Index to start freeing from (inclusive) + * @last: Last index to be freed (inclusive) + */ +static inline void msi_free_msi_descs_range(struct device *dev, unsigned int first, + unsigned int last) +{ + msi_domain_free_msi_descs_range(dev, MSI_DEFAULT_DOMAIN, first, last); +} /** - * msi_free_msi_descs - Free MSI descriptors of a device + * msi_free_msi_descs - Free all MSI descriptors of a device in the default irqdomain * @dev: Device to free the descriptors */ static inline void msi_free_msi_descs(struct device *dev) --- a/kernel/irq/msi.c +++ b/kernel/irq/msi.c @@ -19,6 +19,18 @@ #include "internals.h" +/** + * struct msi_ctrl - MSI internal management control structure + * @domid: ID of the domain on which management operations should be done + * @first: First (hardware) slot index to operate on + * @last: Last (hardware) slot index to operate on + */ +struct msi_ctrl { + unsigned int domid; + unsigned int first; + unsigned int last; +}; + static inline int msi_sysfs_create_group(struct device *dev); /* Invalid XA index which is outside of any searchable range */ @@ -189,25 +201,32 @@ static bool msi_desc_match(struct msi_de return false; } -/** - * msi_free_msi_descs_range - Free MSI descriptors of a device - * @dev: Device to free the descriptors - * @first_index: Index to start freeing from - * @last_index: Last index to be freed - */ -void msi_free_msi_descs_range(struct device *dev, unsigned int first_index, - unsigned int last_index) +static bool msi_ctrl_valid(struct device *dev, struct msi_ctrl *ctrl) +{ + if (WARN_ON_ONCE(ctrl->first > ctrl->last || + ctrl->first >= MSI_MAX_INDEX || + ctrl->last >= MSI_MAX_INDEX)) + return false; + return true; +} + +static void msi_domain_free_descs(struct device *dev, struct msi_ctrl *ctrl) { struct xarray *xa = &dev->msi.data->__store; struct msi_desc *desc; unsigned long idx; + int base; + + lockdep_assert_held(&dev->msi.data->mutex); - if (WARN_ON_ONCE(first_index >= MSI_MAX_INDEX || last_index >= MSI_MAX_INDEX)) + if (!msi_ctrl_valid(dev, ctrl)) return; - lockdep_assert_held(&dev->msi.data->mutex); + base = msi_get_domain_base_index(dev, ctrl->domid); + if (base < 0) + return; - xa_for_each_range(xa, idx, desc, first_index, last_index) { + xa_for_each_range(xa, idx, desc, ctrl->first + base, ctrl->last + base) { xa_erase(xa, idx); /* Leak the descriptor when it is still referenced */ @@ -217,6 +236,25 @@ void msi_free_msi_descs_range(struct dev } } +/** + * msi_domain_free_msi_descs_range - Free a range of MSI descriptors of a device in an irqdomain + * @dev: Device for which to free the descriptors + * @domid: Id of the domain to operate on + * @first: Index to start freeing from (inclusive) + * @last: Last index to be freed (inclusive) + */ +void msi_domain_free_msi_descs_range(struct device *dev, unsigned int domid, + unsigned int first, unsigned int last) +{ + struct msi_ctrl ctrl = { + .domid = domid, + .first = first, + .last = last, + }; + + msi_domain_free_descs(dev, &ctrl); +} + void __get_cached_msi_msg(struct msi_desc *entry, struct msi_msg *msg) { *msg = entry->msg;