On 2/4/24 12:56, Ming Lei wrote:
> On Fri, Feb 02, 2024 at 04:30:44PM +0900, Damien Le Moal wrote:
>> +/*
>> + * Zone write plug flags bits:
>> + * - BLK_ZONE_WPLUG_CONV: Indicate that the zone is a conventional one. Writes
>> + * to these zones are never plugged.
>> + * - BLK_ZONE_WPLUG_PLUGGED: Indicate that the zone write plug is plugged,
>> + * that is, that write BIOs are being throttled due to a write BIO already
>> + * being executed or the zone write plug bio list is not empty.
>> + */
>> +#define BLK_ZONE_WPLUG_CONV (1U << 0)
>> +#define BLK_ZONE_WPLUG_PLUGGED (1U << 1)
>
> BLK_ZONE_WPLUG_PLUGGED == !bio_list_empty(&zwplug->bio_list), so looks
> this flag isn't necessary.
No, it is. As the description says, the flag not only indicates that there are
plugged BIOs, but it also indicates that there is a write for the zone
in-flight. And that can happen even with the BIO list being empty. E.g. for a
qd=1 workload of small BIOs, no BIO will ever be added to the BIO list, but the
zone still must be marked as "plugged" when a write BIO is issued for it.
>> +static inline void blk_zone_wplug_add_bio(struct blk_zone_wplug *zwplug,
>> + struct bio *bio, unsigned int nr_segs)
>> +{
>> + /*
>> + * Keep a reference on the BIO request queue usage. This reference will
>> + * be dropped either if the BIO is failed or after it is issued and
>> + * completes.
>> + */
>> + percpu_ref_get(&bio->bi_bdev->bd_disk->queue->q_usage_counter);
>
> It is fragile to get nested usage_counter, and same with grabbing/releasing it
> from different contexts or even functions, and it could be much better to just
> let block layer maintain it.
>
> From patch 23's change:
>
> + * Zoned block device information. Reads of this information must be
> + * protected with blk_queue_enter() / blk_queue_exit(). Modifying this
>
> Anytime if there is in-flight bio, the block device is opened, so both gendisk and
> request_queue are live, so not sure if this .q_usage_counter protection
> is needed.
Hannes also commented about this. Let me revisit this.
>> + /*
>> + * blk-mq devices will reuse the reference on the request queue usage
>> + * we took when the BIO was plugged, but the submission path for
>> + * BIO-based devices will not do that. So drop this reference here.
>> + */
>> + if (bio->bi_bdev->bd_has_submit_bio)
>> + blk_queue_exit(bio->bi_bdev->bd_disk->queue);
>
> But I don't see where this reference is reused for blk-mq in this patch,
> care to point it out?
This patch modifies blk_mq_submit_bio() to add a "goto new_request" at the top
for any BIO flagged with BIO_FLAG_ZONE_WRITE_PLUGGING. So when a plugged BIO is
unplugged and submitted again, the reference that was taken in
blk_zone_wplug_add_bio() is reused for the new request for that BIO.
--
Damien Le Moal
Western Digital Research