Skip to content

Commit c432e16

Browse files
cp890582martinkpetersen
authored andcommitted
scsi: mpi3mr: Support for preallocation of SGL BSG data buffers part-1
The driver now supports SGLs for BSG data transfer. Upon loading, the driver pre-allocates SGLs in chunks of 8k, results in a total of 256 * 8k, equal to 2MB. These pre-allocated SGLs are reserved for handling BSG commands and are deallocated during driver unload. Co-developed-by: Sathya Prakash <sathya.prakash@broadcom.com> Signed-off-by: Sathya Prakash <sathya.prakash@broadcom.com> Signed-off-by: Chandrakanth patil <chandrakanth.patil@broadcom.com> Link: https://lore.kernel.org/r/20231205191630.12201-2-chandrakanth.patil@broadcom.com Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
1 parent 07ac6ad commit c432e16

2 files changed

Lines changed: 127 additions & 0 deletions

File tree

drivers/scsi/mpi3mr/mpi3mr.h

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -477,6 +477,10 @@ struct mpi3mr_throttle_group_info {
477477
/* HBA port flags */
478478
#define MPI3MR_HBA_PORT_FLAG_DIRTY 0x01
479479

480+
/* IOCTL data transfer sge*/
481+
#define MPI3MR_NUM_IOCTL_SGE 256
482+
#define MPI3MR_IOCTL_SGE_SIZE (8 * 1024)
483+
480484
/**
481485
* struct mpi3mr_hba_port - HBA's port information
482486
* @port_id: Port number
@@ -1042,6 +1046,11 @@ struct scmd_priv {
10421046
* @sas_node_lock: Lock to protect SAS node list
10431047
* @hba_port_table_list: List of HBA Ports
10441048
* @enclosure_list: List of Enclosure objects
1049+
* @ioctl_dma_pool: DMA pool for IOCTL data buffers
1050+
* @ioctl_sge: DMA buffer descriptors for IOCTL data
1051+
* @ioctl_chain_sge: DMA buffer descriptor for IOCTL chain
1052+
* @ioctl_resp_sge: DMA buffer descriptor for Mgmt cmd response
1053+
* @ioctl_sges_allocated: Flag for IOCTL SGEs allocated or not
10451054
*/
10461055
struct mpi3mr_ioc {
10471056
struct list_head list;
@@ -1227,6 +1236,12 @@ struct mpi3mr_ioc {
12271236
spinlock_t sas_node_lock;
12281237
struct list_head hba_port_table_list;
12291238
struct list_head enclosure_list;
1239+
1240+
struct dma_pool *ioctl_dma_pool;
1241+
struct dma_memory_desc ioctl_sge[MPI3MR_NUM_IOCTL_SGE];
1242+
struct dma_memory_desc ioctl_chain_sge;
1243+
struct dma_memory_desc ioctl_resp_sge;
1244+
bool ioctl_sges_allocated;
12301245
};
12311246

12321247
/**

drivers/scsi/mpi3mr/mpi3mr_fw.c

Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1058,6 +1058,114 @@ enum mpi3mr_iocstate mpi3mr_get_iocstate(struct mpi3mr_ioc *mrioc)
10581058
return MRIOC_STATE_RESET_REQUESTED;
10591059
}
10601060

1061+
/**
1062+
* mpi3mr_free_ioctl_dma_memory - free memory for ioctl dma
1063+
* @mrioc: Adapter instance reference
1064+
*
1065+
* Free the DMA memory allocated for IOCTL handling purpose.
1066+
1067+
*
1068+
* Return: None
1069+
*/
1070+
static void mpi3mr_free_ioctl_dma_memory(struct mpi3mr_ioc *mrioc)
1071+
{
1072+
struct dma_memory_desc *mem_desc;
1073+
u16 i;
1074+
1075+
if (!mrioc->ioctl_dma_pool)
1076+
return;
1077+
1078+
for (i = 0; i < MPI3MR_NUM_IOCTL_SGE; i++) {
1079+
mem_desc = &mrioc->ioctl_sge[i];
1080+
if (mem_desc->addr) {
1081+
dma_pool_free(mrioc->ioctl_dma_pool,
1082+
mem_desc->addr,
1083+
mem_desc->dma_addr);
1084+
mem_desc->addr = NULL;
1085+
}
1086+
}
1087+
dma_pool_destroy(mrioc->ioctl_dma_pool);
1088+
mrioc->ioctl_dma_pool = NULL;
1089+
mem_desc = &mrioc->ioctl_chain_sge;
1090+
1091+
if (mem_desc->addr) {
1092+
dma_free_coherent(&mrioc->pdev->dev, mem_desc->size,
1093+
mem_desc->addr, mem_desc->dma_addr);
1094+
mem_desc->addr = NULL;
1095+
}
1096+
mem_desc = &mrioc->ioctl_resp_sge;
1097+
if (mem_desc->addr) {
1098+
dma_free_coherent(&mrioc->pdev->dev, mem_desc->size,
1099+
mem_desc->addr, mem_desc->dma_addr);
1100+
mem_desc->addr = NULL;
1101+
}
1102+
1103+
mrioc->ioctl_sges_allocated = false;
1104+
}
1105+
1106+
/**
1107+
* mpi3mr_alloc_ioctl_dma_memory - Alloc memory for ioctl dma
1108+
* @mrioc: Adapter instance reference
1109+
1110+
*
1111+
* This function allocates dmaable memory required to handle the
1112+
* application issued MPI3 IOCTL requests.
1113+
*
1114+
* Return: None
1115+
*/
1116+
static void mpi3mr_alloc_ioctl_dma_memory(struct mpi3mr_ioc *mrioc)
1117+
1118+
{
1119+
struct dma_memory_desc *mem_desc;
1120+
u16 i;
1121+
1122+
mrioc->ioctl_dma_pool = dma_pool_create("ioctl dma pool",
1123+
&mrioc->pdev->dev,
1124+
MPI3MR_IOCTL_SGE_SIZE,
1125+
MPI3MR_PAGE_SIZE_4K, 0);
1126+
1127+
if (!mrioc->ioctl_dma_pool) {
1128+
ioc_err(mrioc, "ioctl_dma_pool: dma_pool_create failed\n");
1129+
goto out_failed;
1130+
}
1131+
1132+
for (i = 0; i < MPI3MR_NUM_IOCTL_SGE; i++) {
1133+
mem_desc = &mrioc->ioctl_sge[i];
1134+
mem_desc->size = MPI3MR_IOCTL_SGE_SIZE;
1135+
mem_desc->addr = dma_pool_zalloc(mrioc->ioctl_dma_pool,
1136+
GFP_KERNEL,
1137+
&mem_desc->dma_addr);
1138+
if (!mem_desc->addr)
1139+
goto out_failed;
1140+
}
1141+
1142+
mem_desc = &mrioc->ioctl_chain_sge;
1143+
mem_desc->size = MPI3MR_PAGE_SIZE_4K;
1144+
mem_desc->addr = dma_alloc_coherent(&mrioc->pdev->dev,
1145+
mem_desc->size,
1146+
&mem_desc->dma_addr,
1147+
GFP_KERNEL);
1148+
if (!mem_desc->addr)
1149+
goto out_failed;
1150+
1151+
mem_desc = &mrioc->ioctl_resp_sge;
1152+
mem_desc->size = MPI3MR_PAGE_SIZE_4K;
1153+
mem_desc->addr = dma_alloc_coherent(&mrioc->pdev->dev,
1154+
mem_desc->size,
1155+
&mem_desc->dma_addr,
1156+
GFP_KERNEL);
1157+
if (!mem_desc->addr)
1158+
goto out_failed;
1159+
1160+
mrioc->ioctl_sges_allocated = true;
1161+
1162+
return;
1163+
out_failed:
1164+
ioc_warn(mrioc, "cannot allocate DMA memory for the mpt commands\n"
1165+
"from the applications, application interface for MPT command is disabled\n");
1166+
mpi3mr_free_ioctl_dma_memory(mrioc);
1167+
}
1168+
10611169
/**
10621170
* mpi3mr_clear_reset_history - clear reset history
10631171
* @mrioc: Adapter instance reference
@@ -3874,6 +3982,9 @@ int mpi3mr_init_ioc(struct mpi3mr_ioc *mrioc)
38743982
}
38753983
}
38763984

3985+
dprint_init(mrioc, "allocating ioctl dma buffers\n");
3986+
mpi3mr_alloc_ioctl_dma_memory(mrioc);
3987+
38773988
if (!mrioc->init_cmds.reply) {
38783989
retval = mpi3mr_alloc_reply_sense_bufs(mrioc);
38793990
if (retval) {
@@ -4293,6 +4404,7 @@ void mpi3mr_free_mem(struct mpi3mr_ioc *mrioc)
42934404
struct mpi3mr_intr_info *intr_info;
42944405

42954406
mpi3mr_free_enclosure_list(mrioc);
4407+
mpi3mr_free_ioctl_dma_memory(mrioc);
42964408

42974409
if (mrioc->sense_buf_pool) {
42984410
if (mrioc->sense_buf)

0 commit comments

Comments
 (0)