[PATCH v2] block: change rq_integrity_vec to respect the iterator
Mikulas Patocka
mpatocka at redhat.com
Thu May 23 08:11:16 PDT 2024
On Thu, 23 May 2024, Jens Axboe wrote:
> On 5/23/24 8:58 AM, Mikulas Patocka wrote:
> > Here I'm resending the patch with the function rq_integrity_vec removed if
> > CONFIG_BLK_DEV_INTEGRITY is not defined.
>
> That looks better - but can you please just post a full new series,
> that's a lot easier to deal with and look at than adding a v2 of one
> patch in the thread.
OK, I'll post both patches.
> > @@ -853,16 +855,20 @@ static blk_status_t nvme_prep_rq(struct
> > goto out_free_cmd;
> > }
> >
> > +#ifdef CONFIG_BLK_DEV_INTEGRITY
> > if (blk_integrity_rq(req)) {
> > ret = nvme_map_metadata(dev, req, &iod->cmd);
> > if (ret)
> > goto out_unmap_data;
> > }
> > +#endif
>
> if (IS_ENABLED(CONFIG_BLK_DEV_INTEGRITY) && blk_integrity_rq(req)) {
>
> ?
That wouldn't work, because the calls to rq_integrity_vec need to be
eliminated by the preprocessor.
Should I change rq_integrity_vec to this? Then, we could get rid of the
ifdefs and let the optimizer remove all calls to rq_integrity_vec.
static inline struct bio_vec rq_integrity_vec(struct request *rq)
{
struct bio_vec bv = { };
return bv;
}
> > @@ -962,12 +968,14 @@ static __always_inline void nvme_pci_unm
> > struct nvme_queue *nvmeq = req->mq_hctx->driver_data;
> > struct nvme_dev *dev = nvmeq->dev;
> >
> > +#ifdef CONFIG_BLK_DEV_INTEGRITY
> > if (blk_integrity_rq(req)) {
> > struct nvme_iod *iod = blk_mq_rq_to_pdu(req);
>
> Ditto
>
> > Index: linux-2.6/include/linux/blk-integrity.h
> > ===================================================================
> > --- linux-2.6.orig/include/linux/blk-integrity.h
> > +++ linux-2.6/include/linux/blk-integrity.h
> > @@ -109,11 +109,11 @@ static inline bool blk_integrity_rq(stru
> > * Return the first bvec that contains integrity data. Only drivers that are
> > * limited to a single integrity segment should use this helper.
> > */
> > -static inline struct bio_vec *rq_integrity_vec(struct request *rq)
> > +static inline struct bio_vec rq_integrity_vec(struct request *rq)
> > {
> > - if (WARN_ON_ONCE(queue_max_integrity_segments(rq->q) > 1))
> > - return NULL;
> > - return rq->bio->bi_integrity->bip_vec;
> > + WARN_ON_ONCE(queue_max_integrity_segments(rq->q) > 1);
> > + return mp_bvec_iter_bvec(rq->bio->bi_integrity->bip_vec,
> > + rq->bio->bi_integrity->bip_iter);
> > }
>
> Not clear why the return on integrity segments > 1 is removed?
Because we can't return NULL. But I can leave it there, print a warning
and return the first vector.
Mikulas
> --
> Jens Axboe
>
More information about the Linux-nvme
mailing list