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>
This commit is contained in:
parent
98aa468e04
commit
d6b0d1f705
|
@ -111,7 +111,7 @@ static unsigned int icp_hv_get_irq(void)
|
||||||
if (vec == XICS_IRQ_SPURIOUS)
|
if (vec == XICS_IRQ_SPURIOUS)
|
||||||
return NO_IRQ;
|
return NO_IRQ;
|
||||||
|
|
||||||
irq = irq_radix_revmap_lookup(xics_host, vec);
|
irq = irq_find_mapping(xics_host, vec);
|
||||||
if (likely(irq != NO_IRQ)) {
|
if (likely(irq != NO_IRQ)) {
|
||||||
xics_push_cppr(vec);
|
xics_push_cppr(vec);
|
||||||
return irq;
|
return irq;
|
||||||
|
|
|
@ -119,7 +119,7 @@ static unsigned int icp_native_get_irq(void)
|
||||||
if (vec == XICS_IRQ_SPURIOUS)
|
if (vec == XICS_IRQ_SPURIOUS)
|
||||||
return NO_IRQ;
|
return NO_IRQ;
|
||||||
|
|
||||||
irq = irq_radix_revmap_lookup(xics_host, vec);
|
irq = irq_find_mapping(xics_host, vec);
|
||||||
if (likely(irq != NO_IRQ)) {
|
if (likely(irq != NO_IRQ)) {
|
||||||
xics_push_cppr(vec);
|
xics_push_cppr(vec);
|
||||||
return irq;
|
return irq;
|
||||||
|
|
|
@ -174,10 +174,6 @@ static inline int irq_create_identity_mapping(struct irq_domain *host,
|
||||||
return irq_create_strict_mappings(host, hwirq, hwirq, 1);
|
return irq_create_strict_mappings(host, hwirq, hwirq, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
extern void irq_radix_revmap_insert(struct irq_domain *host, unsigned int virq,
|
|
||||||
irq_hw_number_t hwirq);
|
|
||||||
extern unsigned int irq_radix_revmap_lookup(struct irq_domain *host,
|
|
||||||
irq_hw_number_t hwirq);
|
|
||||||
extern unsigned int irq_linear_revmap(struct irq_domain *host,
|
extern unsigned int irq_linear_revmap(struct irq_domain *host,
|
||||||
irq_hw_number_t hwirq);
|
irq_hw_number_t hwirq);
|
||||||
|
|
||||||
|
|
|
@ -450,7 +450,7 @@ int irq_domain_associate_many(struct irq_domain *domain, unsigned int irq_base,
|
||||||
break;
|
break;
|
||||||
case IRQ_DOMAIN_MAP_TREE:
|
case IRQ_DOMAIN_MAP_TREE:
|
||||||
mutex_lock(&revmap_trees_mutex);
|
mutex_lock(&revmap_trees_mutex);
|
||||||
irq_radix_revmap_insert(domain, virq, hwirq);
|
radix_tree_insert(&domain->revmap_data.tree, hwirq, irq_data);
|
||||||
mutex_unlock(&revmap_trees_mutex);
|
mutex_unlock(&revmap_trees_mutex);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -723,64 +723,6 @@ unsigned int irq_find_mapping(struct irq_domain *domain,
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(irq_find_mapping);
|
EXPORT_SYMBOL_GPL(irq_find_mapping);
|
||||||
|
|
||||||
/**
|
|
||||||
* irq_radix_revmap_lookup() - Find a linux irq from a hw irq number.
|
|
||||||
* @domain: domain owning this hardware interrupt
|
|
||||||
* @hwirq: hardware irq number in that domain space
|
|
||||||
*
|
|
||||||
* This is a fast path, for use by irq controller code that uses radix tree
|
|
||||||
* revmaps
|
|
||||||
*/
|
|
||||||
unsigned int irq_radix_revmap_lookup(struct irq_domain *domain,
|
|
||||||
irq_hw_number_t hwirq)
|
|
||||||
{
|
|
||||||
struct irq_data *irq_data;
|
|
||||||
|
|
||||||
if (WARN_ON_ONCE(domain->revmap_type != IRQ_DOMAIN_MAP_TREE))
|
|
||||||
return irq_find_mapping(domain, hwirq);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Freeing an irq can delete nodes along the path to
|
|
||||||
* do the lookup via call_rcu.
|
|
||||||
*/
|
|
||||||
rcu_read_lock();
|
|
||||||
irq_data = radix_tree_lookup(&domain->revmap_data.tree, hwirq);
|
|
||||||
rcu_read_unlock();
|
|
||||||
|
|
||||||
/*
|
|
||||||
* If found in radix tree, then fine.
|
|
||||||
* Else fallback to linear lookup - this should not happen in practice
|
|
||||||
* as it means that we failed to insert the node in the radix tree.
|
|
||||||
*/
|
|
||||||
return irq_data ? irq_data->irq : irq_find_mapping(domain, hwirq);
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL_GPL(irq_radix_revmap_lookup);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* irq_radix_revmap_insert() - Insert a hw irq to linux irq number mapping.
|
|
||||||
* @domain: domain owning this hardware interrupt
|
|
||||||
* @virq: linux irq number
|
|
||||||
* @hwirq: hardware irq number in that domain space
|
|
||||||
*
|
|
||||||
* This is for use by irq controllers that use a radix tree reverse
|
|
||||||
* mapping for fast lookup.
|
|
||||||
*/
|
|
||||||
void irq_radix_revmap_insert(struct irq_domain *domain, unsigned int virq,
|
|
||||||
irq_hw_number_t hwirq)
|
|
||||||
{
|
|
||||||
struct irq_data *irq_data = irq_get_irq_data(virq);
|
|
||||||
|
|
||||||
if (WARN_ON(domain->revmap_type != IRQ_DOMAIN_MAP_TREE))
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (virq) {
|
|
||||||
mutex_lock(&revmap_trees_mutex);
|
|
||||||
radix_tree_insert(&domain->revmap_data.tree, hwirq, irq_data);
|
|
||||||
mutex_unlock(&revmap_trees_mutex);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL_GPL(irq_radix_revmap_insert);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* irq_linear_revmap() - Find a linux irq from a hw irq number.
|
* irq_linear_revmap() - Find a linux irq from a hw irq number.
|
||||||
* @domain: domain owning this hardware interrupt
|
* @domain: domain owning this hardware interrupt
|
||||||
|
|
Loading…
Reference in New Issue