All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] block: loop: mark bvec as ITER_BVEC_FLAG_NO_REF
@ 2019-03-28  3:05 Ming Lei
  2019-03-28 14:18 ` Jens Axboe
  2019-03-28 15:02 ` Christoph Hellwig
  0 siblings, 2 replies; 4+ messages in thread
From: Ming Lei @ 2019-03-28  3:05 UTC (permalink / raw)
  To: Jens Axboe; +Cc: linux-block, Ming Lei, linux-fsdevel, Christoph Hellwig

loop is one block device, for any bio submitted to this device,
the upper layer does guarantee that pages added to loop's bio won't
go away when the bio is in-flight.

So mark loop's bvec as ITER_BVEC_FLAG_NO_REF then get_page/put_page
can be saved for serving loop's IO.

Cc: linux-fsdevel@vger.kernel.org
Cc: Christoph Hellwig <hch@infradead.org>
Signed-off-by: Ming Lei <ming.lei@redhat.com>
---
 drivers/block/loop.c | 16 ++++++++++++----
 1 file changed, 12 insertions(+), 4 deletions(-)

diff --git a/drivers/block/loop.c b/drivers/block/loop.c
index bf1c61cab8eb..3d25611eebdc 100644
--- a/drivers/block/loop.c
+++ b/drivers/block/loop.c
@@ -264,12 +264,20 @@ lo_do_transfer(struct loop_device *lo, int cmd,
 	return ret;
 }
 
+static inline void loop_iov_iter_bvec(struct iov_iter *i,
+		unsigned int direction, const struct bio_vec *bvec,
+		unsigned long nr_segs, size_t count)
+{
+	iov_iter_bvec(i, direction, bvec, nr_segs, count);
+	i->type |= ITER_BVEC_FLAG_NO_REF;
+}
+
 static int lo_write_bvec(struct file *file, struct bio_vec *bvec, loff_t *ppos)
 {
 	struct iov_iter i;
 	ssize_t bw;
 
-	iov_iter_bvec(&i, WRITE, bvec, 1, bvec->bv_len);
+	loop_iov_iter_bvec(&i, WRITE, bvec, 1, bvec->bv_len);
 
 	file_start_write(file);
 	bw = vfs_iter_write(file, &i, ppos, 0);
@@ -347,7 +355,7 @@ static int lo_read_simple(struct loop_device *lo, struct request *rq,
 	ssize_t len;
 
 	rq_for_each_segment(bvec, rq, iter) {
-		iov_iter_bvec(&i, READ, &bvec, 1, bvec.bv_len);
+		loop_iov_iter_bvec(&i, READ, &bvec, 1, bvec.bv_len);
 		len = vfs_iter_read(lo->lo_backing_file, &i, &pos, 0);
 		if (len < 0)
 			return len;
@@ -388,7 +396,7 @@ static int lo_read_transfer(struct loop_device *lo, struct request *rq,
 		b.bv_offset = 0;
 		b.bv_len = bvec.bv_len;
 
-		iov_iter_bvec(&i, READ, &b, 1, b.bv_len);
+		loop_iov_iter_bvec(&i, READ, &b, 1, b.bv_len);
 		len = vfs_iter_read(lo->lo_backing_file, &i, &pos, 0);
 		if (len < 0) {
 			ret = len;
@@ -555,7 +563,7 @@ static int lo_rw_aio(struct loop_device *lo, struct loop_cmd *cmd,
 	}
 	atomic_set(&cmd->ref, 2);
 
-	iov_iter_bvec(&iter, rw, bvec, nr_bvec, blk_rq_bytes(rq));
+	loop_iov_iter_bvec(&iter, rw, bvec, nr_bvec, blk_rq_bytes(rq));
 	iter.iov_offset = offset;
 
 	cmd->iocb.ki_pos = pos;
-- 
2.9.5


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH] block: loop: mark bvec as ITER_BVEC_FLAG_NO_REF
  2019-03-28  3:05 [PATCH] block: loop: mark bvec as ITER_BVEC_FLAG_NO_REF Ming Lei
@ 2019-03-28 14:18 ` Jens Axboe
  2019-03-28 15:02 ` Christoph Hellwig
  1 sibling, 0 replies; 4+ messages in thread
From: Jens Axboe @ 2019-03-28 14:18 UTC (permalink / raw)
  To: Ming Lei; +Cc: linux-block, linux-fsdevel, Christoph Hellwig

On 3/27/19 9:05 PM, Ming Lei wrote:
> loop is one block device, for any bio submitted to this device,
> the upper layer does guarantee that pages added to loop's bio won't
> go away when the bio is in-flight.
> 
> So mark loop's bvec as ITER_BVEC_FLAG_NO_REF then get_page/put_page
> can be saved for serving loop's IO.

Curious if this is a noticable win on loop? In any case, looks
fine to me, I'll queue it up for 5.2.

-- 
Jens Axboe


^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH] block: loop: mark bvec as ITER_BVEC_FLAG_NO_REF
  2019-03-28  3:05 [PATCH] block: loop: mark bvec as ITER_BVEC_FLAG_NO_REF Ming Lei
  2019-03-28 14:18 ` Jens Axboe
@ 2019-03-28 15:02 ` Christoph Hellwig
  2019-03-28 15:07   ` Jens Axboe
  1 sibling, 1 reply; 4+ messages in thread
From: Christoph Hellwig @ 2019-03-28 15:02 UTC (permalink / raw)
  To: Ming Lei; +Cc: Jens Axboe, linux-block, linux-fsdevel, Christoph Hellwig

> +	iov_iter_bvec(i, direction, bvec, nr_segs, count);
> +	i->type |= ITER_BVEC_FLAG_NO_REF;
> +}

What about simply providing a iov_iter_bvec_noref in core code and
also using that in io_uring?

Otherwise this looks fine to me.

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH] block: loop: mark bvec as ITER_BVEC_FLAG_NO_REF
  2019-03-28 15:02 ` Christoph Hellwig
@ 2019-03-28 15:07   ` Jens Axboe
  0 siblings, 0 replies; 4+ messages in thread
From: Jens Axboe @ 2019-03-28 15:07 UTC (permalink / raw)
  To: Christoph Hellwig, Ming Lei; +Cc: linux-block, linux-fsdevel

On 3/28/19 9:02 AM, Christoph Hellwig wrote:
>> +	iov_iter_bvec(i, direction, bvec, nr_segs, count);
>> +	i->type |= ITER_BVEC_FLAG_NO_REF;
>> +}
> 
> What about simply providing a iov_iter_bvec_noref in core code and
> also using that in io_uring?
> 
> Otherwise this looks fine to me.

I'd be fine with that helper.

-- 
Jens Axboe


^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2019-03-28 15:07 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-03-28  3:05 [PATCH] block: loop: mark bvec as ITER_BVEC_FLAG_NO_REF Ming Lei
2019-03-28 14:18 ` Jens Axboe
2019-03-28 15:02 ` Christoph Hellwig
2019-03-28 15:07   ` Jens Axboe

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.