diff mbox series

scsi: ufs: add missing host_lock in setup_xfer_req

Message ID 20210701005117.3846179-1-jaegeuk@kernel.org
State New
Headers show
Series scsi: ufs: add missing host_lock in setup_xfer_req | expand

Commit Message

Jaegeuk Kim July 1, 2021, 12:51 a.m. UTC
This patch adds a host_lock which existed before on ufshcd_vops_setup_xfer_req.

Cc: Stanley Chu <stanley.chu@mediatek.com>
Cc: Can Guo <cang@codeaurora.org>
Cc: Bean Huo <beanhuo@micron.com>
Cc: Bart Van Assche <bvanassche@acm.org>
Cc: Asutosh Das <asutoshd@codeaurora.org>
Fixes: a45f937110fa ("scsi: ufs: Optimize host lock on transfer requests send/compl paths")
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
---
 drivers/scsi/ufs/ufshcd.h | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)

Comments

Bart Van Assche July 1, 2021, 3:23 p.m. UTC | #1
On 6/30/21 5:51 PM, Jaegeuk Kim wrote:
> diff --git a/drivers/scsi/ufs/ufshcd.h b/drivers/scsi/ufs/ufshcd.h
> index c98d540ac044..194755c9ddfe 100644
> --- a/drivers/scsi/ufs/ufshcd.h
> +++ b/drivers/scsi/ufs/ufshcd.h
> @@ -1229,8 +1229,13 @@ static inline int ufshcd_vops_pwr_change_notify(struct ufs_hba *hba,
>  static inline void ufshcd_vops_setup_xfer_req(struct ufs_hba *hba, int tag,
>  					bool is_scsi_cmd)
>  {
> -	if (hba->vops && hba->vops->setup_xfer_req)
> -		return hba->vops->setup_xfer_req(hba, tag, is_scsi_cmd);
> +	if (hba->vops && hba->vops->setup_xfer_req) {
> +		unsigned long flags;
> +
> +		spin_lock_irqsave(hba->host->host_lock, flags);
> +		hba->vops->setup_xfer_req(hba, tag, is_scsi_cmd);
> +		spin_unlock_irqrestore(hba->host->host_lock, flags);
> +	}
>  }

Since this function has only one caller, how about moving it into ufshcd.c?

Thanks,

Bart.
Bart Van Assche July 13, 2021, 7:06 p.m. UTC | #2
On 6/30/21 5:51 PM, Jaegeuk Kim wrote:
> This patch adds a host_lock which existed before on ufshcd_vops_setup_xfer_req.

> 

> Cc: Stanley Chu <stanley.chu@mediatek.com>

> Cc: Can Guo <cang@codeaurora.org>

> Cc: Bean Huo <beanhuo@micron.com>

> Cc: Bart Van Assche <bvanassche@acm.org>

> Cc: Asutosh Das <asutoshd@codeaurora.org>

> Fixes: a45f937110fa ("scsi: ufs: Optimize host lock on transfer requests send/compl paths")

> Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>

> ---

>   drivers/scsi/ufs/ufshcd.h | 9 +++++++--

>   1 file changed, 7 insertions(+), 2 deletions(-)

> 

> diff --git a/drivers/scsi/ufs/ufshcd.h b/drivers/scsi/ufs/ufshcd.h

> index c98d540ac044..194755c9ddfe 100644

> --- a/drivers/scsi/ufs/ufshcd.h

> +++ b/drivers/scsi/ufs/ufshcd.h

> @@ -1229,8 +1229,13 @@ static inline int ufshcd_vops_pwr_change_notify(struct ufs_hba *hba,

>   static inline void ufshcd_vops_setup_xfer_req(struct ufs_hba *hba, int tag,

>   					bool is_scsi_cmd)

>   {

> -	if (hba->vops && hba->vops->setup_xfer_req)

> -		return hba->vops->setup_xfer_req(hba, tag, is_scsi_cmd);

> +	if (hba->vops && hba->vops->setup_xfer_req) {

> +		unsigned long flags;

> +

> +		spin_lock_irqsave(hba->host->host_lock, flags);

> +		hba->vops->setup_xfer_req(hba, tag, is_scsi_cmd);

> +		spin_unlock_irqrestore(hba->host->host_lock, flags);

> +	}

>   }

>   

>   static inline void ufshcd_vops_setup_task_mgmt(struct ufs_hba *hba,


Can anyone help with reviewing this patch?

Thanks,

Bart.
Bean Huo July 13, 2021, 7:45 p.m. UTC | #3
On Tue, 2021-07-13 at 12:06 -0700, Bart Van Assche wrote:
> > --- a/drivers/scsi/ufs/ufshcd.h

> > +++ b/drivers/scsi/ufs/ufshcd.h

> > @@ -1229,8 +1229,13 @@ static inline int

> > ufshcd_vops_pwr_change_notify(struct ufs_hba *hba,

> >    static inline void ufshcd_vops_setup_xfer_req(struct ufs_hba

> > *hba, int tag,

> >                                        bool is_scsi_cmd)

> >    {

> > -     if (hba->vops && hba->vops->setup_xfer_req)

> > -             return hba->vops->setup_xfer_req(hba, tag,

> > is_scsi_cmd);

> > +     if (hba->vops && hba->vops->setup_xfer_req) {

> > +             unsigned long flags;

> > +

> > +             spin_lock_irqsave(hba->host->host_lock, flags);

> > +             hba->vops->setup_xfer_req(hba, tag, is_scsi_cmd);

> > +             spin_unlock_irqrestore(hba->host->host_lock, flags);

> > +     }

> >    }

> >    

> >    static inline void ufshcd_vops_setup_task_mgmt(struct ufs_hba

> > *hba,

> 

> 

> Can anyone help with reviewing this patch?

> 

> 

> 

> Thanks,

> 

> 

> 

Hi Bart,
This change only impacts on the Samsung exynos platform. and Can's
optimization patch is to optimise the host_lock,, and removed
host_lock, now add back in this function makes sense to me.
but I am thinking how about hba->host_sem?

Bean

Bean

> Bart.
Bart Van Assche July 14, 2021, 6:09 p.m. UTC | #4
On 7/13/21 12:45 PM, Bean Huo wrote:
> This change only impacts on the Samsung exynos platform. and Can's

> optimization patch is to optimise the host_lock,, and removed

> host_lock, now add back in this function makes sense to me.

> but I am thinking how about hba->host_sem?


Hi Bean,

Calls of exynos_ufs_specify_nexus_t_xfer_req() must be serialized, hence 
Jaegeuks' patch. This function is called from the I/O submission path so 
performance matters. My understanding is that spinlocks have less 
overhead than semaphores. Hence the choice for a spinlock.

Thanks,

Bart.
Bean Huo July 14, 2021, 9:22 p.m. UTC | #5
On Wed, 2021-07-14 at 11:09 -0700, Bart Van Assche wrote:
> On 7/13/21 12:45 PM, Bean Huo wrote:

> 

> > This change only impacts on the Samsung exynos platform. and Can's

> > optimization patch is to optimise the host_lock,, and removed

> > host_lock, now add back in this function makes sense to me.

> > but I am thinking how about hba->host_sem?

> 

> 

> Hi Bean,

> 

> 

> 

> Calls of exynos_ufs_specify_nexus_t_xfer_req() must be serialized,

> hence 

> 

> Jaegeuks' patch. This function is called from the I/O submission path

> so 

> 

> performance matters. My understanding is that spinlocks have less 

> 

> overhead than semaphores. Hence the choice for a spinlock.

> 

> 

> 

> Thanks,


> 

Bart,

After adding spin_lock/unlock_irqsave()
in ufshcd_vops_setup_xfer_req(), there will be 4 times of call of
host_lock lock/unlock in ufshcd_send_command(). Reduce the code scope
of protection, but increase the number of calls to
spin_lock/unlock_irqsave().  Almost each sub-funciton
in ufshcd_send_command() calls spin_lock/unlock_irqsave(). why not
directly take spin_lock/unlock_irqsave() away from each sub-fun, and
increase the scope in ufshcd_send_command()?

Bean







> Bart
diff mbox series

Patch

diff --git a/drivers/scsi/ufs/ufshcd.h b/drivers/scsi/ufs/ufshcd.h
index c98d540ac044..194755c9ddfe 100644
--- a/drivers/scsi/ufs/ufshcd.h
+++ b/drivers/scsi/ufs/ufshcd.h
@@ -1229,8 +1229,13 @@  static inline int ufshcd_vops_pwr_change_notify(struct ufs_hba *hba,
 static inline void ufshcd_vops_setup_xfer_req(struct ufs_hba *hba, int tag,
 					bool is_scsi_cmd)
 {
-	if (hba->vops && hba->vops->setup_xfer_req)
-		return hba->vops->setup_xfer_req(hba, tag, is_scsi_cmd);
+	if (hba->vops && hba->vops->setup_xfer_req) {
+		unsigned long flags;
+
+		spin_lock_irqsave(hba->host->host_lock, flags);
+		hba->vops->setup_xfer_req(hba, tag, is_scsi_cmd);
+		spin_unlock_irqrestore(hba->host->host_lock, flags);
+	}
 }
 
 static inline void ufshcd_vops_setup_task_mgmt(struct ufs_hba *hba,