[PATCH v2] block: change rq_integrity_vec to respect the iterator
Anuj gupta
anuj1072538 at gmail.com
Thu May 23 08:22:28 PDT 2024
On Thu, May 23, 2024 at 8:41 PM Mikulas Patocka <mpatocka at redhat.com> wrote:
>
>
>
> 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;
> }
This can be reduced to
return (struct bio_vec){ };
>
> > > @@ -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
> >
>
>
--
Anuj Gupta
More information about the Linux-nvme
mailing list