Commit 78d2e3f5 authored by lei.zhang8's avatar lei.zhang8 Committed by Lee Jones
Browse files

ANDROID: irq: put irq_resolve_mapping under protection of __irq_enter_raw



With commit 3f9d45d8
 ("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 commit
3f9d45d8.
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: 3f9d45d8 ("FROMLIST: genirq: Allow an interrupt to be marked as 'raw'")
Change-Id: I27caeaf6817e42b3c15effe8b750cb83af90aeb3
Signed-off-by: default avatarlei.zhang8 <lei.zhang8@transsion.com>
(cherry picked from commit 923b677c)
parent 71bf445d
Loading
Loading
Loading
Loading
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please to comment