qcacmn: Release lock while allocating pfrm request

pfrm_request_irq() calls kmem_cache_alloc() which
needs to be called in a non-atomic context since
it can sleep.

The current call to pfrm_request_irq() is done
within a spinlock which disables preemption and
leads to sleep in an atomic context.

Avoid calling pfrm_request_irq() within atomic
context

CRs-Fixed: 2913515
Change-Id: Ic2b0a23360d4d2b753658499343f72bfb67ad82d
This commit is contained in:
Aditya Sathish
2021-05-03 17:04:15 +05:30
committed by Madan Koyyalamudi
父節點 7cd924cef5
當前提交 13764f2b16

查看文件

@@ -358,11 +358,13 @@ int hif_ahb_configure_grp_irq(struct hif_softc *scn,
hif_ext_group->os_irq[j] = irq;
}
qdf_spin_lock_irqsave(&hif_ext_group->irq_lock);
for (j = 0; j < hif_ext_group->numirq; j++) {
irq = hif_ext_group->os_irq[j];
qdf_spin_lock_irqsave(&hif_ext_group->irq_lock);
qdf_dev_set_irq_status_flags(irq, QDF_IRQ_DISABLE_UNLAZY);
qdf_spin_unlock_irqrestore(&hif_ext_group->irq_lock);
ret = pfrm_request_irq(scn->qdf_dev->dev,
irq, hif_ext_group_interrupt_handler,
IRQF_TRIGGER_RISING,
@@ -374,13 +376,11 @@ int hif_ahb_configure_grp_irq(struct hif_softc *scn,
goto end;
}
}
qdf_spin_unlock_irqrestore(&hif_ext_group->irq_lock);
qdf_spin_lock_irqsave(&hif_ext_group->irq_lock);
hif_ext_group->irq_requested = true;
end:
qdf_spin_unlock_irqrestore(&hif_ext_group->irq_lock);
end:
return ret;
}