FAILED: patch "[PATCH] irqdomain: Look for existing mapping only once" failed to apply to 4.19-stable tree
Subsystems (3)
[email protected]
maintainerThe patch below does not apply to the 4.19-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
To reproduce the conflict and resubmit, you may use the following commands:
git fetch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ linux-4.19.y
git checkout FETCH_HEAD
git cherry-pick -x 6e6f75c9c98d2d246d90411ff2b6f0cd271f4cba
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '[email protected]' --subject-prefix 'PATCH 4.19.y' HEAD^..
Possible dependencies:
6e6f75c9c98d ("irqdomain: Look for existing mapping only once")a359f757965a ("irq: Fix typos in comments")bb4c6910c8b4 ("genirq/irqdomain: Add an irq_create_mapping_affinity() function") baedb87d1b53 ("genirq/affinity: Handle affinity setting on inactive interrupts correctly") ef8c01eb64ca ("irqchip: Add Loongson PCH PIC controller")818e915fbac5 ("irqchip: Add Loongson HyperTransport Vector support")d71e064449a7 ("Merge tag 'mips_5.7' of git://git.kernel.org/pub/scm/linux/kernel/git/mips/linux")
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 6e6f75c9c98d2d246d90411ff2b6f0cd271f4cba Mon Sep 17 00:00:00 2001
From: Johan Hovold <[email protected]>
Date: Mon, 13 Feb 2023 11:42:46 +0100
Subject: [PATCH] irqdomain: Look for existing mapping only once
Avoid looking for an existing mapping twice when creating a new mapping using irq_create_fwspec_mapping() by factoring out the actual allocation which is shared with irq_create_mapping_affinity().
The new helper function will also be used to fix a shared-interrupt mapping race, hence the Fixes tag.
kernel/irq/irqdomain.c +33 -27
@@ -682,6 +682,34 @@ unsigned int irq_create_direct_mapping(struct irq_domain *domain)EXPORT_SYMBOL_GPL (irq_create_direct_mapping);#endif +static unsigned int __irq_create_mapping_affinity (struct irq_domain *domain, +irq_hw_number_t hwirq, +const struct irq_affinity_desc *affinity) +{ +struct device_node *of_node =irq_domain_get_of_node (domain); +int virq; + +pr_debug ("irq_create_mapping(0x%p, 0x%lx)\n" , domain, hwirq); + +/* Allocate a virtual interrupt number */ + virq =irq_domain_alloc_descs (-1 ,1 , hwirq,of_node_to_nid (of_node), + affinity); +if (virq <=0 ) { +pr_debug ("-> virq allocation failed\n" ); +return 0 ; + } + +if (irq_domain_associate (domain, virq, hwirq)) { +irq_free_desc (virq); +return 0 ; + } + +pr_debug ("irq %lu on domain %s mapped to virtual irq %u\n" , + hwirq,of_node_full_name (of_node), virq); + +return virq; +} +/** * irq_create_mapping_affinity() - Map a hardware interrupt into linux irq space * @domain: domain owning this hardware interrupt or NULL for default domain
@@ -694,14 +722,11 @@ EXPORT_SYMBOL_GPL(irq_create_direct_mapping);* on the number returned from that call. */ unsigned int irq_create_mapping_affinity (struct irq_domain *domain, -irq_hw_number_t hwirq, -const struct irq_affinity_desc *affinity) +irq_hw_number_t hwirq, +const struct irq_affinity_desc *affinity) { -struct device_node *of_node;int virq; -pr_debug ("irq_create_mapping(0x%p, 0x%lx)\n" , domain, hwirq); -/* Look for default domain if necessary */ if (domain ==NULL ) domain = irq_default_domain;
@@ -709,34 +734,15 @@ unsigned int irq_create_mapping_affinity(struct irq_domain *domain,WARN (1 ,"%s(, %lx) called with NULL domain\n" , __func__, hwirq);return 0 ; } -pr_debug ("-> using domain @%p\n" , domain); - - of_node =irq_domain_get_of_node (domain);/* Check if mapping already exists */ virq =irq_find_mapping (domain, hwirq);if (virq) { -pr_debug ("-> existing mapping on virq %d\n" , virq); +pr_debug ("existing mapping on virq %d\n" , virq);return virq; } -/* Allocate a virtual interrupt number */ - virq =irq_domain_alloc_descs (-1 ,1 , hwirq,of_node_to_nid (of_node), - affinity); -if (virq <=0 ) { -pr_debug ("-> virq allocation failed\n" ); -return 0 ; - } - -if (irq_domain_associate (domain, virq, hwirq)) { -irq_free_desc (virq); -return 0 ; - } - -pr_debug ("irq %lu on domain %s mapped to virtual irq %u\n" , - hwirq,of_node_full_name (of_node), virq); - -return virq; +return __irq_create_mapping_affinity (domain, hwirq, affinity); }EXPORT_SYMBOL_GPL (irq_create_mapping_affinity);
@@ -841,7 +847,7 @@ unsigned int irq_create_fwspec_mapping(struct irq_fwspec *fwspec)return 0 ; }else {/* Create mapping */ - virq =irq_create_mapping (domain, hwirq); + virq =__irq_create_mapping_affinity (domain, hwirq,NULL );if (!virq)return virq; }