diff options
| author | Grant Likely <grant.likely@secretlab.ca> | 2012-06-04 01:04:37 -0400 |
|---|---|---|
| committer | Grant Likely <grant.likely@secretlab.ca> | 2012-07-11 11:16:00 -0400 |
| commit | d6b0d1f7058f7cf818138cd7fd116dca3f3576d9 (patch) | |
| tree | 77badaee27c21a63f5de73b7b4483824208245ec | |
| parent | 98aa468e045a0091a7c34d9f5205a629634fabf4 (diff) | |
irqdomain: Eliminate dedicated radix lookup functions
In preparation to remove the slow revmap path, eliminate the public
radix revmap lookup functions. This simplifies the code and makes the
slowpath removal patch a lot simpler.
Signed-off-by: Grant Likely <grant.likely@secretlab.ca>
Cc: Paul Mundt <lethal@linux-sh.org>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Rob Herring <rob.herring@calxeda.com>
| -rw-r--r-- | arch/powerpc/sysdev/xics/icp-hv.c | 2 | ||||
| -rw-r--r-- | arch/powerpc/sysdev/xics/icp-native.c | 2 | ||||
| -rw-r--r-- | include/linux/irqdomain.h | 4 | ||||
| -rw-r--r-- | kernel/irq/irqdomain.c | 60 |
4 files changed, 3 insertions, 65 deletions
diff --git a/arch/powerpc/sysdev/xics/icp-hv.c b/arch/powerpc/sysdev/xics/icp-hv.c index 253dce98c16e..14469cf9df68 100644 --- a/arch/powerpc/sysdev/xics/icp-hv.c +++ b/arch/powerpc/sysdev/xics/icp-hv.c | |||
| @@ -111,7 +111,7 @@ static unsigned int icp_hv_get_irq(void) | |||
| 111 | if (vec == XICS_IRQ_SPURIOUS) | 111 | if (vec == XICS_IRQ_SPURIOUS) |
| 112 | return NO_IRQ; | 112 | return NO_IRQ; |
| 113 | 113 | ||
| 114 | irq = irq_radix_revmap_lookup(xics_host, vec); | 114 | irq = irq_find_mapping(xics_host, vec); |
| 115 | if (likely(irq != NO_IRQ)) { | 115 | if (likely(irq != NO_IRQ)) { |
| 116 | xics_push_cppr(vec); | 116 | xics_push_cppr(vec); |
| 117 | return irq; | 117 | return irq; |
diff --git a/arch/powerpc/sysdev/xics/icp-native.c b/arch/powerpc/sysdev/xics/icp-native.c index 4c79b6fbee1c..48861d3fcd07 100644 --- a/arch/powerpc/sysdev/xics/icp-native.c +++ b/arch/powerpc/sysdev/xics/icp-native.c | |||
| @@ -119,7 +119,7 @@ static unsigned int icp_native_get_irq(void) | |||
| 119 | if (vec == XICS_IRQ_SPURIOUS) | 119 | if (vec == XICS_IRQ_SPURIOUS) |
| 120 | return NO_IRQ; | 120 | return NO_IRQ; |
| 121 | 121 | ||
| 122 | irq = irq_radix_revmap_lookup(xics_host, vec); | 122 | irq = irq_find_mapping(xics_host, vec); |
| 123 | if (likely(irq != NO_IRQ)) { | 123 | if (likely(irq != NO_IRQ)) { |
| 124 | xics_push_cppr(vec); | 124 | xics_push_cppr(vec); |
| 125 | return irq; | 125 | return irq; |
diff --git a/include/linux/irqdomain.h b/include/linux/irqdomain.h index eab8a0e60b8e..0d5b17bf5e51 100644 --- a/include/linux/irqdomain.h +++ b/include/linux/irqdomain.h | |||
| @@ -174,10 +174,6 @@ static inline int irq_create_identity_mapping(struct irq_domain *host, | |||
| 174 | return irq_create_strict_mappings(host, hwirq, hwirq, 1); | 174 | return irq_create_strict_mappings(host, hwirq, hwirq, 1); |
| 175 | } | 175 | } |
| 176 | 176 | ||
| 177 | extern void irq_radix_revmap_insert(struct irq_domain *host, unsigned int virq, | ||
| 178 | irq_hw_number_t hwirq); | ||
| 179 | extern unsigned int irq_radix_revmap_lookup(struct irq_domain *host, | ||
| 180 | irq_hw_number_t hwirq); | ||
| 181 | extern unsigned int irq_linear_revmap(struct irq_domain *host, | 177 | extern unsigned int irq_linear_revmap(struct irq_domain *host, |
| 182 | irq_hw_number_t hwirq); | 178 | irq_hw_number_t hwirq); |
| 183 | 179 | ||
diff --git a/kernel/irq/irqdomain.c b/kernel/irq/irqdomain.c index a07d92446b66..f540bb1eff84 100644 --- a/kernel/irq/irqdomain.c +++ b/kernel/irq/irqdomain.c | |||
| @@ -450,7 +450,7 @@ int irq_domain_associate_many(struct irq_domain *domain, unsigned int irq_base, | |||
| 450 | break; | 450 | break; |
| 451 | case IRQ_DOMAIN_MAP_TREE: | 451 | case IRQ_DOMAIN_MAP_TREE: |
| 452 | mutex_lock(&revmap_trees_mutex); | 452 | mutex_lock(&revmap_trees_mutex); |
| 453 | irq_radix_revmap_insert(domain, virq, hwirq); | 453 | radix_tree_insert(&domain->revmap_data.tree, hwirq, irq_data); |
| 454 | mutex_unlock(&revmap_trees_mutex); | 454 | mutex_unlock(&revmap_trees_mutex); |
| 455 | break; | 455 | break; |
| 456 | } | 456 | } |
| @@ -724,64 +724,6 @@ unsigned int irq_find_mapping(struct irq_domain *domain, | |||
| 724 | EXPORT_SYMBOL_GPL(irq_find_mapping); | 724 | EXPORT_SYMBOL_GPL(irq_find_mapping); |
| 725 | 725 | ||
| 726 | /** | 726 | /** |
| 727 | * irq_radix_revmap_lookup() - Find a linux irq from a hw irq number. | ||
| 728 | * @domain: domain owning this hardware interrupt | ||
| 729 | * @hwirq: hardware irq number in that domain space | ||
| 730 | * | ||
| 731 | * This is a fast path, for use by irq controller code that uses radix tree | ||
| 732 | * revmaps | ||
| 733 | */ | ||
| 734 | unsigned int irq_radix_revmap_lookup(struct irq_domain *domain, | ||
| 735 | irq_hw_number_t hwirq) | ||
| 736 | { | ||
| 737 | struct irq_data *irq_data; | ||
| 738 | |||
| 739 | if (WARN_ON_ONCE(domain->revmap_type != IRQ_DOMAIN_MAP_TREE)) | ||
| 740 | return irq_find_mapping(domain, hwirq); | ||
| 741 | |||
| 742 | /* | ||
| 743 | * Freeing an irq can delete nodes along the path to | ||
| 744 | * do the lookup via call_rcu. | ||
| 745 | */ | ||
| 746 | rcu_read_lock(); | ||
| 747 | irq_data = radix_tree_lookup(&domain->revmap_data.tree, hwirq); | ||
| 748 | rcu_read_unlock(); | ||
| 749 | |||
| 750 | /* | ||
| 751 | * If found in radix tree, then fine. | ||
| 752 | * Else fallback to linear lookup - this should not happen in practice | ||
| 753 | * as it means that we failed to insert the node in the radix tree. | ||
| 754 | */ | ||
| 755 | return irq_data ? irq_data->irq : irq_find_mapping(domain, hwirq); | ||
| 756 | } | ||
| 757 | EXPORT_SYMBOL_GPL(irq_radix_revmap_lookup); | ||
| 758 | |||
| 759 | /** | ||
| 760 | * irq_radix_revmap_insert() - Insert a hw irq to linux irq number mapping. | ||
| 761 | * @domain: domain owning this hardware interrupt | ||
| 762 | * @virq: linux irq number | ||
| 763 | * @hwirq: hardware irq number in that domain space | ||
| 764 | * | ||
| 765 | * This is for use by irq controllers that use a radix tree reverse | ||
| 766 | * mapping for fast lookup. | ||
| 767 | */ | ||
| 768 | void irq_radix_revmap_insert(struct irq_domain *domain, unsigned int virq, | ||
| 769 | irq_hw_number_t hwirq) | ||
| 770 | { | ||
| 771 | struct irq_data *irq_data = irq_get_irq_data(virq); | ||
| 772 | |||
| 773 | if (WARN_ON(domain->revmap_type != IRQ_DOMAIN_MAP_TREE)) | ||
| 774 | return; | ||
| 775 | |||
| 776 | if (virq) { | ||
| 777 | mutex_lock(&revmap_trees_mutex); | ||
| 778 | radix_tree_insert(&domain->revmap_data.tree, hwirq, irq_data); | ||
| 779 | mutex_unlock(&revmap_trees_mutex); | ||
| 780 | } | ||
| 781 | } | ||
| 782 | EXPORT_SYMBOL_GPL(irq_radix_revmap_insert); | ||
| 783 | |||
| 784 | /** | ||
| 785 | * irq_linear_revmap() - Find a linux irq from a hw irq number. | 727 | * irq_linear_revmap() - Find a linux irq from a hw irq number. |
| 786 | * @domain: domain owning this hardware interrupt | 728 | * @domain: domain owning this hardware interrupt |
| 787 | * @hwirq: hardware irq number in that domain space | 729 | * @hwirq: hardware irq number in that domain space |
