Commit 10139fe0 authored by Jitendra Bhivare's avatar Jitendra Bhivare Committed by Martin K. Petersen

be2iscsi: _bh for io_sgl_lock and mgmt_sgl_lock

Processing of mgmt and IO tasks are done in process context and
softirqs.

Allocation and freeing of sgl_handles needs to be done under
spin_lock_bh/spin_unlock_bh and move the locks to the routines.
Signed-off-by: default avatarJitendra Bhivare <jitendra.bhivare@broadcom.com>
Reviewed-by: default avatarJohannes Thumshirn <jthumshirn@suse.de>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent 1868379b
...@@ -1132,6 +1132,7 @@ static struct sgl_handle *alloc_io_sgl_handle(struct beiscsi_hba *phba) ...@@ -1132,6 +1132,7 @@ static struct sgl_handle *alloc_io_sgl_handle(struct beiscsi_hba *phba)
{ {
struct sgl_handle *psgl_handle; struct sgl_handle *psgl_handle;
spin_lock_bh(&phba->io_sgl_lock);
if (phba->io_sgl_hndl_avbl) { if (phba->io_sgl_hndl_avbl) {
beiscsi_log(phba, KERN_INFO, BEISCSI_LOG_IO, beiscsi_log(phba, KERN_INFO, BEISCSI_LOG_IO,
"BM_%d : In alloc_io_sgl_handle," "BM_%d : In alloc_io_sgl_handle,"
...@@ -1149,12 +1150,14 @@ static struct sgl_handle *alloc_io_sgl_handle(struct beiscsi_hba *phba) ...@@ -1149,12 +1150,14 @@ static struct sgl_handle *alloc_io_sgl_handle(struct beiscsi_hba *phba)
phba->io_sgl_alloc_index++; phba->io_sgl_alloc_index++;
} else } else
psgl_handle = NULL; psgl_handle = NULL;
spin_unlock_bh(&phba->io_sgl_lock);
return psgl_handle; return psgl_handle;
} }
static void static void
free_io_sgl_handle(struct beiscsi_hba *phba, struct sgl_handle *psgl_handle) free_io_sgl_handle(struct beiscsi_hba *phba, struct sgl_handle *psgl_handle)
{ {
spin_lock_bh(&phba->io_sgl_lock);
beiscsi_log(phba, KERN_INFO, BEISCSI_LOG_IO, beiscsi_log(phba, KERN_INFO, BEISCSI_LOG_IO,
"BM_%d : In free_,io_sgl_free_index=%d\n", "BM_%d : In free_,io_sgl_free_index=%d\n",
phba->io_sgl_free_index); phba->io_sgl_free_index);
...@@ -1169,6 +1172,7 @@ free_io_sgl_handle(struct beiscsi_hba *phba, struct sgl_handle *psgl_handle) ...@@ -1169,6 +1172,7 @@ free_io_sgl_handle(struct beiscsi_hba *phba, struct sgl_handle *psgl_handle)
"value there=%p\n", phba->io_sgl_free_index, "value there=%p\n", phba->io_sgl_free_index,
phba->io_sgl_hndl_base phba->io_sgl_hndl_base
[phba->io_sgl_free_index]); [phba->io_sgl_free_index]);
spin_unlock_bh(&phba->io_sgl_lock);
return; return;
} }
phba->io_sgl_hndl_base[phba->io_sgl_free_index] = psgl_handle; phba->io_sgl_hndl_base[phba->io_sgl_free_index] = psgl_handle;
...@@ -1177,6 +1181,7 @@ free_io_sgl_handle(struct beiscsi_hba *phba, struct sgl_handle *psgl_handle) ...@@ -1177,6 +1181,7 @@ free_io_sgl_handle(struct beiscsi_hba *phba, struct sgl_handle *psgl_handle)
phba->io_sgl_free_index = 0; phba->io_sgl_free_index = 0;
else else
phba->io_sgl_free_index++; phba->io_sgl_free_index++;
spin_unlock_bh(&phba->io_sgl_lock);
} }
static inline struct wrb_handle * static inline struct wrb_handle *
...@@ -1257,6 +1262,7 @@ static struct sgl_handle *alloc_mgmt_sgl_handle(struct beiscsi_hba *phba) ...@@ -1257,6 +1262,7 @@ static struct sgl_handle *alloc_mgmt_sgl_handle(struct beiscsi_hba *phba)
{ {
struct sgl_handle *psgl_handle; struct sgl_handle *psgl_handle;
spin_lock_bh(&phba->mgmt_sgl_lock);
if (phba->eh_sgl_hndl_avbl) { if (phba->eh_sgl_hndl_avbl) {
psgl_handle = phba->eh_sgl_hndl_base[phba->eh_sgl_alloc_index]; psgl_handle = phba->eh_sgl_hndl_base[phba->eh_sgl_alloc_index];
phba->eh_sgl_hndl_base[phba->eh_sgl_alloc_index] = NULL; phba->eh_sgl_hndl_base[phba->eh_sgl_alloc_index] = NULL;
...@@ -1274,13 +1280,14 @@ static struct sgl_handle *alloc_mgmt_sgl_handle(struct beiscsi_hba *phba) ...@@ -1274,13 +1280,14 @@ static struct sgl_handle *alloc_mgmt_sgl_handle(struct beiscsi_hba *phba)
phba->eh_sgl_alloc_index++; phba->eh_sgl_alloc_index++;
} else } else
psgl_handle = NULL; psgl_handle = NULL;
spin_unlock_bh(&phba->mgmt_sgl_lock);
return psgl_handle; return psgl_handle;
} }
void void
free_mgmt_sgl_handle(struct beiscsi_hba *phba, struct sgl_handle *psgl_handle) free_mgmt_sgl_handle(struct beiscsi_hba *phba, struct sgl_handle *psgl_handle)
{ {
spin_lock_bh(&phba->mgmt_sgl_lock);
beiscsi_log(phba, KERN_INFO, BEISCSI_LOG_CONFIG, beiscsi_log(phba, KERN_INFO, BEISCSI_LOG_CONFIG,
"BM_%d : In free_mgmt_sgl_handle," "BM_%d : In free_mgmt_sgl_handle,"
"eh_sgl_free_index=%d\n", "eh_sgl_free_index=%d\n",
...@@ -1295,6 +1302,7 @@ free_mgmt_sgl_handle(struct beiscsi_hba *phba, struct sgl_handle *psgl_handle) ...@@ -1295,6 +1302,7 @@ free_mgmt_sgl_handle(struct beiscsi_hba *phba, struct sgl_handle *psgl_handle)
"BM_%d : Double Free in eh SGL ," "BM_%d : Double Free in eh SGL ,"
"eh_sgl_free_index=%d\n", "eh_sgl_free_index=%d\n",
phba->eh_sgl_free_index); phba->eh_sgl_free_index);
spin_unlock_bh(&phba->mgmt_sgl_lock);
return; return;
} }
phba->eh_sgl_hndl_base[phba->eh_sgl_free_index] = psgl_handle; phba->eh_sgl_hndl_base[phba->eh_sgl_free_index] = psgl_handle;
...@@ -1304,6 +1312,7 @@ free_mgmt_sgl_handle(struct beiscsi_hba *phba, struct sgl_handle *psgl_handle) ...@@ -1304,6 +1312,7 @@ free_mgmt_sgl_handle(struct beiscsi_hba *phba, struct sgl_handle *psgl_handle)
phba->eh_sgl_free_index = 0; phba->eh_sgl_free_index = 0;
else else
phba->eh_sgl_free_index++; phba->eh_sgl_free_index++;
spin_unlock_bh(&phba->mgmt_sgl_lock);
} }
static void static void
...@@ -4616,11 +4625,9 @@ beiscsi_free_mgmt_task_handles(struct beiscsi_conn *beiscsi_conn, ...@@ -4616,11 +4625,9 @@ beiscsi_free_mgmt_task_handles(struct beiscsi_conn *beiscsi_conn,
} }
if (io_task->psgl_handle) { if (io_task->psgl_handle) {
spin_lock_bh(&phba->mgmt_sgl_lock);
free_mgmt_sgl_handle(phba, free_mgmt_sgl_handle(phba,
io_task->psgl_handle); io_task->psgl_handle);
io_task->psgl_handle = NULL; io_task->psgl_handle = NULL;
spin_unlock_bh(&phba->mgmt_sgl_lock);
} }
if (io_task->mtask_addr) { if (io_task->mtask_addr) {
...@@ -4666,9 +4673,7 @@ static void beiscsi_cleanup_task(struct iscsi_task *task) ...@@ -4666,9 +4673,7 @@ static void beiscsi_cleanup_task(struct iscsi_task *task)
} }
if (io_task->psgl_handle) { if (io_task->psgl_handle) {
spin_lock(&phba->io_sgl_lock);
free_io_sgl_handle(phba, io_task->psgl_handle); free_io_sgl_handle(phba, io_task->psgl_handle);
spin_unlock(&phba->io_sgl_lock);
io_task->psgl_handle = NULL; io_task->psgl_handle = NULL;
} }
...@@ -4784,9 +4789,7 @@ static int beiscsi_alloc_pdu(struct iscsi_task *task, uint8_t opcode) ...@@ -4784,9 +4789,7 @@ static int beiscsi_alloc_pdu(struct iscsi_task *task, uint8_t opcode)
io_task->pwrb_handle = NULL; io_task->pwrb_handle = NULL;
if (task->sc) { if (task->sc) {
spin_lock(&phba->io_sgl_lock);
io_task->psgl_handle = alloc_io_sgl_handle(phba); io_task->psgl_handle = alloc_io_sgl_handle(phba);
spin_unlock(&phba->io_sgl_lock);
if (!io_task->psgl_handle) { if (!io_task->psgl_handle) {
beiscsi_log(phba, KERN_ERR, beiscsi_log(phba, KERN_ERR,
BEISCSI_LOG_IO | BEISCSI_LOG_CONFIG, BEISCSI_LOG_IO | BEISCSI_LOG_CONFIG,
...@@ -4811,10 +4814,8 @@ static int beiscsi_alloc_pdu(struct iscsi_task *task, uint8_t opcode) ...@@ -4811,10 +4814,8 @@ static int beiscsi_alloc_pdu(struct iscsi_task *task, uint8_t opcode)
if ((opcode & ISCSI_OPCODE_MASK) == ISCSI_OP_LOGIN) { if ((opcode & ISCSI_OPCODE_MASK) == ISCSI_OP_LOGIN) {
beiscsi_conn->task = task; beiscsi_conn->task = task;
if (!beiscsi_conn->login_in_progress) { if (!beiscsi_conn->login_in_progress) {
spin_lock(&phba->mgmt_sgl_lock);
io_task->psgl_handle = (struct sgl_handle *) io_task->psgl_handle = (struct sgl_handle *)
alloc_mgmt_sgl_handle(phba); alloc_mgmt_sgl_handle(phba);
spin_unlock(&phba->mgmt_sgl_lock);
if (!io_task->psgl_handle) { if (!io_task->psgl_handle) {
beiscsi_log(phba, KERN_ERR, beiscsi_log(phba, KERN_ERR,
BEISCSI_LOG_IO | BEISCSI_LOG_IO |
...@@ -4853,9 +4854,7 @@ static int beiscsi_alloc_pdu(struct iscsi_task *task, uint8_t opcode) ...@@ -4853,9 +4854,7 @@ static int beiscsi_alloc_pdu(struct iscsi_task *task, uint8_t opcode)
beiscsi_conn->plogin_wrb_handle; beiscsi_conn->plogin_wrb_handle;
} }
} else { } else {
spin_lock(&phba->mgmt_sgl_lock);
io_task->psgl_handle = alloc_mgmt_sgl_handle(phba); io_task->psgl_handle = alloc_mgmt_sgl_handle(phba);
spin_unlock(&phba->mgmt_sgl_lock);
if (!io_task->psgl_handle) { if (!io_task->psgl_handle) {
beiscsi_log(phba, KERN_ERR, beiscsi_log(phba, KERN_ERR,
BEISCSI_LOG_IO | BEISCSI_LOG_IO |
...@@ -4890,15 +4889,11 @@ static int beiscsi_alloc_pdu(struct iscsi_task *task, uint8_t opcode) ...@@ -4890,15 +4889,11 @@ static int beiscsi_alloc_pdu(struct iscsi_task *task, uint8_t opcode)
return 0; return 0;
free_io_hndls: free_io_hndls:
spin_lock(&phba->io_sgl_lock);
free_io_sgl_handle(phba, io_task->psgl_handle); free_io_sgl_handle(phba, io_task->psgl_handle);
spin_unlock(&phba->io_sgl_lock);
goto free_hndls; goto free_hndls;
free_mgmt_hndls: free_mgmt_hndls:
spin_lock(&phba->mgmt_sgl_lock);
free_mgmt_sgl_handle(phba, io_task->psgl_handle); free_mgmt_sgl_handle(phba, io_task->psgl_handle);
io_task->psgl_handle = NULL; io_task->psgl_handle = NULL;
spin_unlock(&phba->mgmt_sgl_lock);
free_hndls: free_hndls:
phwi_ctrlr = phba->phwi_ctrlr; phwi_ctrlr = phba->phwi_ctrlr;
cri_index = BE_GET_CRI_FROM_CID( cri_index = BE_GET_CRI_FROM_CID(
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment