ANDROID: irq: put irq_resolve_mapping under protection of __irq_enter_raw
With commit3f9d45d802
("ANDROID: genirq: Allow an interrupt to be marked as 'raw'"), irq_find_mapping was moved out of scope between irq_enter() and irq_exit(). This result in el1_irq->__handle_domain_irq-> irq_find_mapping->rcu_read_unlock->rcu_read_unlock_special-> irq_work_queue_on->el1_irq because ir_irq() return false. Now one RCU stall issue was observed due to IPI_IRQ_WORK irq storm. IPI_IRQ_WORK irq was triggered from handle_domain_irq->...-> rcu_read_unlock_special->irq_work_queue_on again and again unexpectedly due to in_irq() return false even it is in IRQ context. This patch fix its side effect without reverting commit3f9d45d802
. During call path "handle_domain_irq->irq_find_mapping->...-> rcu_read_unlock_special()" with use_softirq is true. 1)before this patch, in_irq() is false This will result in IPI_IRQ_WORK irq storm due to next IPI_IRQ_WORK irq will be triggered under IRQ context again and again. 2)after this patch,in_irq() will be true RCU_SOFTIRQ will be raised(but not next IPI_IRQ_WORK irq) under IRQ context. Bug: 339061905 Fixes:3f9d45d802
("FROMLIST: genirq: Allow an interrupt to be marked as 'raw'") Change-Id: I27caeaf6817e42b3c15effe8b750cb83af90aeb3 Signed-off-by: lei.zhang8 <lei.zhang8@transsion.com>
This commit is contained in:
parent
602a22e77a
commit
923b677c93
@ -676,8 +676,11 @@ int __handle_domain_irq(struct irq_domain *domain, unsigned int hwirq,
|
|||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
#ifdef CONFIG_IRQ_DOMAIN
|
#ifdef CONFIG_IRQ_DOMAIN
|
||||||
if (lookup)
|
if (lookup) {
|
||||||
|
__irq_enter_raw();
|
||||||
irq = irq_find_mapping(domain, hwirq);
|
irq = irq_find_mapping(domain, hwirq);
|
||||||
|
__irq_exit_raw();
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
Loading…
Reference in New Issue
Block a user