* [PATCH v2 0/1] um: MSI parent domain conversion @ 2025-06-30 6:51 Nam Cao 2025-06-30 6:51 ` [PATCH v2 1/1] um: virt-pci: Switch to msi_create_parent_irq_domain() Nam Cao 0 siblings, 1 reply; 6+ messages in thread From: Nam Cao @ 2025-06-30 6:51 UTC (permalink / raw) To: Marc Zyngier, Thomas Gleixner, Richard Weinberger, Anton Ivanov, Johannes Berg, linux-um, linux-kernel Cc: Nam Cao The initial implementation of PCI/MSI interrupt domains in the hierarchical interrupt domain model used a shortcut by providing a global PCI/MSI domain. This works because the PCI/MSI[X] hardware is standardized and uniform, but it violates the basic design principle of hierarchical interrupt domains: Each hardware block involved in the interrupt delivery chain should have a separate interrupt domain. For PCI/MSI[X], the interrupt controller is per PCI device and not a global made-up entity. Unsurprisingly, the shortcut turned out to have downsides as it does not allow dynamic allocation of interrupt vectors after initialization and it prevents supporting IMS on PCI. For further details, see: https://lore.kernel.org/lkml/20221111120501.026511281@linutronix.de/ The solution is implementing per device MSI domains, this means the entities which provide global PCI/MSI domain so far have to implement MSI parent domain functionality instead. This series converts the um's driver to implement MSI parent domain. arch/um/drivers/Kconfig | 1 + arch/um/drivers/virt-pci.c | 45 +++++++++++++++++++------------------- 2 files changed, 23 insertions(+), 23 deletions(-) -- 2.39.5 ^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH v2 1/1] um: virt-pci: Switch to msi_create_parent_irq_domain() 2025-06-30 6:51 [PATCH v2 0/1] um: MSI parent domain conversion Nam Cao @ 2025-06-30 6:51 ` Nam Cao 2025-06-30 6:55 ` Johannes Berg 0 siblings, 1 reply; 6+ messages in thread From: Nam Cao @ 2025-06-30 6:51 UTC (permalink / raw) To: Marc Zyngier, Thomas Gleixner, Richard Weinberger, Anton Ivanov, Johannes Berg, linux-um, linux-kernel Cc: Nam Cao Move away from the legacy MSI domain setup, switch to use msi_create_parent_irq_domain(). Signed-off-by: Nam Cao <namcao@linutronix.de> --- v2: Remove MSI_FLAG_PCI_MSI_MASK_PARENT to fix a NULL pointer deref --- arch/um/drivers/Kconfig | 1 + arch/um/drivers/virt-pci.c | 45 +++++++++++++++++++------------------- 2 files changed, 23 insertions(+), 23 deletions(-) diff --git a/arch/um/drivers/Kconfig b/arch/um/drivers/Kconfig index 34085bfc6d416..6a0354ca032fb 100644 --- a/arch/um/drivers/Kconfig +++ b/arch/um/drivers/Kconfig @@ -160,6 +160,7 @@ config UML_RTC config UML_PCI bool select FORCE_PCI + select IRQ_MSI_LIB select UML_IOMEM_EMULATION select UML_DMA_EMULATION select PCI_MSI diff --git a/arch/um/drivers/virt-pci.c b/arch/um/drivers/virt-pci.c index 0fe207ca4b72e..557d93aea00a1 100644 --- a/arch/um/drivers/virt-pci.c +++ b/arch/um/drivers/virt-pci.c @@ -7,6 +7,7 @@ #include <linux/pci.h> #include <linux/logic_iomem.h> #include <linux/of_platform.h> +#include <linux/irqchip/irq-msi-lib.h> #include <linux/irqdomain.h> #include <linux/msi.h> #include <linux/unaligned.h> @@ -29,7 +30,6 @@ static struct um_pci_device *um_pci_platform_device; static struct um_pci_device_reg um_pci_devices[MAX_DEVICES]; static struct fwnode_handle *um_pci_fwnode; static struct irq_domain *um_pci_inner_domain; -static struct irq_domain *um_pci_msi_domain; static unsigned long um_pci_msi_used[BITS_TO_LONGS(MAX_MSI_VECTORS)]; static unsigned long um_pci_cfgspace_read(void *priv, unsigned int offset, @@ -400,21 +400,24 @@ static void um_pci_inner_domain_free(struct irq_domain *domain, } static const struct irq_domain_ops um_pci_inner_domain_ops = { + .select = msi_lib_irq_domain_select, .alloc = um_pci_inner_domain_alloc, .free = um_pci_inner_domain_free, }; -static struct irq_chip um_pci_msi_irq_chip = { - .name = "UM virtual PCIe MSI", - .irq_mask = pci_msi_mask_irq, - .irq_unmask = pci_msi_unmask_irq, -}; - -static struct msi_domain_info um_pci_msi_domain_info = { - .flags = MSI_FLAG_USE_DEF_DOM_OPS | - MSI_FLAG_USE_DEF_CHIP_OPS | - MSI_FLAG_PCI_MSIX, - .chip = &um_pci_msi_irq_chip, +#define UM_PCI_MSI_FLAGS_REQUIRED (MSI_FLAG_USE_DEF_DOM_OPS | \ + MSI_FLAG_USE_DEF_CHIP_OPS | \ + MSI_FLAG_NO_AFFINITY) +#define UM_PCI_MSI_FLAGS_SUPPORTED (MSI_GENERIC_FLAGS_MASK | \ + MSI_FLAG_PCI_MSIX) + +static const struct msi_parent_ops um_pci_msi_parent_ops = { + .required_flags = UM_PCI_MSI_FLAGS_REQUIRED, + .supported_flags = UM_PCI_MSI_FLAGS_SUPPORTED, + .bus_select_token = DOMAIN_BUS_NEXUS, + .bus_select_mask = MATCH_PCI_MSI, + .prefix = "UM-virtual-", + .init_dev_msi_info = msi_lib_init_dev_msi_info, }; static struct resource busn_resource = { @@ -559,17 +562,14 @@ static int __init um_pci_init(void) goto free; } - um_pci_inner_domain = irq_domain_create_linear(um_pci_fwnode, MAX_MSI_VECTORS, - &um_pci_inner_domain_ops, NULL); - if (!um_pci_inner_domain) { - err = -ENOMEM; - goto free; - } + struct irq_domain_info info = { + .fwnode = um_pci_fwnode, + .ops = &um_pci_inner_domain_ops, + .size = MAX_MSI_VECTORS, + }; - um_pci_msi_domain = pci_msi_create_irq_domain(um_pci_fwnode, - &um_pci_msi_domain_info, - um_pci_inner_domain); - if (!um_pci_msi_domain) { + um_pci_inner_domain = msi_create_parent_irq_domain(&info, &um_pci_msi_parent_ops); + if (!um_pci_inner_domain) { err = -ENOMEM; goto free; } @@ -611,7 +611,6 @@ device_initcall(um_pci_init); static void __exit um_pci_exit(void) { - irq_domain_remove(um_pci_msi_domain); irq_domain_remove(um_pci_inner_domain); pci_free_resource_list(&bridge->windows); pci_free_host_bridge(bridge); -- 2.39.5 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH v2 1/1] um: virt-pci: Switch to msi_create_parent_irq_domain() 2025-06-30 6:51 ` [PATCH v2 1/1] um: virt-pci: Switch to msi_create_parent_irq_domain() Nam Cao @ 2025-06-30 6:55 ` Johannes Berg 2025-06-30 7:02 ` Nam Cao 0 siblings, 1 reply; 6+ messages in thread From: Johannes Berg @ 2025-06-30 6:55 UTC (permalink / raw) To: Nam Cao, Marc Zyngier, Thomas Gleixner, Richard Weinberger, Anton Ivanov, linux-um, linux-kernel On Mon, 2025-06-30 at 08:51 +0200, Nam Cao wrote: > Move away from the legacy MSI domain setup, switch to use > msi_create_parent_irq_domain(). > Do you want this to go through the UML tree, or is it a dependency somewhere else? In the latter case, I suppose you can add Acked-by: Johannes Berg <johannes@sipsolutions.net> Tested-by: Johannes Berg <johannes@sipsolutions.net> johannes ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v2 1/1] um: virt-pci: Switch to msi_create_parent_irq_domain() 2025-06-30 6:55 ` Johannes Berg @ 2025-06-30 7:02 ` Nam Cao 2025-07-03 16:39 ` Thomas Gleixner 0 siblings, 1 reply; 6+ messages in thread From: Nam Cao @ 2025-06-30 7:02 UTC (permalink / raw) To: Johannes Berg Cc: Marc Zyngier, Thomas Gleixner, Richard Weinberger, Anton Ivanov, linux-um, linux-kernel On Mon, Jun 30, 2025 at 08:55:54AM +0200, Johannes Berg wrote: > On Mon, 2025-06-30 at 08:51 +0200, Nam Cao wrote: > > Move away from the legacy MSI domain setup, switch to use > > msi_create_parent_irq_domain(). > > > > Do you want this to go through the UML tree, or is it a dependency > somewhere else? In the latter case, I suppose you can add Please take it into the UML tree. > Acked-by: Johannes Berg <johannes@sipsolutions.net> > Tested-by: Johannes Berg <johannes@sipsolutions.net> Thanks! Nam ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v2 1/1] um: virt-pci: Switch to msi_create_parent_irq_domain() 2025-06-30 7:02 ` Nam Cao @ 2025-07-03 16:39 ` Thomas Gleixner 2025-07-04 12:00 ` Johannes Berg 0 siblings, 1 reply; 6+ messages in thread From: Thomas Gleixner @ 2025-07-03 16:39 UTC (permalink / raw) To: Nam Cao, Johannes Berg Cc: Marc Zyngier, Richard Weinberger, Anton Ivanov, linux-um, linux-kernel Johannes, On Mon, Jun 30 2025 at 09:02, Nam Cao wrote: > On Mon, Jun 30, 2025 at 08:55:54AM +0200, Johannes Berg wrote: >> On Mon, 2025-06-30 at 08:51 +0200, Nam Cao wrote: >> > Move away from the legacy MSI domain setup, switch to use >> > msi_create_parent_irq_domain(). >> > >> >> Do you want this to go through the UML tree, or is it a dependency >> somewhere else? In the latter case, I suppose you can add > > Please take it into the UML tree. > >> Acked-by: Johannes Berg <johannes@sipsolutions.net> >> Tested-by: Johannes Berg <johannes@sipsolutions.net> are you picking this up or want me to queue it? Thanks, tglx ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v2 1/1] um: virt-pci: Switch to msi_create_parent_irq_domain() 2025-07-03 16:39 ` Thomas Gleixner @ 2025-07-04 12:00 ` Johannes Berg 0 siblings, 0 replies; 6+ messages in thread From: Johannes Berg @ 2025-07-04 12:00 UTC (permalink / raw) To: Thomas Gleixner, Nam Cao Cc: Marc Zyngier, Richard Weinberger, Anton Ivanov, linux-um, linux-kernel On Thu, 2025-07-03 at 18:39 +0200, Thomas Gleixner wrote: > Johannes, > > On Mon, Jun 30 2025 at 09:02, Nam Cao wrote: > > On Mon, Jun 30, 2025 at 08:55:54AM +0200, Johannes Berg wrote: > > > On Mon, 2025-06-30 at 08:51 +0200, Nam Cao wrote: > > > > Move away from the legacy MSI domain setup, switch to use > > > > msi_create_parent_irq_domain(). > > > > > > > > > > Do you want this to go through the UML tree, or is it a dependency > > > somewhere else? In the latter case, I suppose you can add > > > > Please take it into the UML tree. > > > > > Acked-by: Johannes Berg <johannes@sipsolutions.net> > > > Tested-by: Johannes Berg <johannes@sipsolutions.net> > > are you picking this up or want me to queue it? I've picked it up for uml-next now: https://git.kernel.org/pub/scm/linux/kernel/git/uml/linux.git/commit/?h=next&id=1528fd400c62b84b9c0e368a62b83fbd9d6fb92b johannes ^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2025-07-04 12:00 UTC | newest] Thread overview: 6+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2025-06-30 6:51 [PATCH v2 0/1] um: MSI parent domain conversion Nam Cao 2025-06-30 6:51 ` [PATCH v2 1/1] um: virt-pci: Switch to msi_create_parent_irq_domain() Nam Cao 2025-06-30 6:55 ` Johannes Berg 2025-06-30 7:02 ` Nam Cao 2025-07-03 16:39 ` Thomas Gleixner 2025-07-04 12:00 ` Johannes Berg
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).