Re: [PATCH 11/12] be2iscsi: _bh for io_sgl_lock and mgmt_sgl_lock

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Mon, Feb 01, 2016 at 03:42:50PM +0530, Jitendra Bhivare wrote:
> Processing of mgmt and IO tasks are done in process context and sofitrqs.
> 
> 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: Jitendra Bhivare <jitendra.bhivare@xxxxxxxxxxxxx>
> ---
>  drivers/scsi/be2iscsi/be_main.c | 25 ++++++++++---------------
>  1 file changed, 10 insertions(+), 15 deletions(-)
> 
> diff --git a/drivers/scsi/be2iscsi/be_main.c b/drivers/scsi/be2iscsi/be_main.c
> index 03265b6..fa2b589 100644
> --- a/drivers/scsi/be2iscsi/be_main.c
> +++ b/drivers/scsi/be2iscsi/be_main.c
> @@ -1132,6 +1132,7 @@ static struct sgl_handle *alloc_io_sgl_handle(struct beiscsi_hba *phba)
>  {
>  	struct sgl_handle *psgl_handle;
>  
> +	spin_lock_bh(&phba->io_sgl_lock);
>  	if (phba->io_sgl_hndl_avbl) {
>  		beiscsi_log(phba, KERN_INFO, BEISCSI_LOG_IO,
>  			    "BM_%d : In alloc_io_sgl_handle,"
> @@ -1149,12 +1150,14 @@ static struct sgl_handle *alloc_io_sgl_handle(struct beiscsi_hba *phba)
>  			phba->io_sgl_alloc_index++;
>  	} else
>  		psgl_handle = NULL;
> +	spin_unlock_bh(&phba->io_sgl_lock);
>  	return psgl_handle;
>  }
>  
>  static void
>  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,
>  		    "BM_%d : In free_,io_sgl_free_index=%d\n",
>  		    phba->io_sgl_free_index);
> @@ -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,
>  			     phba->io_sgl_hndl_base
>  			     [phba->io_sgl_free_index]);
> +		 spin_unlock_bh(&phba->io_sgl_lock);
>  		return;
>  	}
>  	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)
>  		phba->io_sgl_free_index = 0;
>  	else
>  		phba->io_sgl_free_index++;
> +	spin_unlock_bh(&phba->io_sgl_lock);
>  }
>  
>  static inline struct wrb_handle *
> @@ -1257,6 +1262,7 @@ static struct sgl_handle *alloc_mgmt_sgl_handle(struct beiscsi_hba *phba)
>  {
>  	struct sgl_handle *psgl_handle;
>  
> +	spin_lock_bh(&phba->mgmt_sgl_lock);
>  	if (phba->eh_sgl_hndl_avbl) {
>  		psgl_handle = phba->eh_sgl_hndl_base[phba->eh_sgl_alloc_index];
>  		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)
>  			phba->eh_sgl_alloc_index++;
>  	} else
>  		psgl_handle = NULL;
> +	spin_unlock_bh(&phba->mgmt_sgl_lock);
>  	return psgl_handle;
>  }
>  
>  void
>  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,
>  		    "BM_%d : In  free_mgmt_sgl_handle,"
>  		    "eh_sgl_free_index=%d\n",
> @@ -1295,6 +1302,7 @@ free_mgmt_sgl_handle(struct beiscsi_hba *phba, struct sgl_handle *psgl_handle)
>  			    "BM_%d : Double Free in eh SGL ,"
>  			    "eh_sgl_free_index=%d\n",
>  			    phba->eh_sgl_free_index);
> +		spin_unlock_bh(&phba->mgmt_sgl_lock);
>  		return;
>  	}
>  	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)
>  		phba->eh_sgl_free_index = 0;
>  	else
>  		phba->eh_sgl_free_index++;
> +	spin_unlock_bh(&phba->mgmt_sgl_lock);
>  }
>  
>  static void
> @@ -4616,11 +4625,9 @@ beiscsi_free_mgmt_task_handles(struct beiscsi_conn *beiscsi_conn,
>  	}
>  
>  	if (io_task->psgl_handle) {
> -		spin_lock_bh(&phba->mgmt_sgl_lock);
>  		free_mgmt_sgl_handle(phba,
>  				     io_task->psgl_handle);
>  		io_task->psgl_handle = NULL;
> -		spin_unlock_bh(&phba->mgmt_sgl_lock);
>  	}
>  
>  	if (io_task->mtask_addr) {
> @@ -4666,9 +4673,7 @@ static void beiscsi_cleanup_task(struct iscsi_task *task)
>  		}
>  
>  		if (io_task->psgl_handle) {
> -			spin_lock(&phba->io_sgl_lock);
>  			free_io_sgl_handle(phba, io_task->psgl_handle);
> -			spin_unlock(&phba->io_sgl_lock);
>  			io_task->psgl_handle = NULL;
>  		}
>  
> @@ -4784,9 +4789,7 @@ static int beiscsi_alloc_pdu(struct iscsi_task *task, uint8_t opcode)
>  	io_task->pwrb_handle = NULL;
>  
>  	if (task->sc) {
> -		spin_lock(&phba->io_sgl_lock);
>  		io_task->psgl_handle = alloc_io_sgl_handle(phba);
> -		spin_unlock(&phba->io_sgl_lock);
>  		if (!io_task->psgl_handle) {
>  			beiscsi_log(phba, KERN_ERR,
>  				    BEISCSI_LOG_IO | BEISCSI_LOG_CONFIG,
> @@ -4811,10 +4814,8 @@ static int beiscsi_alloc_pdu(struct iscsi_task *task, uint8_t opcode)
>  		if ((opcode & ISCSI_OPCODE_MASK) == ISCSI_OP_LOGIN) {
>  			beiscsi_conn->task = task;
>  			if (!beiscsi_conn->login_in_progress) {
> -				spin_lock(&phba->mgmt_sgl_lock);
>  				io_task->psgl_handle = (struct sgl_handle *)
>  						alloc_mgmt_sgl_handle(phba);
> -				spin_unlock(&phba->mgmt_sgl_lock);
>  				if (!io_task->psgl_handle) {
>  					beiscsi_log(phba, KERN_ERR,
>  						    BEISCSI_LOG_IO |
> @@ -4853,9 +4854,7 @@ static int beiscsi_alloc_pdu(struct iscsi_task *task, uint8_t opcode)
>  						beiscsi_conn->plogin_wrb_handle;
>  			}
>  		} else {
> -			spin_lock(&phba->mgmt_sgl_lock);
>  			io_task->psgl_handle = alloc_mgmt_sgl_handle(phba);
> -			spin_unlock(&phba->mgmt_sgl_lock);
>  			if (!io_task->psgl_handle) {
>  				beiscsi_log(phba, KERN_ERR,
>  					    BEISCSI_LOG_IO |
> @@ -4890,15 +4889,11 @@ static int beiscsi_alloc_pdu(struct iscsi_task *task, uint8_t opcode)
>  	return 0;
>  
>  free_io_hndls:
> -	spin_lock(&phba->io_sgl_lock);
>  	free_io_sgl_handle(phba, io_task->psgl_handle);
> -	spin_unlock(&phba->io_sgl_lock);
>  	goto free_hndls;
>  free_mgmt_hndls:
> -	spin_lock(&phba->mgmt_sgl_lock);
>  	free_mgmt_sgl_handle(phba, io_task->psgl_handle);
>  	io_task->psgl_handle = NULL;
> -	spin_unlock(&phba->mgmt_sgl_lock);
>  free_hndls:
>  	phwi_ctrlr = phba->phwi_ctrlr;
>  	cri_index = BE_GET_CRI_FROM_CID(
> -- 
> 2.5.0
> 
> --
> To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
> the body of a message to majordomo@xxxxxxxxxxxxxxx
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reviewed-by: Johannes Thumshirn <jthumshirn@xxxxxxx>
-- 
Johannes Thumshirn                                          Storage
jthumshirn@xxxxxxx                                +49 911 74053 689
SUSE LINUX GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: Felix Imendörffer, Jane Smithard, Graham Norton
HRB 21284 (AG Nürnberg)
Key fingerprint = EC38 9CAB C2C4 F25D 8600 D0D0 0393 969D 2D76 0850
--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [SCSI Target Devel]     [Linux SCSI Target Infrastructure]     [Kernel Newbies]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Linux IIO]     [Samba]     [Device Mapper]
  Powered by Linux