> On 10/11/2021 02:44, Bart Van Assche wrote: > > Remove the clock scaling lock from ufshcd_queuecommand() since it is a > > performance bottleneck. As requested by Asutosh Das, change the > > behavior of ufshcd_clock_scaling_prepare() from waiting until all > > pending commands have finished into quiescing request queues. Insert a > > rcu_read_lock() / rcu_read_unlock() pair in ufshcd_queuecommand() and > > also in __ufshcd_issue_tm_cmd(). Use synchronize_rcu_expedited() to > > wait for ongoing command and TMF queueing. > > > > Signed-off-by: Bart Van Assche <bvanassche@xxxxxxx> > > --- > > drivers/scsi/ufs/ufshcd.c | 121 +++++++++++++------------------------- > > drivers/scsi/ufs/ufshcd.h | 1 + > > 2 files changed, 42 insertions(+), 80 deletions(-) > > > > <SNIP> > > > @@ -2698,8 +2653,11 @@ static int ufshcd_queuecommand(struct Scsi_Host > > *host, struct scsi_cmnd *cmd) > > > > WARN_ONCE(tag < 0, "Invalid tag %d\n", tag); > > > > - if (!down_read_trylock(&hba->clk_scaling_lock)) > > - return SCSI_MLQUEUE_HOST_BUSY; > > + /* > > + * Allows ufshcd_clock_scaling_prepare() and also the UFS error handler > > + * to wait for prior ufshcd_queuecommand() calls. > > + */ > > + rcu_read_lock(); > > The improvement to flush/drain ufshcd_queuecommand() via RCU should be a > separate patch because it is not dependent on the other changes. Ack on that. Thanks, Avri > > <SNIP>