On 12/8/21 9:28 AM, Asutosh Das (asd) wrote:
On 12/6/2021 2:41 PM, Asutosh Das (asd) wrote:
+static u32 ufshcd_pending_cmds(struct ufs_hba *hba)
+{
+ struct scsi_device *sdev;
+ u32 pending = 0;
+
+ shost_for_each_device(sdev, hba->host)
+ pending += sbitmap_weight(&sdev->budget_map);
+
I was porting this change to my downstream code and it occurred to me that in a high IO rate scenario it's possible that bits in the budget_map may be set even when that particular IO may not be issued to driver. So there would unnecessary waiting for that to be cleared.
Do you think it's possible?
I think we should wait only for requests which are already started.
e.g. blk_mq_tagset_busy_iter() ?
Hi Asutosh,
Using blk_mq_tagset_busy_iter() would be racy since the "busy" state is set
after host_self_blocked has been checked.
Checking the budget_map should work fine since a bit in that bitmap is set
just before scsi_queue_rq() is called and since the corresponding bit is
cleared from that bitmap if scsi_queue_rq() fails or if a command is completed.
See also the output of the following command:
git grep -nHE 'blk_mq_(get|put)_dispatch_budget\('
See also the blk_mq_release_budgets() call in blk_mq_dispatch_rq_list().
Thanks,
Bart.