Re: [PATCH 16/39] megaraid_sas: reduce size of fusion_context and use vmalloc if kmalloc fails

2017-02-06 Thread Tomas Henzl
On 6.2.2017 10:59, Shivasharan S wrote:
> Currently fusion context has fixed array load_balance_info. Use dynamic 
> allocation.
> In few places, driver do not want physically contigious memory.
> Attempt to use vmalloc if physical contiguous memory is not available.
>
> Signed-off-by: Shivasharan S 
> Signed-off-by: Kashyap Desai 

Reviewed-by: Tomas Henzl 

Tomas



Re: [PATCH 16/39] megaraid_sas: reduce size of fusion_context and use vmalloc if kmalloc fails

2017-02-06 Thread Hannes Reinecke
On 02/06/2017 10:59 AM, Shivasharan S wrote:
> Currently fusion context has fixed array load_balance_info. Use dynamic 
> allocation.
> In few places, driver do not want physically contigious memory.
> Attempt to use vmalloc if physical contiguous memory is not available.
> 
> Signed-off-by: Shivasharan S 
> Signed-off-by: Kashyap Desai 
> ---
>  drivers/scsi/megaraid/megaraid_sas.h|  2 +
>  drivers/scsi/megaraid/megaraid_sas_base.c   | 15 ++
>  drivers/scsi/megaraid/megaraid_sas_fp.c |  3 +-
>  drivers/scsi/megaraid/megaraid_sas_fusion.c | 71 
> +++--
>  drivers/scsi/megaraid/megaraid_sas_fusion.h |  3 +-
>  5 files changed, 76 insertions(+), 18 deletions(-)
> 
Reviewed-by: Hannes Reinecke 

Cheers,

Hannes
-- 
Dr. Hannes ReineckezSeries & Storage
h...@suse.com  +49 911 74053 688
SUSE LINUX GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: F. Imendörffer, J. Smithard, D. Upmanyu, G. Norton
HRB 21284 (AG Nürnberg)


[PATCH 16/39] megaraid_sas: reduce size of fusion_context and use vmalloc if kmalloc fails

2017-02-06 Thread Shivasharan S
Currently fusion context has fixed array load_balance_info. Use dynamic 
allocation.
In few places, driver do not want physically contigious memory.
Attempt to use vmalloc if physical contiguous memory is not available.

Signed-off-by: Shivasharan S 
Signed-off-by: Kashyap Desai 
---
 drivers/scsi/megaraid/megaraid_sas.h|  2 +
 drivers/scsi/megaraid/megaraid_sas_base.c   | 15 ++
 drivers/scsi/megaraid/megaraid_sas_fp.c |  3 +-
 drivers/scsi/megaraid/megaraid_sas_fusion.c | 71 +++--
 drivers/scsi/megaraid/megaraid_sas_fusion.h |  3 +-
 5 files changed, 76 insertions(+), 18 deletions(-)

diff --git a/drivers/scsi/megaraid/megaraid_sas.h 
b/drivers/scsi/megaraid/megaraid_sas.h
index ac2aed3..f023e23 100644
--- a/drivers/scsi/megaraid/megaraid_sas.h
+++ b/drivers/scsi/megaraid/megaraid_sas.h
@@ -2488,4 +2488,6 @@ int megasas_reset_fusion(struct Scsi_Host *shost, int 
reason);
 int megasas_task_abort_fusion(struct scsi_cmnd *scmd);
 int megasas_reset_target_fusion(struct scsi_cmnd *scmd);
 u32 mega_mod64(u64 dividend, u32 divisor);
+int megasas_alloc_fusion_context(struct megasas_instance *instance);
+void megasas_free_fusion_context(struct megasas_instance *instance);
 #endif /*LSI_MEGARAID_SAS_H */
diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c 
b/drivers/scsi/megaraid/megaraid_sas_base.c
index de01e36..c38b9c3 100644
--- a/drivers/scsi/megaraid/megaraid_sas_base.c
+++ b/drivers/scsi/megaraid/megaraid_sas_base.c
@@ -6024,18 +6024,12 @@ static int megasas_probe_one(struct pci_dev *pdev,
case PCI_DEVICE_ID_LSI_CUTLASS_52:
case PCI_DEVICE_ID_LSI_CUTLASS_53:
{
-   instance->ctrl_context_pages =
-   get_order(sizeof(struct fusion_context));
-   instance->ctrl_context = (void *)__get_free_pages(GFP_KERNEL,
-   instance->ctrl_context_pages);
-   if (!instance->ctrl_context) {
-   dev_printk(KERN_DEBUG, >dev, "Failed to allocate "
-  "memory for Fusion context info\n");
+   if (megasas_alloc_fusion_context(instance)) {
+   megasas_free_fusion_context(instance);
goto fail_alloc_dma_buf;
}
fusion = instance->ctrl_context;
-   memset(fusion, 0,
-   ((1 << PAGE_SHIFT) << instance->ctrl_context_pages));
+
if ((instance->pdev->device == PCI_DEVICE_ID_LSI_FUSION) ||
(instance->pdev->device == PCI_DEVICE_ID_LSI_PLASMA))
fusion->adapter_type = THUNDERBOLT_SERIES;
@@ -6678,8 +6672,7 @@ static void megasas_detach_one(struct pci_dev *pdev)
fusion->pd_seq_sync[i],
fusion->pd_seq_phys[i]);
}
-   free_pages((ulong)instance->ctrl_context,
-   instance->ctrl_context_pages);
+   megasas_free_fusion_context(instance);
} else {
megasas_release_mfi(instance);
pci_free_consistent(pdev, sizeof(u32),
diff --git a/drivers/scsi/megaraid/megaraid_sas_fp.c 
b/drivers/scsi/megaraid/megaraid_sas_fp.c
index c3ef82d..d9b0f28 100644
--- a/drivers/scsi/megaraid/megaraid_sas_fp.c
+++ b/drivers/scsi/megaraid/megaraid_sas_fp.c
@@ -489,7 +489,8 @@ u8 MR_ValidateMapInfo(struct megasas_instance *instance)
if (instance->UnevenSpanSupport)
mr_update_span_set(drv_map, ldSpanInfo);
 
-   mr_update_load_balance_params(drv_map, lbInfo);
+   if (lbInfo)
+   mr_update_load_balance_params(drv_map, lbInfo);
 
num_lds = le16_to_cpu(drv_map->raidMap.ldCount);
 
diff --git a/drivers/scsi/megaraid/megaraid_sas_fusion.c 
b/drivers/scsi/megaraid/megaraid_sas_fusion.c
index 8dd4944..2f523f2 100644
--- a/drivers/scsi/megaraid/megaraid_sas_fusion.c
+++ b/drivers/scsi/megaraid/megaraid_sas_fusion.c
@@ -47,6 +47,7 @@
 #include 
 #include 
 #include 
+#include 
 
 #include 
 #include 
@@ -2394,8 +2395,9 @@ megasas_build_ldio_fusion(struct megasas_instance 
*instance,
io_request->IoFlags |=
cpu_to_le16(MPI25_SAS_DEVICE0_FLAGS_ENABLED_FAST_PATH);
}
-   if ((fusion->load_balance_info[device_id].loadBalanceFlag) &&
-   (io_info.isRead)) {
+   if (fusion->load_balance_info &&
+   (fusion->load_balance_info[device_id].loadBalanceFlag) 
&&
+   (io_info.isRead)) {
io_info.devHandle =
get_updated_dev_handle(instance,
>load_balance_info[device_id],
@@ -4266,9 +4268,10 @@ int megasas_reset_fusion(struct Scsi_Host *shost, int 
reason)