This patch will reduce memory footprints of megaraid_sas driver when booted in 
kdump mode.
Driver will not allocate memory for optional and perfromance oriented features.
Below are key changes done in megaraid_sas driver to do this-
1. Limit Controller's queue depth to 100 in kdump mode.
2. Do not allocate memory for system info buffer and PD info buffer.
3. Disable performance oriented features e.g. Disable RDPQ mode, disable dual 
queue depth,
   restrict to single MSI-x vector. 

Signed-off-by: Sumit Saxena <sumit.sax...@broadcom.com>
---
 drivers/scsi/megaraid/megaraid_sas.h        |  2 ++
 drivers/scsi/megaraid/megaraid_sas_base.c   | 48 +++++++++++++++++------------
 drivers/scsi/megaraid/megaraid_sas_fusion.c |  3 ++
 3 files changed, 34 insertions(+), 19 deletions(-)

diff --git a/drivers/scsi/megaraid/megaraid_sas.h 
b/drivers/scsi/megaraid/megaraid_sas.h
index fce414a..1784b09 100644
--- a/drivers/scsi/megaraid/megaraid_sas.h
+++ b/drivers/scsi/megaraid/megaraid_sas.h
@@ -1344,6 +1344,8 @@ struct megasas_ctrl_info {
 #define SCAN_PD_CHANNEL        0x1
 #define SCAN_VD_CHANNEL        0x2
 
+#define MEGASAS_KDUMP_QUEUE_DEPTH               100
+
 enum MR_SCSI_CMD_TYPE {
        READ_WRITE_LDIO = 0,
        NON_READ_WRITE_LDIO = 1,
diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c 
b/drivers/scsi/megaraid/megaraid_sas_base.c
index e6ebc7a..8588202 100644
--- a/drivers/scsi/megaraid/megaraid_sas_base.c
+++ b/drivers/scsi/megaraid/megaraid_sas_base.c
@@ -5761,13 +5761,6 @@ static int megasas_probe_one(struct pci_dev *pdev,
                break;
        }
 
-       instance->system_info_buf = pci_zalloc_consistent(pdev,
-                                       sizeof(struct MR_DRV_SYSTEM_INFO),
-                                       &instance->system_info_h);
-
-       if (!instance->system_info_buf)
-               dev_info(&instance->pdev->dev, "Can't allocate system info 
buffer\n");
-
        /* Crash dump feature related initialisation*/
        instance->drv_buf_index = 0;
        instance->drv_buf_alloc = 0;
@@ -5777,14 +5770,6 @@ static int megasas_probe_one(struct pci_dev *pdev,
        spin_lock_init(&instance->crashdump_lock);
        instance->crash_dump_buf = NULL;
 
-       if (!reset_devices)
-               instance->crash_dump_buf = pci_alloc_consistent(pdev,
-                                               CRASH_DMA_BUF_SIZE,
-                                               &instance->crash_dump_h);
-       if (!instance->crash_dump_buf)
-               dev_err(&pdev->dev, "Can't allocate Firmware "
-                       "crash dump DMA buffer\n");
-
        megasas_poll_wait_aen = 0;
        instance->flag_ieee = 0;
        instance->ev = NULL;
@@ -5803,11 +5788,26 @@ static int megasas_probe_one(struct pci_dev *pdev,
                goto fail_alloc_dma_buf;
        }
 
-       instance->pd_info = pci_alloc_consistent(pdev,
-               sizeof(struct MR_PD_INFO), &instance->pd_info_h);
+       if (!reset_devices) {
+               instance->system_info_buf = pci_zalloc_consistent(pdev,
+                                       sizeof(struct MR_DRV_SYSTEM_INFO),
+                                       &instance->system_info_h);
+               if (!instance->system_info_buf)
+                       dev_info(&instance->pdev->dev, "Can't allocate system 
info buffer\n");
+
+               instance->pd_info = pci_alloc_consistent(pdev,
+                       sizeof(struct MR_PD_INFO), &instance->pd_info_h);
 
-       if (!instance->pd_info)
-               dev_err(&instance->pdev->dev, "Failed to alloc mem for 
pd_info\n");
+               if (!instance->pd_info)
+                       dev_err(&instance->pdev->dev, "Failed to alloc mem for 
pd_info\n");
+
+               instance->crash_dump_buf = pci_alloc_consistent(pdev,
+                                               CRASH_DMA_BUF_SIZE,
+                                               &instance->crash_dump_h);
+               if (!instance->crash_dump_buf)
+                       dev_err(&pdev->dev, "Can't allocate Firmware "
+                               "crash dump DMA buffer\n");
+       }
 
        /*
         * Initialize locks and queues
@@ -7174,6 +7174,16 @@ static int __init megasas_init(void)
        int rval;
 
        /*
+        * Booted in kdump kernel, minimize memory footprints by
+        * disabling few features
+        */
+       if (reset_devices) {
+               msix_vectors = 1;
+               rdpq_enable = 0;
+               dual_qdepth_disable = 1;
+       }
+
+       /*
         * Announce driver version and other information
         */
        pr_info("megasas: %s\n", MEGASAS_VERSION);
diff --git a/drivers/scsi/megaraid/megaraid_sas_fusion.c 
b/drivers/scsi/megaraid/megaraid_sas_fusion.c
index 98a848b..320c1a0 100644
--- a/drivers/scsi/megaraid/megaraid_sas_fusion.c
+++ b/drivers/scsi/megaraid/megaraid_sas_fusion.c
@@ -257,6 +257,9 @@ megasas_fusion_update_can_queue(struct megasas_instance 
*instance, int fw_boot_c
                if (!instance->is_rdpq)
                        instance->max_fw_cmds = min_t(u16, 
instance->max_fw_cmds, 1024);
 
+               if (reset_devices)
+                       instance->max_fw_cmds = min(instance->max_fw_cmds,
+                                               (u16)MEGASAS_KDUMP_QUEUE_DEPTH);
                /*
                * Reduce the max supported cmds by 1. This is to ensure that the
                * reply_q_sz (1 more than the max cmd that driver may send)
-- 
2.4.11

--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to