mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-02 10:59:18 -04:00
scsi: lpfc: Fix stack trace seen while setting rrq active
Call traces have been observed running different tests that involve aborts and setting the rrq active flag. The lpfc_set_rrq_active routine is doing a mempool_alloc under the soft_irq processing level. When the mempool needs to get a new buffer from the free pool and has to wait for memory to become free it will check the flags passed in on the alloc and dump the stack if the thread is running in interrupt context. Replace the GFP_KERNEL flag with GFP_ATOMIC so that the memory allocation will not attempt to sleep if there is no mem available. Link: https://lore.kernel.org/r/20200630215001.70793-7-jsmart2021@gmail.com Signed-off-by: Dick Kennedy <dick.kennedy@broadcom.com> Signed-off-by: James Smart <jsmart2021@gmail.com> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
This commit is contained in:
committed by
Martin K. Petersen
parent
d91e3abb68
commit
9dace1fa91
@@ -45,6 +45,7 @@
|
||||
#define LPFC_MBUF_POOL_SIZE 64 /* max elements in MBUF safety pool */
|
||||
#define LPFC_MEM_POOL_SIZE 64 /* max elem in non-DMA safety pool */
|
||||
#define LPFC_DEVICE_DATA_POOL_SIZE 64 /* max elements in device data pool */
|
||||
#define LPFC_RRQ_POOL_SIZE 256 /* max elements in non-DMA pool */
|
||||
|
||||
int
|
||||
lpfc_mem_alloc_active_rrq_pool_s4(struct lpfc_hba *phba) {
|
||||
@@ -121,7 +122,7 @@ lpfc_mem_alloc(struct lpfc_hba *phba, int align)
|
||||
|
||||
if (phba->sli_rev == LPFC_SLI_REV4) {
|
||||
phba->rrq_pool =
|
||||
mempool_create_kmalloc_pool(LPFC_MEM_POOL_SIZE,
|
||||
mempool_create_kmalloc_pool(LPFC_RRQ_POOL_SIZE,
|
||||
sizeof(struct lpfc_node_rrq));
|
||||
if (!phba->rrq_pool)
|
||||
goto fail_free_nlp_mem_pool;
|
||||
|
||||
@@ -1079,7 +1079,7 @@ lpfc_set_rrq_active(struct lpfc_hba *phba, struct lpfc_nodelist *ndlp,
|
||||
goto out;
|
||||
|
||||
spin_unlock_irqrestore(&phba->hbalock, iflags);
|
||||
rrq = mempool_alloc(phba->rrq_pool, GFP_KERNEL);
|
||||
rrq = mempool_alloc(phba->rrq_pool, GFP_ATOMIC);
|
||||
if (!rrq) {
|
||||
lpfc_printf_log(phba, KERN_INFO, LOG_SLI,
|
||||
"3155 Unable to allocate RRQ xri:0x%x rxid:0x%x"
|
||||
|
||||
Reference in New Issue
Block a user