Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 89009fbb authored by Kashyap, Desai's avatar Kashyap, Desai Committed by James Bottomley
Browse files

[SCSI] mpt2sas: Use of get_free_pages for huge memorary allocation.



use the get_free_pages API for larger contigious physical memory chunk.
Also, the ioc->chain_depth need to be changed from
a 16bit to 32bit variable because the number of chains will exceed 64k
when the queue depth is large.

Signed-off-by: default avatarKashyap Desai <kashyap.desai@lsi.com>
Signed-off-by: default avatarJames Bottomley <James.Bottomley@suse.de>
parent f891dcfd
Loading
Loading
Loading
Loading
+7 −5
Original line number Diff line number Diff line
@@ -1901,7 +1901,7 @@ _base_release_memory_pools(struct MPT2SAS_ADAPTER *ioc)
		    ioc->config_page, ioc->config_page_dma);
	}

	kfree(ioc->scsi_lookup);
	free_pages((ulong)ioc->scsi_lookup, ioc->scsi_lookup_pages);
	kfree(ioc->hpr_lookup);
	kfree(ioc->internal_lookup);
}
@@ -2113,11 +2113,13 @@ _base_allocate_memory_pools(struct MPT2SAS_ADAPTER *ioc, int sleep_flag)
	    ioc->name, (unsigned long long) ioc->request_dma));
	total_sz += sz;

	ioc->scsi_lookup = kcalloc(ioc->scsiio_depth,
	    sizeof(struct request_tracker), GFP_KERNEL);
	sz = ioc->scsiio_depth * sizeof(struct request_tracker);
	ioc->scsi_lookup_pages = get_order(sz);
	ioc->scsi_lookup = (struct request_tracker *)__get_free_pages(
	    GFP_KERNEL, ioc->scsi_lookup_pages);
	if (!ioc->scsi_lookup) {
		printk(MPT2SAS_ERR_FMT "scsi_lookup: kcalloc failed\n",
		    ioc->name);
		printk(MPT2SAS_ERR_FMT "scsi_lookup: get_free_pages failed, "
		    "sz(%d)\n", ioc->name, (int)sz);
		goto out;
	}

+3 −2
Original line number Diff line number Diff line
@@ -676,6 +676,7 @@ struct MPT2SAS_ADAPTER {
	dma_addr_t	request_dma;
	u32		request_dma_sz;
	struct request_tracker *scsi_lookup;
	ulong		scsi_lookup_pages;
	spinlock_t 	scsi_lookup_lock;
	struct list_head free_list;
	int		pending_io_count;
@@ -688,7 +689,7 @@ struct MPT2SAS_ADAPTER {
	u16		max_sges_in_chain_message;
	u16		chains_needed_per_io;
	u16		chain_offset_value_for_main_message;
	u16		chain_depth;
	u32		chain_depth;

	/* hi-priority queue */
	u16		hi_priority_smid;