]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/commitdiff
scsi: lpfc: Fix stack trace seen while setting rrq active
authorDick Kennedy <dick.kennedy@broadcom.com>
Tue, 30 Jun 2020 21:49:53 +0000 (14:49 -0700)
committerMartin K. Petersen <martin.petersen@oracle.com>
Fri, 3 Jul 2020 03:06:37 +0000 (23:06 -0400)
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>
drivers/scsi/lpfc/lpfc_mem.c
drivers/scsi/lpfc/lpfc_sli.c

index 726f6619230fda193a434323a800cc552d7ed383..e8c0066eb4aaf0845f3ad5ed4323e2b31f2bcce6 100644 (file)
@@ -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;
index cefc3cbb69ae7434856b33e35c6aa72745cce36f..88e78ff5e0c18808a0c77295c453d455d0f5fba9 100644 (file)
@@ -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"