Re: [PATCH 06/12] be2iscsi: Fix be_mcc_compl_poll to use tag_state

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

 



On Mon, Feb 01, 2016 at 03:42:45PM +0530, Jitendra Bhivare wrote:
> be_mcc_compl_poll waits till 'used' count of MCC WRBQ is zero. This is to
> determine the completion of an MCC sent.
> 
> Change function to poll for the tag of MCC sent, instead, and wait till
> its tag_state is cleared.
> 
> Signed-off-by: Jitendra Bhivare <jitendra.bhivare@xxxxxxxxxxxxx>
> ---
>  drivers/scsi/be2iscsi/be_cmds.c | 92 +++++++++++++++++++++--------------------
>  1 file changed, 47 insertions(+), 45 deletions(-)
> 
> diff --git a/drivers/scsi/be2iscsi/be_cmds.c b/drivers/scsi/be2iscsi/be_cmds.c
> index 12b60dd..60db2de 100644
> --- a/drivers/scsi/be2iscsi/be_cmds.c
> +++ b/drivers/scsi/be2iscsi/be_cmds.c
> @@ -104,19 +104,6 @@ int be_chk_reset_complete(struct beiscsi_hba *phba)
>  	return 0;
>  }
>  
> -void be_mcc_notify(struct beiscsi_hba *phba, unsigned int tag)
> -{
> -	struct be_queue_info *mccq = &phba->ctrl.mcc_obj.q;
> -	u32 val = 0;
> -
> -	set_bit(MCC_TAG_STATE_RUNNING, &phba->ctrl.ptag_state[tag].tag_state);
> -	val |= mccq->id & DB_MCCQ_RING_ID_MASK;
> -	val |= 1 << DB_MCCQ_NUM_POSTED_SHIFT;
> -	/* ring doorbell after all of request and state is written */
> -	wmb();
> -	iowrite32(val, phba->db_va + DB_MCCQ_OFFSET);
> -}
> -
>  unsigned int alloc_mcc_tag(struct beiscsi_hba *phba)
>  {
>  	unsigned int tag = 0;
> @@ -139,6 +126,28 @@ unsigned int alloc_mcc_tag(struct beiscsi_hba *phba)
>  	return tag;
>  }
>  
> +void free_mcc_tag(struct be_ctrl_info *ctrl, unsigned int tag)
> +{
> +	spin_lock_bh(&ctrl->mcc_lock);
> +	tag = tag & MCC_Q_CMD_TAG_MASK;
> +	ctrl->mcc_tag[ctrl->mcc_free_index] = tag;
> +	if (ctrl->mcc_free_index == (MAX_MCC_CMD - 1))
> +		ctrl->mcc_free_index = 0;
> +	else
> +		ctrl->mcc_free_index++;
> +	ctrl->mcc_tag_available++;
> +	spin_unlock_bh(&ctrl->mcc_lock);
> +}
> +
> +/**
> + * beiscsi_fail_session(): Closing session with appropriate error
> + * @cls_session: ptr to session
> + **/
> +void beiscsi_fail_session(struct iscsi_cls_session *cls_session)
> +{
> +	iscsi_session_failure(cls_session->dd_data, ISCSI_ERR_CONN_FAILED);
> +}
> +
>  /*
>   * beiscsi_mccq_compl_wait()- Process completion in MCC CQ
>   * @phba: Driver private structure
> @@ -254,19 +263,6 @@ int beiscsi_mccq_compl_wait(struct beiscsi_hba *phba,
>  	return rc;
>  }
>  
> -void free_mcc_tag(struct be_ctrl_info *ctrl, unsigned int tag)
> -{
> -	spin_lock(&ctrl->mcc_lock);
> -	tag = tag & MCC_Q_CMD_TAG_MASK;
> -	ctrl->mcc_tag[ctrl->mcc_free_index] = tag;
> -	if (ctrl->mcc_free_index == (MAX_MCC_CMD - 1))
> -		ctrl->mcc_free_index = 0;
> -	else
> -		ctrl->mcc_free_index++;
> -	ctrl->mcc_tag_available++;
> -	spin_unlock(&ctrl->mcc_lock);
> -}
> -
>  static inline bool be_mcc_compl_is_new(struct be_mcc_compl *compl)
>  {
>  	if (compl->flags != 0) {
> @@ -328,15 +324,6 @@ static int beiscsi_process_mbox_compl(struct be_ctrl_info *ctrl,
>  	return 0;
>  }
>  
> -/**
> - * beiscsi_fail_session(): Closing session with appropriate error
> - * @cls_session: ptr to session
> - **/
> -void beiscsi_fail_session(struct iscsi_cls_session *cls_session)
> -{
> -	iscsi_session_failure(cls_session->dd_data, ISCSI_ERR_CONN_FAILED);
> -}
> -
>  static void beiscsi_process_async_link(struct beiscsi_hba *phba,
>  				       struct be_mcc_compl *compl)
>  {
> @@ -532,6 +519,7 @@ int beiscsi_process_mcc_compl(struct be_ctrl_info *ctrl,
>   **/
>  int be_mcc_compl_poll(struct beiscsi_hba *phba, unsigned int tag)
>  {
> +	struct be_ctrl_info *ctrl = &phba->ctrl;
>  	int i;
>  
>  	for (i = 0; i < mcc_timeout; i++) {
> @@ -540,19 +528,33 @@ int be_mcc_compl_poll(struct beiscsi_hba *phba, unsigned int tag)
>  
>  		beiscsi_process_mcc_cq(phba);
>  
> -		if (atomic_read(&phba->ctrl.mcc_obj.q.used) == 0)
> +		if (!test_bit(MCC_TAG_STATE_RUNNING,
> +			      &ctrl->ptag_state[tag].tag_state))
>  			break;
>  		udelay(100);
>  	}
> -	if (i == mcc_timeout) {
> -		beiscsi_log(phba, KERN_ERR,
> -			    BEISCSI_LOG_CONFIG | BEISCSI_LOG_MBOX,
> -			    "BC_%d : FW Timed Out\n");
> -		phba->fw_timeout = true;
> -		beiscsi_ue_detect(phba);
> -		return -EBUSY;
> -	}
> -	return 0;
> +
> +	if (i < mcc_timeout)
> +		return 0;
> +
> +	beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_CONFIG | BEISCSI_LOG_MBOX,
> +		    "BC_%d : FW Timed Out\n");
> +	phba->fw_timeout = true;
> +	beiscsi_ue_detect(phba);
> +	return -EBUSY;
> +}
> +
> +void be_mcc_notify(struct beiscsi_hba *phba, unsigned int tag)
> +{
> +	struct be_queue_info *mccq = &phba->ctrl.mcc_obj.q;
> +	u32 val = 0;
> +
> +	set_bit(MCC_TAG_STATE_RUNNING, &phba->ctrl.ptag_state[tag].tag_state);
> +	val |= mccq->id & DB_MCCQ_RING_ID_MASK;
> +	val |= 1 << DB_MCCQ_NUM_POSTED_SHIFT;
> +	/* make request available for DMA */
> +	wmb();
> +	iowrite32(val, phba->db_va + DB_MCCQ_OFFSET);
>  }
>  
>  /*
> -- 
> 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