Message ID | 20241112170050.1612998-2-hch@lst.de |
---|---|
State | New |
Headers | show |
Series | [1/2] block: remove the write_hint field from struct request | expand |
On 11/12/24 9:00 AM, Christoph Hellwig wrote: > - /* Don't merge requests with different write hints. */ > - if (req->write_hint != next->write_hint) > - return NULL; > + if (req->bio && next->bio) { > + /* Don't merge requests with different write hints. */ > + if (req->bio->bi_write_hint != next->bio->bi_write_hint) > + return NULL; > + } The above two if-statements can be combined into a single if-statement. > @@ -1001,9 +1003,11 @@ bool blk_rq_merge_ok(struct request *rq, struct bio *bio) > if (!bio_crypt_rq_ctx_compatible(rq, bio)) > return false; > > - /* Don't merge requests with different write hints. */ > - if (rq->write_hint != bio->bi_write_hint) > - return false; > + if (rq->bio) { > + /* Don't merge requests with different write hints. */ > + if (rq->bio->bi_write_hint != bio->bi_write_hint) > + return false; > + } Same comment here: the above two if-statements can also be combined into a single if-statement. Otherwise this patch looks good to me. Thanks, Bart.
On 11/12/24 10:29 AM, Bart Van Assche wrote: > On 11/12/24 9:00 AM, Christoph Hellwig wrote: >> - /* Don't merge requests with different write hints. */ >> - if (req->write_hint != next->write_hint) >> - return NULL; >> + if (req->bio && next->bio) { >> + /* Don't merge requests with different write hints. */ >> + if (req->bio->bi_write_hint != next->bio->bi_write_hint) >> + return NULL; >> + } > > The above two if-statements can be combined into a single if-statement. > >> @@ -1001,9 +1003,11 @@ bool blk_rq_merge_ok(struct request *rq, struct >> bio *bio) >> if (!bio_crypt_rq_ctx_compatible(rq, bio)) >> return false; >> - /* Don't merge requests with different write hints. */ >> - if (rq->write_hint != bio->bi_write_hint) >> - return false; >> + if (rq->bio) { >> + /* Don't merge requests with different write hints. */ >> + if (rq->bio->bi_write_hint != bio->bi_write_hint) >> + return false; >> + } > > Same comment here: the above two if-statements can also be combined into > a single if-statement. > > Otherwise this patch looks good to me. (replying to my own email) Since apparently the goal is to minimize diffs in the next patch, Reviewed-by: Bart Van Assche <bvanassche@acm.org>
diff --git a/block/blk-merge.c b/block/blk-merge.c index 7b0af8317c1c..2306014c108d 100644 --- a/block/blk-merge.c +++ b/block/blk-merge.c @@ -867,9 +867,11 @@ static struct request *attempt_merge(struct request_queue *q, if (rq_data_dir(req) != rq_data_dir(next)) return NULL; - /* Don't merge requests with different write hints. */ - if (req->write_hint != next->write_hint) - return NULL; + if (req->bio && next->bio) { + /* Don't merge requests with different write hints. */ + if (req->bio->bi_write_hint != next->bio->bi_write_hint) + return NULL; + } if (req->ioprio != next->ioprio) return NULL; @@ -1001,9 +1003,11 @@ bool blk_rq_merge_ok(struct request *rq, struct bio *bio) if (!bio_crypt_rq_ctx_compatible(rq, bio)) return false; - /* Don't merge requests with different write hints. */ - if (rq->write_hint != bio->bi_write_hint) - return false; + if (rq->bio) { + /* Don't merge requests with different write hints. */ + if (rq->bio->bi_write_hint != bio->bi_write_hint) + return false; + } if (rq->ioprio != bio_prio(bio)) return false; diff --git a/block/blk-mq.c b/block/blk-mq.c index 5e240a4b6be0..65e6b86d341c 100644 --- a/block/blk-mq.c +++ b/block/blk-mq.c @@ -2660,7 +2660,6 @@ static void blk_mq_bio_to_request(struct request *rq, struct bio *bio, rq->cmd_flags |= REQ_FAILFAST_MASK; rq->__sector = bio->bi_iter.bi_sector; - rq->write_hint = bio->bi_write_hint; blk_rq_bio_prep(rq, bio, nr_segs); if (bio_integrity(bio)) rq->nr_integrity_segments = blk_rq_count_integrity_sg(rq->q, @@ -3308,7 +3307,6 @@ int blk_rq_prep_clone(struct request *rq, struct request *rq_src, } rq->nr_phys_segments = rq_src->nr_phys_segments; rq->ioprio = rq_src->ioprio; - rq->write_hint = rq_src->write_hint; if (rq->bio && blk_crypto_rq_bio_prep(rq, rq->bio, gfp_mask) < 0) goto free_and_out; diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c index ca4bc0ac76ad..8947dab132d7 100644 --- a/drivers/scsi/sd.c +++ b/drivers/scsi/sd.c @@ -1190,8 +1190,8 @@ static u8 sd_group_number(struct scsi_cmnd *cmd) if (!sdkp->rscs) return 0; - return min3((u32)rq->write_hint, (u32)sdkp->permanent_stream_count, - 0x3fu); + return min3((u32)rq->bio->bi_write_hint, + (u32)sdkp->permanent_stream_count, 0x3fu); } static blk_status_t sd_setup_rw32_cmnd(struct scsi_cmnd *cmd, bool write, @@ -1389,7 +1389,7 @@ static blk_status_t sd_setup_read_write_cmnd(struct scsi_cmnd *cmd) ret = sd_setup_rw16_cmnd(cmd, write, lba, nr_blocks, protect | fua, dld); } else if ((nr_blocks > 0xff) || (lba > 0x1fffff) || - sdp->use_10_for_rw || protect || rq->write_hint) { + sdp->use_10_for_rw || protect || rq->bio->bi_write_hint) { ret = sd_setup_rw10_cmnd(cmd, write, lba, nr_blocks, protect | fua); } else { diff --git a/include/linux/blk-mq.h b/include/linux/blk-mq.h index 2035fad3131f..2804fe181d9d 100644 --- a/include/linux/blk-mq.h +++ b/include/linux/blk-mq.h @@ -156,7 +156,6 @@ struct request { struct blk_crypto_keyslot *crypt_keyslot; #endif - enum rw_hint write_hint; unsigned short ioprio; enum mq_rq_state state;
The write_hint is only used for read/write requests, which must have a bio attached to them. Just use the bio field instead. Signed-off-by: Christoph Hellwig <hch@lst.de> --- block/blk-merge.c | 16 ++++++++++------ block/blk-mq.c | 2 -- drivers/scsi/sd.c | 6 +++--- include/linux/blk-mq.h | 1 - 4 files changed, 13 insertions(+), 12 deletions(-)