From: Marc Zyngier <maz@kernel.org>
To: Thomas Gleixner <tglx@linutronix.de>
Cc: LKML <linux-kernel@vger.kernel.org>,
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>,
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: Re: [patch V2 08/21] genirq/msi: Add pointers for per device irq domains
Date: Thu, 24 Nov 2022 14:56:25 +0000 [thread overview]
Message-ID: <86sfi8mmee.wl-maz@kernel.org> (raw)
In-Reply-To: <20221121083325.950255253@linutronix.de>
On Mon, 21 Nov 2022 14:36:28 +0000,
Thomas Gleixner <tglx@linutronix.de> wrote:
>
> With the upcoming per device MSI interrupt domain support it is necessary
> to store the domain pointers per device.
>
> Instead of delegating that storage to device drivers or subsystems create a
> storage array in struct msi_device_data which will also take care of
> tearing down the irq domains when msi_device_data is cleaned up via devres.
>
> The interfaces into the MSI core will be changed from irqdomain pointer
> based interfaces to domain id based interfaces to support multiple MSI
> domains on a single device (e.g. PCI/MSI[-X] and PCI/IMS.
>
> Once the per device domain support is complete the irq domain pointer in
> struct device::msi.domain will not longer contain a pointer to the "global"
> MSI domain. It will contain a pointer to the MSI parent domain instead.
>
> It would be a horrible maze of conditionals to evaluate all over the place
> which domain pointer should be used, i.e. the "global" one in
> device::msi::domain or one from the internal pointer array.
>
> To avoid this evaluate in msi_setup_device_data() whether the irq domain
> which is associated to a device is a "global" or a parent MSI domain. If it
> is global then copy the pointer into the first entry in the irqdomain
> pointer array.
>
> This allows to convert interfaces and implementation to domain ids while
> keeping everything existing working.
>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
> ---
> include/linux/msi.h | 3 +++
> include/linux/msi_api.h | 8 ++++++++
> kernel/irq/msi.c | 14 ++++++++++++++
> 3 files changed, 25 insertions(+)
>
> --- a/include/linux/msi.h
> +++ b/include/linux/msi.h
> @@ -77,6 +77,7 @@ struct msi_desc;
> struct pci_dev;
> struct platform_msi_priv_data;
> struct device_attribute;
> +struct irq_domain;
>
> void __get_cached_msi_msg(struct msi_desc *entry, struct msi_msg *msg);
> #ifdef CONFIG_GENERIC_MSI_IRQ
> @@ -180,6 +181,7 @@ enum msi_desc_filter {
> * @mutex: Mutex protecting the MSI descriptor store
> * @__store: Xarray for storing MSI descriptor pointers
> * @__iter_idx: Index to search the next entry for iterators
> + * @__irqdomains: Per device interrupt domains
> */
> struct msi_device_data {
> unsigned long properties;
> @@ -187,6 +189,7 @@ struct msi_device_data {
> struct mutex mutex;
> struct xarray __store;
> unsigned long __iter_idx;
> + struct irq_domain *__irqdomains[MSI_MAX_DEVICE_IRQDOMAINS];
> };
>
> int msi_setup_device_data(struct device *dev);
> --- a/include/linux/msi_api.h
> +++ b/include/linux/msi_api.h
> @@ -10,6 +10,14 @@
>
> struct device;
>
> +/*
> + * Per device interrupt domain related constants.
> + */
> +enum msi_domain_ids {
> + MSI_DEFAULT_DOMAIN,
> + MSI_MAX_DEVICE_IRQDOMAINS,
> +};
> +
> unsigned int msi_get_virq(struct device *dev, unsigned int index);
>
> #endif
> --- a/kernel/irq/msi.c
> +++ b/kernel/irq/msi.c
> @@ -21,6 +21,18 @@
>
> static inline int msi_sysfs_create_group(struct device *dev);
>
> +static inline void msi_setup_default_irqdomain(struct device *dev, struct msi_device_data *md)
Do we really need this to be inline? I'm sure the compiler can figure
it out.
> +{
> + if (!dev->msi.domain)
> + return;
> + /*
> + * If @dev::msi::domain is a global MSI domain, copy the pointer
> + * into the domain array to avoid conditionals all over the place.
> + */
> + if (!irq_domain_is_msi_parent(dev->msi.domain))
> + md->__irqdomains[MSI_DEFAULT_DOMAIN] = dev->msi.domain;
> +}
> +
> /**
> * msi_alloc_desc - Allocate an initialized msi_desc
> * @dev: Pointer to the device for which this is allocated
> @@ -213,6 +225,8 @@ int msi_setup_device_data(struct device
> return ret;
> }
>
> + msi_setup_default_irqdomain(dev, md);
> +
nit: if you move the setup below the msi.data assignment, you could
only pass dev as a parameter. Or pass both and move the assignment in
the function?
> xa_init(&md->__store);
> mutex_init(&md->mutex);
> dev->msi.data = md;
>
>
Irrespective of the above,
Reviewed-by: Marc Zyngier <maz@kernel.org>
M.
--
Without deviation from the norm, progress is not possible.
next prev parent reply other threads:[~2022-11-24 14:56 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 [this message]
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 ` [patch V2 13/21] genirq/msi: Make descriptor freeing " Thomas Gleixner
2022-11-21 14:36 ` [patch V2 14/21] genirq/msi: Make msi_add_simple_msi_descs() device " 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=86sfi8mmee.wl-maz@kernel.org \
--to=maz@kernel.org \
--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=tglx@linutronix.de \
--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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.