From: Thomas Gleixner <tglx@linutronix.de>
To: LKML <linux-kernel@vger.kernel.org>
Cc: x86@kernel.org, Joerg Roedel <joro@8bytes.org>,
Will Deacon <will@kernel.org>,
linux-pci@vger.kernel.org, Bjorn Helgaas <bhelgaas@google.com>,
Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>,
Marc Zyngier <maz@kernel.org>,
Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
Jason Gunthorpe <jgg@mellanox.com>,
Dave Jiang <dave.jiang@intel.com>,
Alex Williamson <alex.williamson@redhat.com>,
Kevin Tian <kevin.tian@intel.com>,
Dan Williams <dan.j.williams@intel.com>,
Logan Gunthorpe <logang@deltatee.com>,
Ashok Raj <ashok.raj@intel.com>, Jon Mason <jdmason@kudzu.us>,
Allen Hubbe <allenbh@gmail.com>
Subject: [patch V2 13/21] genirq/msi: Make descriptor freeing domain aware
Date: Mon, 21 Nov 2022 15:36:34 +0100 (CET) [thread overview]
Message-ID: <20221121083326.228016703@linutronix.de> (raw)
In-Reply-To: 20221121083210.309161925@linutronix.de
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 <tglx@linutronix.de>
---
include/linux/msi.h | 19 ++++++++++++++--
kernel/irq/msi.c | 59 ++++++++++++++++++++++++++++++++++++++++++++--------
2 files changed, 67 insertions(+), 11 deletions(-)
--- a/include/linux/msi.h
+++ b/include/linux/msi.h
@@ -293,10 +293,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 - Free MSI descriptors of a device
+ * 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 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 */
@@ -186,22 +198,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_range_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);
- xa_for_each_range(xa, idx, desc, first_index, last_index) {
+ if (!msi_ctrl_range_valid(dev, ctrl))
+ return;
+
+ base = msi_get_domain_base_index(dev, ctrl->domid);
+ if (base < 0)
+ return;
+
+ 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 */
@@ -211,6 +233,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;
next prev parent reply other threads:[~2022-11-21 14:37 UTC|newest]
Thread overview: 31+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-11-21 14:36 [patch V2 00/21] genirq, PCI/MSI: Support for per device MSI and PCI/IMS - Part 2 API rework Thomas Gleixner
2022-11-21 14:36 ` [patch V2 01/21] genirq/msi: Move IRQ_DOMAIN_MSI_NOMASK_QUIRK to MSI flags Thomas Gleixner
2022-11-24 13:44 ` Marc Zyngier
2022-11-21 14:36 ` [patch V2 02/21] genirq/irqdomain: Make struct irqdomain readable Thomas Gleixner
2022-11-24 13:45 ` Marc Zyngier
2022-11-21 14:36 ` [patch V2 03/21] genirq/irqdomain: Rename irq_domain::dev to irq_domain::pm_dev Thomas Gleixner
2022-11-24 13:46 ` Marc Zyngier
2022-11-21 14:36 ` [patch V2 04/21] genirq/msi: Create msi_api.h Thomas Gleixner
2022-11-24 13:47 ` Marc Zyngier
2022-11-21 14:36 ` [patch V2 05/21] genirq/irqdomain: Provide IRQ_DOMAIN_FLAG_MSI_PARENT Thomas Gleixner
2022-11-21 14:36 ` [patch V2 06/21] genirq/irqdomain: Provide IRQ_DOMAIN_FLAG_MSI_DEVICE Thomas Gleixner
2022-11-21 14:36 ` [patch V2 07/21] genirq/msi: Check for invalid MSI parent domain usage Thomas Gleixner
2022-11-21 14:36 ` [patch V2 08/21] genirq/msi: Add pointers for per device irq domains Thomas Gleixner
2022-11-24 14:56 ` Marc Zyngier
2022-11-24 15:02 ` Thomas Gleixner
2022-11-21 14:36 ` [patch V2 09/21] genirq/msi: Make MSI descriptor iterators device domain aware Thomas Gleixner
2022-11-24 15:46 ` Marc Zyngier
2022-11-24 15:55 ` Thomas Gleixner
2022-11-21 14:36 ` [patch V2 10/21] genirq/msi: Make msi_get_virq() " Thomas Gleixner
2022-11-21 14:36 ` [patch V2 11/21] genirq/msi: Rename msi_add_msi_desc() to msi_insert_msi_desc() Thomas Gleixner
2022-11-21 14:36 ` [patch V2 12/21] genirq/msi: Make descriptor allocation device domain aware Thomas Gleixner
2022-11-21 14:36 ` Thomas Gleixner [this message]
2022-11-21 14:36 ` [patch V2 14/21] genirq/msi: Make msi_add_simple_msi_descs() " Thomas Gleixner
2022-11-21 14:36 ` [patch V2 15/21] genirq/msi: Provide new domain id based interfaces for freeing interrupts Thomas Gleixner
2022-11-21 14:36 ` [patch V2 16/21] genirq/msi: Provide new domain id allocation functions Thomas Gleixner
2022-11-21 14:36 ` [patch V2 17/21] PCI/MSI: Use msi_domain_alloc/free_irqs_all_locked() Thomas Gleixner
2022-11-21 14:36 ` [patch V2 18/21] platform-msi: Switch to the domain id aware MSI interfaces Thomas Gleixner
2022-11-21 14:36 ` [patch V2 19/21] bus: fsl-mc-msi: Switch to domain id aware interfaces Thomas Gleixner
2022-11-21 14:36 ` [patch V2 20/21] oc: ti: ti_sci_inta_msi: Switch to domain id aware MSI functions Thomas Gleixner
2022-11-21 14:36 ` [patch V2 21/21] genirq/msi: Remove unused alloc/free interfaces Thomas Gleixner
2022-11-23 2:12 ` [patch V2 00/21] genirq, PCI/MSI: Support for per device MSI and PCI/IMS - Part 2 API rework Tian, Kevin
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20221121083326.228016703@linutronix.de \
--to=tglx@linutronix.de \
--cc=alex.williamson@redhat.com \
--cc=allenbh@gmail.com \
--cc=ashok.raj@intel.com \
--cc=bhelgaas@google.com \
--cc=dan.j.williams@intel.com \
--cc=dave.jiang@intel.com \
--cc=gregkh@linuxfoundation.org \
--cc=jdmason@kudzu.us \
--cc=jgg@mellanox.com \
--cc=joro@8bytes.org \
--cc=kevin.tian@intel.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pci@vger.kernel.org \
--cc=logang@deltatee.com \
--cc=lorenzo.pieralisi@arm.com \
--cc=maz@kernel.org \
--cc=will@kernel.org \
--cc=x86@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).