[dm-devel] [RFC PATCH V2 2/3] block: add ->poll_bio to block_device_operations
Christoph Hellwig
hch at lst.de
Mon Jun 21 07:25:02 UTC 2021
> + struct gendisk *disk = bio->bi_bdev->bd_disk;
> + struct request_queue *q = disk->queue;
> blk_qc_t cookie = READ_ONCE(bio->bi_cookie);
> int ret;
>
> - if (cookie == BLK_QC_T_NONE || !blk_queue_poll(q))
> + if ((queue_is_mq(q) && cookie == BLK_QC_T_NONE) ||
> + !blk_queue_poll(q))
> return 0;
How does polling for a bio without a cookie make sense even when
polling bio based?
But if we come up for a good rationale for this I'd really
split the conditions to make them more readable:
if (!test_bit(QUEUE_FLAG_POLL, &q->queue_flags))
return 0;
if (queue_is_mq(q) && cookie == BLK_QC_T_NONE)
return 0;
> + if (!queue_is_mq(q)) {
> + if (disk->fops->poll_bio) {
> + ret = disk->fops->poll_bio(bio, flags);
> + } else {
> + WARN_ON_ONCE(1);
> + ret = 0;
> + }
> + } else {
> ret = blk_mq_poll(q, cookie, flags);
I'd go for someting like:
if (queue_is_mq(q))
ret = blk_mq_poll(q, cookie, flags);
else if (disk->fops->poll_bio)
ret = disk->fops->poll_bio(bio, flags);
else
WARN_ON_ONCE(1);
with ret initialized to 0 at declaration time.
> struct block_device_operations {
> void (*submit_bio)(struct bio *bio);
> + /* ->poll_bio is for bio driver only */
I'd drop the comment, this is already nicely documented in add_disk
together with the actual check. We also don't note this for submit_bio
here.
More information about the dm-devel
mailing list