| From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 |
| From: James Smart <jsmart2021@gmail.com> |
| Date: Wed, 14 Aug 2019 16:56:31 -0700 |
| Subject: [PATCH 7/8] scsi: lpfc: Limit xri count for kdump environment |
| |
| scsi-mq operation inherently performs pre-allocation of resources for |
| blk-mq request queues. Even though the kdump environment reduces the |
| configuration to a single CPU, thus 1 hardware queue, which helps |
| significantly, the resources are still rather large due to the per request |
| allocations. blk-mq pre-allocations can be over 4KB per request. With |
| adapter can_queue values in the 4k or 8k range, this can easily be 32MBs |
| before any other driver memory is factored in. Driver SGL DMA buffer |
| allocation can be up to 8KB per request as well adding an additional |
| 64MB. Totals are well over 100MB for a single shost. Given kdump memory |
| auto-sizing utilities don't accommodate this amount of memory well, it's |
| very possible for kdump to fail due to lack of memory. |
| |
| Fix by having the driver recognize that it is booting within a kdump |
| context and reduce the number of requests it will support to a more |
| reasonable value. |
| |
| 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> |
| (cherry picked from commit 31f06d2e73726160645f8d9976a0b3f42e136da7) |
| Signed-off-by: Joel Stanley <joel@jms.id.au> |
| --- |
| drivers/scsi/lpfc/lpfc_init.c | 5 +++++ |
| 1 file changed, 5 insertions(+) |
| |
| diff --git a/drivers/scsi/lpfc/lpfc_init.c b/drivers/scsi/lpfc/lpfc_init.c |
| index a5b515fdda2e..7edbba7debc2 100644 |
| --- a/drivers/scsi/lpfc/lpfc_init.c |
| +++ b/drivers/scsi/lpfc/lpfc_init.c |
| @@ -39,6 +39,7 @@ |
| #include <linux/msi.h> |
| #include <linux/irq.h> |
| #include <linux/bitops.h> |
| +#include <linux/crash_dump.h> |
| |
| #include <scsi/scsi.h> |
| #include <scsi/scsi_device.h> |
| @@ -8309,6 +8310,10 @@ lpfc_sli4_read_config(struct lpfc_hba *phba) |
| bf_get(lpfc_mbx_rd_conf_extnts_inuse, rd_config); |
| phba->sli4_hba.max_cfg_param.max_xri = |
| bf_get(lpfc_mbx_rd_conf_xri_count, rd_config); |
| + /* Reduce resource usage in kdump environment */ |
| + if (is_kdump_kernel() && |
| + phba->sli4_hba.max_cfg_param.max_xri > 512) |
| + phba->sli4_hba.max_cfg_param.max_xri = 512; |
| phba->sli4_hba.max_cfg_param.xri_base = |
| bf_get(lpfc_mbx_rd_conf_xri_base, rd_config); |
| phba->sli4_hba.max_cfg_param.max_vpi = |