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 09/21] genirq/msi: Make MSI descriptor iterators device domain aware
Date: Thu, 24 Nov 2022 15:46:03 +0000 [thread overview]
Message-ID: <86r0xsmk3o.wl-maz@kernel.org> (raw)
In-Reply-To: <20221121083326.002153609@linutronix.de>
On Mon, 21 Nov 2022 14:36:29 +0000,
Thomas Gleixner <tglx@linutronix.de> wrote:
>
> To support multiple MSI interrupt domains per device it is necessary to
> segment the xarray MSI descriptor storage. Each domain gets up to
> MSI_MAX_INDEX entries.
>
> Change the iterators so they operate with domain ids and take the domain
> offsets into account.
>
> The publicly available iterators which are mostly used in legacy
> implementations and the PCI/MSI core default to MSI_DEFAULT_DOMAIN (0)
> which is the id for the existing "global" domains.
>
> No functional change.
>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
> ---
> V2: Fix the off by one so the index space is including MSI_MAX_INDEX (Kevin)
> ---
> include/linux/msi.h | 45 +++++++++++++++++++++++++++++++++++++++++----
> kernel/irq/msi.c | 43 +++++++++++++++++++++++++++++++++++--------
> 2 files changed, 76 insertions(+), 12 deletions(-)
>
> --- a/include/linux/msi.h
> +++ b/include/linux/msi.h
> @@ -181,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
> + * @__iter_max: Index to limit the search
> * @__irqdomains: Per device interrupt domains
> */
> struct msi_device_data {
> @@ -189,6 +190,7 @@ struct msi_device_data {
> struct mutex mutex;
> struct xarray __store;
> unsigned long __iter_idx;
> + unsigned long __iter_max;
> struct irq_domain *__irqdomains[MSI_MAX_DEVICE_IRQDOMAINS];
> };
>
> @@ -197,14 +199,34 @@ int msi_setup_device_data(struct device
> void msi_lock_descs(struct device *dev);
> void msi_unlock_descs(struct device *dev);
>
> -struct msi_desc *msi_first_desc(struct device *dev, enum msi_desc_filter filter);
> +struct msi_desc *msi_domain_first_desc(struct device *dev, unsigned int domid,
> + enum msi_desc_filter filter);
> +
> +/**
> + * msi_first_desc - Get the first MSI descriptor of the default irqdomain
> + * @dev: Device to operate on
> + * @filter: Descriptor state filter
> + *
> + * Must be called with the MSI descriptor mutex held, i.e. msi_lock_descs()
> + * must be invoked before the call.
> + *
> + * Return: Pointer to the first MSI descriptor matching the search
> + * criteria, NULL if none found.
> + */
> +static inline struct msi_desc *msi_first_desc(struct device *dev,
> + enum msi_desc_filter filter)
> +{
> + return msi_domain_first_desc(dev, MSI_DEFAULT_DOMAIN, filter);
> +}
> +
> struct msi_desc *msi_next_desc(struct device *dev, enum msi_desc_filter filter);
>
> /**
> - * msi_for_each_desc - Iterate the MSI descriptors
> + * msi_domain_for_each_desc - Iterate the MSI descriptors in a specific domain
> *
> * @desc: struct msi_desc pointer used as iterator
> * @dev: struct device pointer - device to iterate
> + * @domid: The id of the interrupt domain which should be walked.
> * @filter: Filter for descriptor selection
> *
> * Notes:
> @@ -212,10 +234,25 @@ struct msi_desc *msi_next_desc(struct de
> * pair.
> * - It is safe to remove a retrieved MSI descriptor in the loop.
> */
> -#define msi_for_each_desc(desc, dev, filter) \
> - for ((desc) = msi_first_desc((dev), (filter)); (desc); \
> +#define msi_domain_for_each_desc(desc, dev, domid, filter) \
> + for ((desc) = msi_domain_first_desc((dev), (domid), (filter)); (desc); \
> (desc) = msi_next_desc((dev), (filter)))
>
> +/**
> + * msi_for_each_desc - Iterate the MSI descriptors in the default irqdomain
> + *
> + * @desc: struct msi_desc pointer used as iterator
> + * @dev: struct device pointer - device to iterate
> + * @filter: Filter for descriptor selection
> + *
> + * Notes:
> + * - The loop must be protected with a msi_lock_descs()/msi_unlock_descs()
> + * pair.
> + * - It is safe to remove a retrieved MSI descriptor in the loop.
> + */
> +#define msi_for_each_desc(desc, dev, filter) \
> + msi_domain_for_each_desc((desc), (dev), MSI_DEFAULT_DOMAIN, (filter))
> +
> #define msi_desc_to_dev(desc) ((desc)->dev)
>
> #ifdef CONFIG_IRQ_MSI_IOMMU
> --- a/kernel/irq/msi.c
> +++ b/kernel/irq/msi.c
> @@ -21,6 +21,10 @@
>
> static inline int msi_sysfs_create_group(struct device *dev);
>
> +/* Invalid XA index which is outside of any searchable range */
> +#define MSI_XA_MAX_INDEX (ULONG_MAX - 1)
> +#define MSI_XA_DOMAIN_SIZE (MSI_MAX_INDEX + 1)
> +
> static inline void msi_setup_default_irqdomain(struct device *dev, struct msi_device_data *md)
> {
> if (!dev->msi.domain)
> @@ -33,6 +37,20 @@ static inline void msi_setup_default_irq
> md->__irqdomains[MSI_DEFAULT_DOMAIN] = dev->msi.domain;
> }
>
> +static int msi_get_domain_base_index(struct device *dev, unsigned int domid)
> +{
> + lockdep_assert_held(&dev->msi.data->mutex);
> +
> + if (WARN_ON_ONCE(domid >= MSI_MAX_DEVICE_IRQDOMAINS))
> + return -ENODEV;
> +
> + if (WARN_ON_ONCE(!dev->msi.data->__irqdomains[domid]))
> + return -ENODEV;
> +
> + return domid * MSI_XA_DOMAIN_SIZE;
> +}
So what I understand of this is that we split the index space into
segments, one per msi_domain_ids, MSI_XA_DOMAIN_SIZE apart.
Why didn't you decide to go all the way and have one xarray per
irqdomain? It's not that big a structure, and it would make the whole
thing a bit more straightforward.
Or do you anticipate cases where you'd walk the __store xarray across
irqdomains?
Thanks,
M.
--
Without deviation from the norm, progress is not possible.
next prev parent reply other threads:[~2022-11-24 15:46 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 [this message]
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=86r0xsmk3o.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.