On Mon, Apr 10, 2023 at 04:55:03PM +0530, Kanchan Joshi wrote: > On Fri, Apr 07, 2023 at 12:16:33PM -0700, Keith Busch wrote: > > +static void nvme_uring_bio_end_io(struct bio *bio) > > +{ > > + blk_rq_unmap_user(bio); > > +} > > + > > static int nvme_map_user_request(struct request *req, u64 ubuffer, > > unsigned bufflen, void __user *meta_buffer, unsigned meta_len, > > u32 meta_seed, void **metap, struct io_uring_cmd *ioucmd, > > @@ -204,6 +209,7 @@ static int nvme_map_user_request(struct request *req, u64 ubuffer, > > *metap = meta; > > } > > > > + bio->bi_end_io = nvme_uring_bio_end_io; > > return ret; > > > > out_unmap: > > @@ -249,8 +255,6 @@ static int nvme_submit_user_cmd(struct request_queue *q, > > if (meta) > > ret = nvme_finish_user_metadata(req, meta_buffer, meta, > > meta_len, ret); > > - if (bio) > > - blk_rq_unmap_user(bio); > > Is it safe to call blk_rq_unamp_user in irq context? Doh! I boxed my thinking into the polling mode that completely neglected the more common use case. Thanks, now back to the drawing board for me...