]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
megaraid_sas: reduce memory footprints in kdump mode
authorSumit Saxena <sumit.saxena@broadcom.com>
Fri, 15 Apr 2016 07:23:30 +0000 (00:23 -0700)
committerChuck Anderson <chuck.anderson@oracle.com>
Tue, 28 Feb 2017 04:40:00 +0000 (20:40 -0800)
Orabug: 25568930

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.saxena@broadcom.com>
Reviewed-by: Hannes Reinicke <hare@suse.de>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
(cherry picked from commit c3e385a1b985a9202ba7fbd0bdbdcb909905d00c)
Signed-off-by: Brian Maly <brian.maly@oracle.com>
drivers/scsi/megaraid/megaraid_sas.h
drivers/scsi/megaraid/megaraid_sas_base.c
drivers/scsi/megaraid/megaraid_sas_fusion.c

index fce414a2cd766d9f2048c375262105763d5ba7df..1784b09523d35ac4523c542aebe6f3472d4d6f89 100644 (file)
@@ -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,
index f7acf86853d3414470d5518aa1d6aefd3746e3a9..30a1717ef39ff235fc6d4a20f0aeeb9ea5707c8e 100644 (file)
@@ -5784,13 +5784,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;
@@ -5800,14 +5793,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;
@@ -5826,11 +5811,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
@@ -7196,6 +7196,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
         */
index 151769cea60671aac11fbe546a5ce8a7c42ddd5b..14b36f54daa51d850f80a15d056050b61c0bcd53 100644 (file)
@@ -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)