On 5.7.2017 14:00, Shivasharan S wrote:
> Signed-off-by: Kashyap Desai <[email protected]>
> Signed-off-by: Shivasharan S <[email protected]>
> Reviewed-by: Hannes Reinecke <[email protected]>
> ---
> drivers/scsi/megaraid/megaraid_sas.h | 1 -
> drivers/scsi/megaraid/megaraid_sas_base.c | 12 ++-
> drivers/scsi/megaraid/megaraid_sas_fusion.c | 121
> ++++++++++++++++++----------
> 3 files changed, 88 insertions(+), 46 deletions(-)
>
> diff --git a/drivers/scsi/megaraid/megaraid_sas.h
> b/drivers/scsi/megaraid/megaraid_sas.h
> index 2b209bb..6d9f111 100644
> --- a/drivers/scsi/megaraid/megaraid_sas.h
> +++ b/drivers/scsi/megaraid/megaraid_sas.h
> @@ -2115,7 +2115,6 @@ struct megasas_instance {
> u32 *crash_dump_buf;
> dma_addr_t crash_dump_h;
> void *crash_buf[MAX_CRASH_DUMP_SIZE];
> - u32 crash_buf_pages;
> unsigned int fw_crash_buffer_size;
> unsigned int fw_crash_state;
> unsigned int fw_crash_buffer_offset;
> diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c
> b/drivers/scsi/megaraid/megaraid_sas_base.c
> index e490272..c63ef88 100644
> --- a/drivers/scsi/megaraid/megaraid_sas_base.c
> +++ b/drivers/scsi/megaraid/megaraid_sas_base.c
> @@ -49,6 +49,7 @@
> #include <linux/blkdev.h>
> #include <linux/mutex.h>
> #include <linux/poll.h>
> +#include <linux/vmalloc.h>
>
> #include <scsi/scsi.h>
> #include <scsi/scsi_cmnd.h>
> @@ -6672,9 +6673,14 @@ static void megasas_detach_one(struct pci_dev *pdev)
> fusion->max_map_sz,
> fusion->ld_map[i],
> fusion->ld_map_phys[i]);
> - if (fusion->ld_drv_map[i])
> - free_pages((ulong)fusion->ld_drv_map[i],
> - fusion->drv_map_pages);
> + if (fusion->ld_drv_map[i]) {
> + if (is_vmalloc_addr(fusion->ld_drv_map[i]))
> + vfree(fusion->ld_drv_map[i]);
> + else
> + free_pages((ulong)fusion->ld_drv_map[i],
> + fusion->drv_map_pages);
> + }
> +
> if (fusion->pd_seq_sync[i])
> dma_free_coherent(&instance->pdev->dev,
> pd_seq_map_sz,
> diff --git a/drivers/scsi/megaraid/megaraid_sas_fusion.c
> b/drivers/scsi/megaraid/megaraid_sas_fusion.c
> index c239762..ff4a3a8 100644
> --- a/drivers/scsi/megaraid/megaraid_sas_fusion.c
> +++ b/drivers/scsi/megaraid/megaraid_sas_fusion.c
> @@ -1257,6 +1257,80 @@ static int megasas_create_sg_sense_fusion(struct
> megasas_instance *instance)
> }
>
> /**
> + * megasas_allocate_raid_maps - Allocate memory for RAID maps
> + * @instance: Adapter soft state
> + *
> + * return: if success: return 0
> + * failed: return -ENOMEM
> + */
> +static inline int megasas_allocate_raid_maps(struct megasas_instance
> *instance)
> +{
> + struct fusion_context *fusion;
> + int i = 0;
> +
> + fusion = instance->ctrl_context;
> +
> + fusion->drv_map_pages = get_order(fusion->drv_map_sz);
> +
> + for (i = 0; i < 2; i++) {
> + fusion->ld_map[i] = NULL;
Hi, does this assignment^ mean, that you need a fusion->ld_drv_map[0;1] = NULL
setting
before this for cycle as well or is it just superfluos ?
> +
> + fusion->ld_drv_map[i] = (void *)
> + __get_free_pages(__GFP_ZERO | GFP_KERNEL,
> + fusion->drv_map_pages);
The subject says - 'use vmalloc for ... and driver's local RAID map'
in the code here you use vmalloc only if __get_free_pages fails
is this intended ? (maybe an explanation in the mail body would be nice)
tomash
> +
> + if (!fusion->ld_drv_map[i]) {
> + fusion->ld_drv_map[i] = vzalloc(fusion->drv_map_sz);
> +
> + if (!fusion->ld_drv_map[i]) {
> + dev_err(&instance->pdev->dev,
> + "Could not allocate memory for local
> map"
> + " size requested: %d\n",
> + fusion->drv_map_sz);
> + goto ld_drv_map_alloc_fail;
> + }
> + }
> + }
> +
> + for (i = 0; i < 2; i++) {
> + fusion->ld_map[i] = dma_alloc_coherent(&instance->pdev->dev,
> + fusion->max_map_sz,
> + &fusion->ld_map_phys[i],
> + GFP_KERNEL);
> + if (!fusion->ld_map[i]) {
> + dev_err(&instance->pdev->dev,
> + "Could not allocate memory for map info
> %s:%d\n",
> + __func__, __LINE__);
> + goto ld_map_alloc_fail;
> + }
> + }
> +
> + return 0;
> +
> +ld_map_alloc_fail:
> + for (i = 0; i < 2; i++) {
> + if (fusion->ld_map[i])
> + dma_free_coherent(&instance->pdev->dev,
> + fusion->max_map_sz,
> + fusion->ld_map[i],
> + fusion->ld_map_phys[i]);
> + }
> +
> +ld_drv_map_alloc_fail:
> + for (i = 0; i < 2; i++) {
> + if (fusion->ld_drv_map[i]) {
> + if (is_vmalloc_addr(fusion->ld_drv_map[i]))
> + vfree(fusion->ld_drv_map[i]);
> + else
> + free_pages((ulong)fusion->ld_drv_map[i],
> + fusion->drv_map_pages);
> + }
> + }
> +
> + return -ENOMEM;
> +}
> +
> +/**
> * megasas_init_adapter_fusion - Initializes the FW
> * @instance: Adapter soft state
> *
> @@ -1375,45 +1449,14 @@ static int megasas_create_sg_sense_fusion(struct
> megasas_instance *instance)
> instance->r1_ldio_hint_default = MR_R1_LDIO_PIGGYBACK_DEFAULT;
> fusion->fast_path_io = 0;
>
> - fusion->drv_map_pages = get_order(fusion->drv_map_sz);
> - for (i = 0; i < 2; i++) {
> - fusion->ld_map[i] = NULL;
> - fusion->ld_drv_map[i] = (void *)__get_free_pages(GFP_KERNEL,
> - fusion->drv_map_pages);
> - if (!fusion->ld_drv_map[i]) {
> - dev_err(&instance->pdev->dev, "Could not allocate "
> - "memory for local map info for %d pages\n",
> - fusion->drv_map_pages);
> - if (i == 1)
> - free_pages((ulong)fusion->ld_drv_map[0],
> - fusion->drv_map_pages);
> - goto fail_ioc_init;
> - }
> - memset(fusion->ld_drv_map[i], 0,
> - ((1 << PAGE_SHIFT) << fusion->drv_map_pages));
> - }
> -
> - for (i = 0; i < 2; i++) {
> - fusion->ld_map[i] = dma_alloc_coherent(&instance->pdev->dev,
> - fusion->max_map_sz,
> - &fusion->ld_map_phys[i],
> - GFP_KERNEL);
> - if (!fusion->ld_map[i]) {
> - dev_err(&instance->pdev->dev, "Could not allocate
> memory "
> - "for map info\n");
> - goto fail_map_info;
> - }
> - }
> + if (megasas_allocate_raid_maps(instance))
> + goto fail_ioc_init;
>
> if (!megasas_get_map_info(instance))
> megasas_sync_map_info(instance);
>
> return 0;
>
> -fail_map_info:
> - if (i == 1)
> - dma_free_coherent(&instance->pdev->dev, fusion->max_map_sz,
> - fusion->ld_map[0], fusion->ld_map_phys[0]);
> fail_ioc_init:
> megasas_free_cmds_fusion(instance);
> fail_alloc_cmds:
> @@ -3365,17 +3408,13 @@ irqreturn_t megasas_isr_fusion(int irq, void *devp)
> {
> unsigned int i;
>
> - instance->crash_buf_pages = get_order(CRASH_DMA_BUF_SIZE);
> for (i = 0; i < MAX_CRASH_DUMP_SIZE; i++) {
> - instance->crash_buf[i] = (void *)__get_free_pages(GFP_KERNEL,
> - instance->crash_buf_pages);
> + instance->crash_buf[i] = vzalloc(CRASH_DMA_BUF_SIZE);
> if (!instance->crash_buf[i]) {
> dev_info(&instance->pdev->dev, "Firmware crash dump "
> "memory allocation failed at index %d\n", i);
> break;
> }
> - memset(instance->crash_buf[i], 0,
> - ((1 << PAGE_SHIFT) << instance->crash_buf_pages));
> }
> instance->drv_buf_alloc = i;
> }
> @@ -3387,12 +3426,10 @@ irqreturn_t megasas_isr_fusion(int irq, void *devp)
> void
> megasas_free_host_crash_buffer(struct megasas_instance *instance)
> {
> - unsigned int i
> -;
> + unsigned int i;
> for (i = 0; i < instance->drv_buf_alloc; i++) {
> if (instance->crash_buf[i])
> - free_pages((ulong)instance->crash_buf[i],
> - instance->crash_buf_pages);
> + vfree(instance->crash_buf[i]);
> }
> instance->drv_buf_index = 0;
> instance->drv_buf_alloc = 0;