* [PATCH 0/8] loop: improve dio on backing file
@ 2021-10-25 9:44 Ming Lei
2021-10-25 9:44 ` [PATCH 1/8] loop: move flush_dcache_page to ->complete of request Ming Lei
` (7 more replies)
0 siblings, 8 replies; 15+ messages in thread
From: Ming Lei @ 2021-10-25 9:44 UTC (permalink / raw)
To: Jens Axboe; +Cc: linux-block, Christoph Hellwig, Ming Lei
Hello,
Improve dio on backing file:
1) cover simple read/write via aio style(lo_rw_aio)
2) fallback to buffered io in case of dio failure
3) relax dio use condition and not check if lo->lo_offset & loop queue's
bs is aligned with backing queue
4) enable backing dio at default(RFC)
Ming Lei (8):
loop: move flush_dcache_page to ->complete of request
loop: remove always true check
loop: add one helper for submitting IO on backing file
loop: cover simple read/write via lo_rw_aio()
loop: fallback to buffered IO in case of dio submission
loop: relax loop dio use condition
loop: remove lo->use_dio
loop: use backing dio at default
drivers/block/loop.c | 182 +++++++++++++------------------------------
drivers/block/loop.h | 2 +-
2 files changed, 57 insertions(+), 127 deletions(-)
--
2.31.1
^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH 1/8] loop: move flush_dcache_page to ->complete of request
2021-10-25 9:44 [PATCH 0/8] loop: improve dio on backing file Ming Lei
@ 2021-10-25 9:44 ` Ming Lei
2021-10-26 7:21 ` Christoph Hellwig
2021-10-25 9:44 ` [PATCH 2/8] loop: remove always true check Ming Lei
` (6 subsequent siblings)
7 siblings, 1 reply; 15+ messages in thread
From: Ming Lei @ 2021-10-25 9:44 UTC (permalink / raw)
To: Jens Axboe; +Cc: linux-block, Christoph Hellwig, Ming Lei
Prepare for unifying backing buffered IO code, so move
flush_dcache_page() into ->complete() of read request.
Signed-off-by: Ming Lei <ming.lei@redhat.com>
---
drivers/block/loop.c | 15 +++++++++++++--
1 file changed, 13 insertions(+), 2 deletions(-)
diff --git a/drivers/block/loop.c b/drivers/block/loop.c
index 7bf4686af774..8f140d637435 100644
--- a/drivers/block/loop.c
+++ b/drivers/block/loop.c
@@ -405,8 +405,6 @@ static int lo_read_simple(struct loop_device *lo, struct request *rq,
if (len < 0)
return len;
- flush_dcache_page(bvec.bv_page);
-
if (len != bvec.bv_len) {
struct bio *bio;
@@ -507,11 +505,24 @@ static int lo_req_flush(struct loop_device *lo, struct request *rq)
return ret;
}
+static void lo_flush_dcache_for_read(struct request *rq)
+{
+ struct bio_vec bvec;
+ struct req_iterator iter;
+
+ rq_for_each_segment(bvec, rq, iter)
+ flush_dcache_page(bvec.bv_page);
+}
+
static void lo_complete_rq(struct request *rq)
{
struct loop_cmd *cmd = blk_mq_rq_to_pdu(rq);
blk_status_t ret = BLK_STS_OK;
+ /* Kernel wrote to our pages, call flush_dcache_page */
+ if (req_op(rq) == REQ_OP_READ && !cmd->use_aio && cmd->ret >= 0)
+ lo_flush_dcache_for_read(rq);
+
if (!cmd->use_aio || cmd->ret < 0 || cmd->ret == blk_rq_bytes(rq) ||
req_op(rq) != REQ_OP_READ) {
if (cmd->ret < 0)
--
2.31.1
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH 2/8] loop: remove always true check
2021-10-25 9:44 [PATCH 0/8] loop: improve dio on backing file Ming Lei
2021-10-25 9:44 ` [PATCH 1/8] loop: move flush_dcache_page to ->complete of request Ming Lei
@ 2021-10-25 9:44 ` Ming Lei
2021-10-26 7:31 ` Christoph Hellwig
2021-10-25 9:44 ` [PATCH 3/8] loop: add one helper for submitting IO on backing file Ming Lei
` (5 subsequent siblings)
7 siblings, 1 reply; 15+ messages in thread
From: Ming Lei @ 2021-10-25 9:44 UTC (permalink / raw)
To: Jens Axboe; +Cc: linux-block, Christoph Hellwig, Ming Lei
In lo_complete_rq(), in case of !cmd->use_aio, we simply call
blk_mq_end_request(), so the check of cmd->use_aio isn't necessary,
since it is always true when the check is run.
Signed-off-by: Ming Lei <ming.lei@redhat.com>
---
drivers/block/loop.c | 10 ++++------
1 file changed, 4 insertions(+), 6 deletions(-)
diff --git a/drivers/block/loop.c b/drivers/block/loop.c
index 8f140d637435..8c3f5d2affc7 100644
--- a/drivers/block/loop.c
+++ b/drivers/block/loop.c
@@ -539,13 +539,11 @@ static void lo_complete_rq(struct request *rq)
cmd->ret = 0;
blk_mq_requeue_request(rq, true);
} else {
- if (cmd->use_aio) {
- struct bio *bio = rq->bio;
+ struct bio *bio = rq->bio;
- while (bio) {
- zero_fill_bio(bio);
- bio = bio->bi_next;
- }
+ while (bio) {
+ zero_fill_bio(bio);
+ bio = bio->bi_next;
}
ret = BLK_STS_IOERR;
end_io:
--
2.31.1
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH 3/8] loop: add one helper for submitting IO on backing file
2021-10-25 9:44 [PATCH 0/8] loop: improve dio on backing file Ming Lei
2021-10-25 9:44 ` [PATCH 1/8] loop: move flush_dcache_page to ->complete of request Ming Lei
2021-10-25 9:44 ` [PATCH 2/8] loop: remove always true check Ming Lei
@ 2021-10-25 9:44 ` Ming Lei
2021-10-25 9:44 ` [PATCH 4/8] loop: cover simple read/write via lo_rw_aio() Ming Lei
` (4 subsequent siblings)
7 siblings, 0 replies; 15+ messages in thread
From: Ming Lei @ 2021-10-25 9:44 UTC (permalink / raw)
To: Jens Axboe; +Cc: linux-block, Christoph Hellwig, Ming Lei
No functional change, new helper is added so that we can unifying buffered
IO on backing file.
Signed-off-by: Ming Lei <ming.lei@redhat.com>
---
drivers/block/loop.c | 13 +++++++++----
1 file changed, 9 insertions(+), 4 deletions(-)
diff --git a/drivers/block/loop.c b/drivers/block/loop.c
index 8c3f5d2affc7..769cf84c6899 100644
--- a/drivers/block/loop.c
+++ b/drivers/block/loop.c
@@ -571,6 +571,14 @@ static void lo_rw_aio_complete(struct kiocb *iocb, long ret, long ret2)
lo_rw_aio_do_completion(cmd);
}
+static inline int lo_call_backing_rw_iter(struct file *file,
+ struct kiocb *iocb, struct iov_iter *iter, bool rw)
+{
+ if (rw == WRITE)
+ return call_write_iter(file, iocb, iter);
+ return call_read_iter(file, iocb, iter);
+}
+
static int lo_rw_aio(struct loop_device *lo, struct loop_cmd *cmd,
loff_t pos, bool rw)
{
@@ -628,10 +636,7 @@ static int lo_rw_aio(struct loop_device *lo, struct loop_cmd *cmd,
cmd->iocb.ki_flags = IOCB_DIRECT;
cmd->iocb.ki_ioprio = IOPRIO_PRIO_VALUE(IOPRIO_CLASS_NONE, 0);
- if (rw == WRITE)
- ret = call_write_iter(file, &cmd->iocb, &iter);
- else
- ret = call_read_iter(file, &cmd->iocb, &iter);
+ ret = lo_call_backing_rw_iter(file, &cmd->iocb, &iter, rw);
lo_rw_aio_do_completion(cmd);
--
2.31.1
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH 4/8] loop: cover simple read/write via lo_rw_aio()
2021-10-25 9:44 [PATCH 0/8] loop: improve dio on backing file Ming Lei
` (2 preceding siblings ...)
2021-10-25 9:44 ` [PATCH 3/8] loop: add one helper for submitting IO on backing file Ming Lei
@ 2021-10-25 9:44 ` Ming Lei
2021-10-26 7:35 ` Christoph Hellwig
2021-10-25 9:44 ` [PATCH 5/8] loop: fallback to buffered IO in case of dio submission Ming Lei
` (3 subsequent siblings)
7 siblings, 1 reply; 15+ messages in thread
From: Ming Lei @ 2021-10-25 9:44 UTC (permalink / raw)
To: Jens Axboe; +Cc: linux-block, Christoph Hellwig, Ming Lei
lo_rw_aio() is capable of doing simple buffered read/write, not
necessary to use lo_simple_read()/lo_simple_write() for that.
Add cmd->use_dio for real loop dio, then cmd->use_aio is only used
in case that lo_rw_aio() is used for submitting IO against backing file.
Signed-off-by: Ming Lei <ming.lei@redhat.com>
---
drivers/block/loop.c | 83 +++++++++-----------------------------------
drivers/block/loop.h | 1 +
2 files changed, 18 insertions(+), 66 deletions(-)
diff --git a/drivers/block/loop.c b/drivers/block/loop.c
index 769cf84c6899..d1784f825b6b 100644
--- a/drivers/block/loop.c
+++ b/drivers/block/loop.c
@@ -339,23 +339,6 @@ static int lo_write_bvec(struct file *file, struct bio_vec *bvec, loff_t *ppos)
return bw;
}
-static int lo_write_simple(struct loop_device *lo, struct request *rq,
- loff_t pos)
-{
- struct bio_vec bvec;
- struct req_iterator iter;
- int ret = 0;
-
- rq_for_each_segment(bvec, rq, iter) {
- ret = lo_write_bvec(lo->lo_backing_file, &bvec, &pos);
- if (ret < 0)
- break;
- cond_resched();
- }
-
- return ret;
-}
-
/*
* This is the slow, transforming version that needs to double buffer the
* data as it cannot do the transformations in place without having direct
@@ -391,33 +374,6 @@ static int lo_write_transfer(struct loop_device *lo, struct request *rq,
return ret;
}
-static int lo_read_simple(struct loop_device *lo, struct request *rq,
- loff_t pos)
-{
- struct bio_vec bvec;
- struct req_iterator iter;
- struct iov_iter i;
- ssize_t len;
-
- rq_for_each_segment(bvec, rq, iter) {
- 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;
-
- if (len != bvec.bv_len) {
- struct bio *bio;
-
- __rq_for_each_bio(bio, rq)
- zero_fill_bio(bio);
- break;
- }
- cond_resched();
- }
-
- return 0;
-}
-
static int lo_read_transfer(struct loop_device *lo, struct request *rq,
loff_t pos)
{
@@ -520,10 +476,10 @@ static void lo_complete_rq(struct request *rq)
blk_status_t ret = BLK_STS_OK;
/* Kernel wrote to our pages, call flush_dcache_page */
- if (req_op(rq) == REQ_OP_READ && !cmd->use_aio && cmd->ret >= 0)
+ if (req_op(rq) == REQ_OP_READ && !cmd->use_dio && cmd->ret >= 0)
lo_flush_dcache_for_read(rq);
- if (!cmd->use_aio || cmd->ret < 0 || cmd->ret == blk_rq_bytes(rq) ||
+ if (!cmd->use_dio || cmd->ret < 0 || cmd->ret == blk_rq_bytes(rq) ||
req_op(rq) != REQ_OP_READ) {
if (cmd->ret < 0)
ret = errno_to_blk_status(cmd->ret);
@@ -625,17 +581,24 @@ static int lo_rw_aio(struct loop_device *lo, struct loop_cmd *cmd,
offset = bio->bi_iter.bi_bvec_done;
bvec = __bvec_iter_bvec(bio->bi_io_vec, bio->bi_iter);
}
- atomic_set(&cmd->ref, 2);
-
iov_iter_bvec(&iter, rw, bvec, nr_bvec, blk_rq_bytes(rq));
iter.iov_offset = offset;
cmd->iocb.ki_pos = pos;
cmd->iocb.ki_filp = file;
- cmd->iocb.ki_complete = lo_rw_aio_complete;
- cmd->iocb.ki_flags = IOCB_DIRECT;
+
cmd->iocb.ki_ioprio = IOPRIO_PRIO_VALUE(IOPRIO_CLASS_NONE, 0);
+ if (!cmd->use_dio) {
+ atomic_set(&cmd->ref, 1);
+ cmd->iocb.ki_flags = 0;
+ cmd->ret = lo_call_backing_rw_iter(file, &cmd->iocb, &iter, rw);
+ lo_rw_aio_do_completion(cmd);
+ return 0;
+ }
+ atomic_set(&cmd->ref, 2);
+ cmd->iocb.ki_complete = lo_rw_aio_complete;
+ cmd->iocb.ki_flags = IOCB_DIRECT;
ret = lo_call_backing_rw_iter(file, &cmd->iocb, &iter, rw);
lo_rw_aio_do_completion(cmd);
@@ -650,15 +613,6 @@ static int do_req_filebacked(struct loop_device *lo, struct request *rq)
struct loop_cmd *cmd = blk_mq_rq_to_pdu(rq);
loff_t pos = ((loff_t) blk_rq_pos(rq) << 9) + lo->lo_offset;
- /*
- * lo_write_simple and lo_read_simple should have been covered
- * by io submit style function like lo_rw_aio(), one blocker
- * is that lo_read_simple() need to call flush_dcache_page after
- * the page is written from kernel, and it isn't easy to handle
- * this in io submit style function which submits all segments
- * of the req at one time. And direct read IO doesn't need to
- * run flush_dcache_page().
- */
switch (req_op(rq)) {
case REQ_OP_FLUSH:
return lo_req_flush(lo, rq);
@@ -676,17 +630,13 @@ static int do_req_filebacked(struct loop_device *lo, struct request *rq)
case REQ_OP_WRITE:
if (lo->transfer)
return lo_write_transfer(lo, rq, pos);
- else if (cmd->use_aio)
- return lo_rw_aio(lo, cmd, pos, WRITE);
else
- return lo_write_simple(lo, rq, pos);
+ return lo_rw_aio(lo, cmd, pos, WRITE);
case REQ_OP_READ:
if (lo->transfer)
return lo_read_transfer(lo, rq, pos);
- else if (cmd->use_aio)
- return lo_rw_aio(lo, cmd, pos, READ);
else
- return lo_read_simple(lo, rq, pos);
+ return lo_rw_aio(lo, cmd, pos, READ);
default:
WARN_ON_ONCE(1);
return -EIO;
@@ -2171,7 +2121,8 @@ static blk_status_t loop_queue_rq(struct blk_mq_hw_ctx *hctx,
cmd->use_aio = false;
break;
default:
- cmd->use_aio = lo->use_dio;
+ cmd->use_aio = !lo->transfer;
+ cmd->use_dio = lo->use_dio && cmd->use_aio;
break;
}
diff --git a/drivers/block/loop.h b/drivers/block/loop.h
index 04c88dd6eabd..b7d611e4f517 100644
--- a/drivers/block/loop.h
+++ b/drivers/block/loop.h
@@ -74,6 +74,7 @@ struct loop_device {
struct loop_cmd {
struct list_head list_entry;
bool use_aio; /* use AIO interface to handle I/O */
+ bool use_dio;
atomic_t ref; /* only for aio */
long ret;
struct kiocb iocb;
--
2.31.1
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH 5/8] loop: fallback to buffered IO in case of dio submission
2021-10-25 9:44 [PATCH 0/8] loop: improve dio on backing file Ming Lei
` (3 preceding siblings ...)
2021-10-25 9:44 ` [PATCH 4/8] loop: cover simple read/write via lo_rw_aio() Ming Lei
@ 2021-10-25 9:44 ` Ming Lei
2021-10-26 7:36 ` Christoph Hellwig
2021-10-25 9:44 ` [PATCH 6/8] loop: relax loop dio use condition Ming Lei
` (2 subsequent siblings)
7 siblings, 1 reply; 15+ messages in thread
From: Ming Lei @ 2021-10-25 9:44 UTC (permalink / raw)
To: Jens Axboe; +Cc: linux-block, Christoph Hellwig, Ming Lei
DIO submission on underlying file may fail because of unaligned buffer or
start_sector & sector_length, fallback to buffered IO when that happens,
this way will make loop dio mode more reliable.
Signed-off-by: Ming Lei <ming.lei@redhat.com>
---
drivers/block/loop.c | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)
diff --git a/drivers/block/loop.c b/drivers/block/loop.c
index d1784f825b6b..fee78a640f75 100644
--- a/drivers/block/loop.c
+++ b/drivers/block/loop.c
@@ -590,6 +590,7 @@ static int lo_rw_aio(struct loop_device *lo, struct loop_cmd *cmd,
cmd->iocb.ki_ioprio = IOPRIO_PRIO_VALUE(IOPRIO_CLASS_NONE, 0);
if (!cmd->use_dio) {
atomic_set(&cmd->ref, 1);
+buffered_io:
cmd->iocb.ki_flags = 0;
cmd->ret = lo_call_backing_rw_iter(file, &cmd->iocb, &iter, rw);
lo_rw_aio_do_completion(cmd);
@@ -603,8 +604,13 @@ static int lo_rw_aio(struct loop_device *lo, struct loop_cmd *cmd,
lo_rw_aio_do_completion(cmd);
- if (ret != -EIOCBQUEUED)
+ if (ret != -EIOCBQUEUED) {
+ if (ret < 0) {
+ cmd->use_dio = false;
+ goto buffered_io;
+ }
cmd->iocb.ki_complete(&cmd->iocb, ret, 0);
+ }
return 0;
}
--
2.31.1
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH 6/8] loop: relax loop dio use condition
2021-10-25 9:44 [PATCH 0/8] loop: improve dio on backing file Ming Lei
` (4 preceding siblings ...)
2021-10-25 9:44 ` [PATCH 5/8] loop: fallback to buffered IO in case of dio submission Ming Lei
@ 2021-10-25 9:44 ` Ming Lei
2021-10-26 7:37 ` Christoph Hellwig
2021-10-27 0:20 ` kernel test robot
2021-10-25 9:44 ` [PATCH 7/8] loop: remove lo->use_dio Ming Lei
2021-10-25 9:44 ` [RFC PATCH 8/8] loop: use backing dio at default Ming Lei
7 siblings, 2 replies; 15+ messages in thread
From: Ming Lei @ 2021-10-25 9:44 UTC (permalink / raw)
To: Jens Axboe; +Cc: linux-block, Christoph Hellwig, Ming Lei
So far loop dio requires the following conditions:
1) lo->lo_offset is aligned with backing queue's logical block size
2) loop queue's logical block size is <= backing queue's logical block
size
We have supported to fallback to buffered IO, so unaligned IO can't be
completed successfully.
Also the current usage wrt. loop queue's logical block size is hardly
to work as expected, set dio and updating logical block size are done
in different ioctls, and logical block size is often set before setting
direct io. Relaxing dio use in this way won't cause real effect in
reality.
Then we needn't to freeze queue any more when updating dio since loop
IO can be done successfully with the fallback buffered io.
Signed-off-by: Ming Lei <ming.lei@redhat.com>
---
drivers/block/loop.c | 36 +-----------------------------------
1 file changed, 1 insertion(+), 35 deletions(-)
diff --git a/drivers/block/loop.c b/drivers/block/loop.c
index fee78a640f75..f42630246758 100644
--- a/drivers/block/loop.c
+++ b/drivers/block/loop.c
@@ -215,31 +215,10 @@ static void __loop_update_dio(struct loop_device *lo, bool dio)
{
struct file *file = lo->lo_backing_file;
struct address_space *mapping = file->f_mapping;
- struct inode *inode = mapping->host;
- unsigned short sb_bsize = 0;
- unsigned dio_align = 0;
bool use_dio;
- if (inode->i_sb->s_bdev) {
- sb_bsize = bdev_logical_block_size(inode->i_sb->s_bdev);
- dio_align = sb_bsize - 1;
- }
-
- /*
- * We support direct I/O only if lo_offset is aligned with the
- * logical I/O size of backing device, and the logical block
- * size of loop is bigger than the backing device's and the loop
- * needn't transform transfer.
- *
- * TODO: the above condition may be loosed in the future, and
- * direct I/O may be switched runtime at that time because most
- * of requests in sane applications should be PAGE_SIZE aligned
- */
if (dio) {
- if (queue_logical_block_size(lo->lo_queue) >= sb_bsize &&
- !(lo->lo_offset & dio_align) &&
- mapping->a_ops->direct_IO &&
- !lo->transfer)
+ if (mapping->a_ops->direct_IO && !lo->transfer)
use_dio = true;
else
use_dio = false;
@@ -253,13 +232,6 @@ static void __loop_update_dio(struct loop_device *lo, bool dio)
/* flush dirty pages before changing direct IO */
vfs_fsync(file, 0);
- /*
- * The flag of LO_FLAGS_DIRECT_IO is handled similarly with
- * LO_FLAGS_READ_ONLY, both are set from kernel, and losetup
- * will get updated by ioctl(LOOP_GET_STATUS)
- */
- if (lo->lo_state == Lo_bound)
- blk_mq_freeze_queue(lo->lo_queue);
lo->use_dio = use_dio;
if (use_dio) {
blk_queue_flag_clear(QUEUE_FLAG_NOMERGES, lo->lo_queue);
@@ -268,8 +240,6 @@ static void __loop_update_dio(struct loop_device *lo, bool dio)
blk_queue_flag_set(QUEUE_FLAG_NOMERGES, lo->lo_queue);
lo->lo_flags &= ~LO_FLAGS_DIRECT_IO;
}
- if (lo->lo_state == Lo_bound)
- blk_mq_unfreeze_queue(lo->lo_queue);
}
/**
@@ -1248,9 +1218,6 @@ static int loop_configure(struct loop_device *lo, fmode_t mode,
if (config->block_size)
bsize = config->block_size;
- else if ((lo->lo_backing_file->f_flags & O_DIRECT) && inode->i_sb->s_bdev)
- /* In case of direct I/O, match underlying block size */
- bsize = bdev_logical_block_size(inode->i_sb->s_bdev);
else
bsize = 512;
@@ -1753,7 +1720,6 @@ static int loop_set_block_size(struct loop_device *lo, unsigned long arg)
blk_queue_logical_block_size(lo->lo_queue, arg);
blk_queue_physical_block_size(lo->lo_queue, arg);
blk_queue_io_min(lo->lo_queue, arg);
- loop_update_dio(lo);
out_unfreeze:
blk_mq_unfreeze_queue(lo->lo_queue);
--
2.31.1
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH 7/8] loop: remove lo->use_dio
2021-10-25 9:44 [PATCH 0/8] loop: improve dio on backing file Ming Lei
` (5 preceding siblings ...)
2021-10-25 9:44 ` [PATCH 6/8] loop: relax loop dio use condition Ming Lei
@ 2021-10-25 9:44 ` Ming Lei
2021-10-25 9:44 ` [RFC PATCH 8/8] loop: use backing dio at default Ming Lei
7 siblings, 0 replies; 15+ messages in thread
From: Ming Lei @ 2021-10-25 9:44 UTC (permalink / raw)
To: Jens Axboe; +Cc: linux-block, Christoph Hellwig, Ming Lei
lo->use_dio is just a copy of (lo->lo_flags & LO_FLAGS_DIRECT_IO), no
necessary to keep it.
Signed-off-by: Ming Lei <ming.lei@redhat.com>
---
drivers/block/loop.c | 12 +++++-------
drivers/block/loop.h | 1 -
2 files changed, 5 insertions(+), 8 deletions(-)
diff --git a/drivers/block/loop.c b/drivers/block/loop.c
index f42630246758..e42c0e3601ac 100644
--- a/drivers/block/loop.c
+++ b/drivers/block/loop.c
@@ -226,13 +226,12 @@ static void __loop_update_dio(struct loop_device *lo, bool dio)
use_dio = false;
}
- if (lo->use_dio == use_dio)
+ if (!!(lo->lo_flags & LO_FLAGS_DIRECT_IO) == use_dio)
return;
/* flush dirty pages before changing direct IO */
vfs_fsync(file, 0);
- lo->use_dio = use_dio;
if (use_dio) {
blk_queue_flag_clear(QUEUE_FLAG_NOMERGES, lo->lo_queue);
lo->lo_flags |= LO_FLAGS_DIRECT_IO;
@@ -622,7 +621,7 @@ static int do_req_filebacked(struct loop_device *lo, struct request *rq)
static inline void loop_update_dio(struct loop_device *lo)
{
__loop_update_dio(lo, (lo->lo_backing_file->f_flags & O_DIRECT) |
- lo->use_dio);
+ (lo->lo_flags & LO_FLAGS_DIRECT_IO));
}
static void loop_reread_partitions(struct loop_device *lo)
@@ -1207,7 +1206,6 @@ static int loop_configure(struct loop_device *lo, fmode_t mode,
lo->worker_tree = RB_ROOT;
timer_setup(&lo->timer, loop_free_idle_workers,
TIMER_DEFERRABLE);
- lo->use_dio = lo->lo_flags & LO_FLAGS_DIRECT_IO;
lo->lo_device = bdev;
lo->lo_backing_file = file;
lo->old_gfp_mask = mapping_gfp_mask(mapping);
@@ -1495,7 +1493,7 @@ loop_set_status(struct loop_device *lo, const struct loop_info64 *info)
loop_config_discard(lo);
/* update dio if lo_offset or transfer is changed */
- __loop_update_dio(lo, lo->use_dio);
+ __loop_update_dio(lo, lo->lo_flags & LO_FLAGS_DIRECT_IO);
out_unfreeze:
blk_mq_unfreeze_queue(lo->lo_queue);
@@ -1682,7 +1680,7 @@ static int loop_set_dio(struct loop_device *lo, unsigned long arg)
goto out;
__loop_update_dio(lo, !!arg);
- if (lo->use_dio == !!arg)
+ if (!!(lo->lo_flags & LO_FLAGS_DIRECT_IO) == !!arg)
return 0;
error = -EINVAL;
out:
@@ -2094,7 +2092,7 @@ static blk_status_t loop_queue_rq(struct blk_mq_hw_ctx *hctx,
break;
default:
cmd->use_aio = !lo->transfer;
- cmd->use_dio = lo->use_dio && cmd->use_aio;
+ cmd->use_dio = (lo->lo_flags & LO_FLAGS_DIRECT_IO) && cmd->use_aio;
break;
}
diff --git a/drivers/block/loop.h b/drivers/block/loop.h
index b7d611e4f517..feb92efb3b57 100644
--- a/drivers/block/loop.h
+++ b/drivers/block/loop.h
@@ -61,7 +61,6 @@ struct loop_device {
struct list_head idle_worker_list;
struct rb_root worker_tree;
struct timer_list timer;
- bool use_dio;
bool sysfs_inited;
struct request_queue *lo_queue;
--
2.31.1
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [RFC PATCH 8/8] loop: use backing dio at default
2021-10-25 9:44 [PATCH 0/8] loop: improve dio on backing file Ming Lei
` (6 preceding siblings ...)
2021-10-25 9:44 ` [PATCH 7/8] loop: remove lo->use_dio Ming Lei
@ 2021-10-25 9:44 ` Ming Lei
7 siblings, 0 replies; 15+ messages in thread
From: Ming Lei @ 2021-10-25 9:44 UTC (permalink / raw)
To: Jens Axboe; +Cc: linux-block, Christoph Hellwig, Ming Lei
We have supported to fallback to buffered IO in case dio failure. Also
in reality, most of or quite a lot of IOs(such as FS IO) are actually aligned,
even though loop's logical block size isn't matched with backing
queue's.
So enable direct io at default.
Signed-off-by: Ming Lei <ming.lei@redhat.com>
---
drivers/block/loop.c | 9 ++-------
1 file changed, 2 insertions(+), 7 deletions(-)
diff --git a/drivers/block/loop.c b/drivers/block/loop.c
index e42c0e3601ac..df057dca7512 100644
--- a/drivers/block/loop.c
+++ b/drivers/block/loop.c
@@ -2285,13 +2285,8 @@ static int loop_add(int i)
blk_queue_max_hw_sectors(lo->lo_queue, BLK_DEF_MAX_SECTORS);
- /*
- * By default, we do buffer IO, so it doesn't make sense to enable
- * merge because the I/O submitted to backing file is handled page by
- * page. For directio mode, merge does help to dispatch bigger request
- * to underlayer disk. We will enable merge once directio is enabled.
- */
- blk_queue_flag_set(QUEUE_FLAG_NOMERGES, lo->lo_queue);
+ /* use backing dio at default */
+ lo->lo_flags |= LO_FLAGS_DIRECT_IO;
/*
* Disable partition scanning by default. The in-kernel partition
--
2.31.1
^ permalink raw reply related [flat|nested] 15+ messages in thread
* Re: [PATCH 1/8] loop: move flush_dcache_page to ->complete of request
2021-10-25 9:44 ` [PATCH 1/8] loop: move flush_dcache_page to ->complete of request Ming Lei
@ 2021-10-26 7:21 ` Christoph Hellwig
0 siblings, 0 replies; 15+ messages in thread
From: Christoph Hellwig @ 2021-10-26 7:21 UTC (permalink / raw)
To: Ming Lei; +Cc: Jens Axboe, linux-block, Christoph Hellwig
Looks good,
Reviewed-by: Christoph Hellwig <hch@lst.de>
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 2/8] loop: remove always true check
2021-10-25 9:44 ` [PATCH 2/8] loop: remove always true check Ming Lei
@ 2021-10-26 7:31 ` Christoph Hellwig
0 siblings, 0 replies; 15+ messages in thread
From: Christoph Hellwig @ 2021-10-26 7:31 UTC (permalink / raw)
To: Ming Lei; +Cc: Jens Axboe, linux-block, Christoph Hellwig
lo_complete_rq is still a complete mess. I'd suggest something like
this instead:
diff --git a/drivers/block/loop.c b/drivers/block/loop.c
index 8f140d6374356..1648d30a8cb4a 100644
--- a/drivers/block/loop.c
+++ b/drivers/block/loop.c
@@ -517,40 +517,37 @@ static void lo_flush_dcache_for_read(struct request *rq)
static void lo_complete_rq(struct request *rq)
{
struct loop_cmd *cmd = blk_mq_rq_to_pdu(rq);
- blk_status_t ret = BLK_STS_OK;
+
+ if (cmd->ret < 0) {
+ blk_mq_end_request(rq, errno_to_blk_status(cmd->ret));
+ return;
+ }
/* Kernel wrote to our pages, call flush_dcache_page */
if (req_op(rq) == REQ_OP_READ && !cmd->use_aio && cmd->ret >= 0)
lo_flush_dcache_for_read(rq);
- if (!cmd->use_aio || cmd->ret < 0 || cmd->ret == blk_rq_bytes(rq) ||
- req_op(rq) != REQ_OP_READ) {
- if (cmd->ret < 0)
- ret = errno_to_blk_status(cmd->ret);
- goto end_io;
- }
-
/*
- * Short READ - if we got some data, advance our request and
- * retry it. If we got no data, end the rest with EIO.
+ * Short READ - if we got some data, advance our request and retry it.
+ * If we got no data, end the rest with EIO.
*/
- if (cmd->ret) {
- blk_update_request(rq, BLK_STS_OK, cmd->ret);
- cmd->ret = 0;
- blk_mq_requeue_request(rq, true);
- } else {
- if (cmd->use_aio) {
- struct bio *bio = rq->bio;
+ if (req_op(rq) == REQ_OP_READ && cmd->use_aio &&
+ cmd->ret != blk_rq_bytes(rq)) {
+ if (cmd->ret) {
+ blk_update_request(rq, BLK_STS_OK, cmd->ret);
+ cmd->ret = 0;
+ blk_mq_requeue_request(rq, true);
+ } else {
+ struct bio *bio;
- while (bio) {
+ for (bio = rq->bio; bio; bio = bio->bi_next)
zero_fill_bio(bio);
- bio = bio->bi_next;
- }
+ blk_mq_end_request(rq, BLK_STS_IOERR);
}
- ret = BLK_STS_IOERR;
-end_io:
- blk_mq_end_request(rq, ret);
+ return;
}
+
+ blk_mq_end_request(rq, BLK_STS_OK);
}
static void lo_rw_aio_do_completion(struct loop_cmd *cmd)
^ permalink raw reply related [flat|nested] 15+ messages in thread
* Re: [PATCH 4/8] loop: cover simple read/write via lo_rw_aio()
2021-10-25 9:44 ` [PATCH 4/8] loop: cover simple read/write via lo_rw_aio() Ming Lei
@ 2021-10-26 7:35 ` Christoph Hellwig
0 siblings, 0 replies; 15+ messages in thread
From: Christoph Hellwig @ 2021-10-26 7:35 UTC (permalink / raw)
To: Ming Lei; +Cc: Jens Axboe, linux-block, Christoph Hellwig
> - cmd->iocb.ki_complete = lo_rw_aio_complete;
> - cmd->iocb.ki_flags = IOCB_DIRECT;
> +
> cmd->iocb.ki_ioprio = IOPRIO_PRIO_VALUE(IOPRIO_CLASS_NONE, 0);
> + if (!cmd->use_dio) {
> + atomic_set(&cmd->ref, 1);
> + cmd->iocb.ki_flags = 0;
> + cmd->ret = lo_call_backing_rw_iter(file, &cmd->iocb, &iter, rw);
> + lo_rw_aio_do_completion(cmd);
> + return 0;
> + }
I don't think we even need the special casing. If you just use the
AIO path here for buffered I/O it will do the same for you at the
small price of an extra refcount operation.
FYI, this seems to be against a kernel that still has cryptoloop/transfers.
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 5/8] loop: fallback to buffered IO in case of dio submission
2021-10-25 9:44 ` [PATCH 5/8] loop: fallback to buffered IO in case of dio submission Ming Lei
@ 2021-10-26 7:36 ` Christoph Hellwig
0 siblings, 0 replies; 15+ messages in thread
From: Christoph Hellwig @ 2021-10-26 7:36 UTC (permalink / raw)
To: Ming Lei; +Cc: Jens Axboe, linux-block, Christoph Hellwig
On Mon, Oct 25, 2021 at 05:44:34PM +0800, Ming Lei wrote:
> DIO submission on underlying file may fail because of unaligned buffer or
> start_sector & sector_length, fallback to buffered IO when that happens,
> this way will make loop dio mode more reliable.
I don't think this is a good idea. Just do an ahead of time check
that the alignment matches and don't even try to use direct I/O code
in that case. Otherwise we get a mix and match between buffered and
direct I/O, which is actively harmful.
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 6/8] loop: relax loop dio use condition
2021-10-25 9:44 ` [PATCH 6/8] loop: relax loop dio use condition Ming Lei
@ 2021-10-26 7:37 ` Christoph Hellwig
2021-10-27 0:20 ` kernel test robot
1 sibling, 0 replies; 15+ messages in thread
From: Christoph Hellwig @ 2021-10-26 7:37 UTC (permalink / raw)
To: Ming Lei; +Cc: Jens Axboe, linux-block, Christoph Hellwig
On Mon, Oct 25, 2021 at 05:44:35PM +0800, Ming Lei wrote:
> So far loop dio requires the following conditions:
>
> 1) lo->lo_offset is aligned with backing queue's logical block size
>
> 2) loop queue's logical block size is <= backing queue's logical block
> size
And both these checks absolutely do make sense. We should not drop
them and gets us into the messy state of mixed direct and buffered
I/O.
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 6/8] loop: relax loop dio use condition
2021-10-25 9:44 ` [PATCH 6/8] loop: relax loop dio use condition Ming Lei
2021-10-26 7:37 ` Christoph Hellwig
@ 2021-10-27 0:20 ` kernel test robot
1 sibling, 0 replies; 15+ messages in thread
From: kernel test robot @ 2021-10-27 0:20 UTC (permalink / raw)
To: Ming Lei, Jens Axboe; +Cc: kbuild-all, linux-block, Christoph Hellwig, Ming Lei
[-- Attachment #1: Type: text/plain, Size: 12650 bytes --]
Hi Ming,
Thank you for the patch! Yet something to improve:
[auto build test ERROR on v5.15-rc6]
[cannot apply to axboe-block/for-next next-20211026]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]
url: https://github.com/0day-ci/linux/commits/Ming-Lei/loop-improve-dio-on-backing-file/20211025-174819
base: 519d81956ee277b4419c723adfb154603c2565ba
config: parisc-buildonly-randconfig-r002-20211026 (attached as .config)
compiler: hppa-linux-gcc (GCC) 11.2.0
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# https://github.com/0day-ci/linux/commit/f98a33d68a04634ba8f8314e9da480abc332b1f4
git remote add linux-review https://github.com/0day-ci/linux
git fetch --no-tags linux-review Ming-Lei/loop-improve-dio-on-backing-file/20211025-174819
git checkout f98a33d68a04634ba8f8314e9da480abc332b1f4
# save the attached .config to linux build tree
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-11.2.0 make.cross ARCH=parisc
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
All errors (new ones prefixed by >>):
drivers/block/loop.c: In function 'loop_configure':
>> drivers/block/loop.c:1133:23: error: variable 'inode' set but not used [-Werror=unused-but-set-variable]
1133 | struct inode *inode;
| ^~~~~
cc1: all warnings being treated as errors
vim +/inode +1133 drivers/block/loop.c
62ab466ca881fe2 Martijn Coenen 2020-05-13 1127
3448914e8cc550b Martijn Coenen 2020-05-13 1128 static int loop_configure(struct loop_device *lo, fmode_t mode,
3448914e8cc550b Martijn Coenen 2020-05-13 1129 struct block_device *bdev,
3448914e8cc550b Martijn Coenen 2020-05-13 1130 const struct loop_config *config)
^1da177e4c3f415 Linus Torvalds 2005-04-16 1131 {
3ce6e1f662a9109 Tetsuo Handa 2021-07-06 1132 struct file *file = fget(config->fd);
^1da177e4c3f415 Linus Torvalds 2005-04-16 @1133 struct inode *inode;
^1da177e4c3f415 Linus Torvalds 2005-04-16 1134 struct address_space *mapping;
^1da177e4c3f415 Linus Torvalds 2005-04-16 1135 int error;
^1da177e4c3f415 Linus Torvalds 2005-04-16 1136 loff_t size;
85b0a54a82e4fbc Jan Kara 2018-11-08 1137 bool partscan;
3448914e8cc550b Martijn Coenen 2020-05-13 1138 unsigned short bsize;
3ce6e1f662a9109 Tetsuo Handa 2021-07-06 1139 bool is_loop;
3ce6e1f662a9109 Tetsuo Handa 2021-07-06 1140
3ce6e1f662a9109 Tetsuo Handa 2021-07-06 1141 if (!file)
3ce6e1f662a9109 Tetsuo Handa 2021-07-06 1142 return -EBADF;
3ce6e1f662a9109 Tetsuo Handa 2021-07-06 1143 is_loop = is_loop_device(file);
^1da177e4c3f415 Linus Torvalds 2005-04-16 1144
^1da177e4c3f415 Linus Torvalds 2005-04-16 1145 /* This is safe, since we have a reference from open(). */
^1da177e4c3f415 Linus Torvalds 2005-04-16 1146 __module_get(THIS_MODULE);
^1da177e4c3f415 Linus Torvalds 2005-04-16 1147
33ec3e53e7b1869 Jan Kara 2019-05-16 1148 /*
33ec3e53e7b1869 Jan Kara 2019-05-16 1149 * If we don't hold exclusive handle for the device, upgrade to it
33ec3e53e7b1869 Jan Kara 2019-05-16 1150 * here to avoid changing device under exclusive owner.
33ec3e53e7b1869 Jan Kara 2019-05-16 1151 */
33ec3e53e7b1869 Jan Kara 2019-05-16 1152 if (!(mode & FMODE_EXCL)) {
37c3fc9abb25cd7 Christoph Hellwig 2020-11-25 1153 error = bd_prepare_to_claim(bdev, loop_configure);
ecbe6bc0003bfd5 Christoph Hellwig 2020-07-16 1154 if (error)
757ecf40b7e0295 Jan Kara 2018-11-08 1155 goto out_putf;
33ec3e53e7b1869 Jan Kara 2019-05-16 1156 }
33ec3e53e7b1869 Jan Kara 2019-05-16 1157
3ce6e1f662a9109 Tetsuo Handa 2021-07-06 1158 error = loop_global_lock_killable(lo, is_loop);
33ec3e53e7b1869 Jan Kara 2019-05-16 1159 if (error)
33ec3e53e7b1869 Jan Kara 2019-05-16 1160 goto out_bdev;
757ecf40b7e0295 Jan Kara 2018-11-08 1161
^1da177e4c3f415 Linus Torvalds 2005-04-16 1162 error = -EBUSY;
^1da177e4c3f415 Linus Torvalds 2005-04-16 1163 if (lo->lo_state != Lo_unbound)
757ecf40b7e0295 Jan Kara 2018-11-08 1164 goto out_unlock;
^1da177e4c3f415 Linus Torvalds 2005-04-16 1165
d2ac838e4cd7e5e Theodore Ts'o 2018-05-07 1166 error = loop_validate_file(file, bdev);
d2ac838e4cd7e5e Theodore Ts'o 2018-05-07 1167 if (error)
757ecf40b7e0295 Jan Kara 2018-11-08 1168 goto out_unlock;
^1da177e4c3f415 Linus Torvalds 2005-04-16 1169
^1da177e4c3f415 Linus Torvalds 2005-04-16 1170 mapping = file->f_mapping;
^1da177e4c3f415 Linus Torvalds 2005-04-16 1171 inode = mapping->host;
^1da177e4c3f415 Linus Torvalds 2005-04-16 1172
3448914e8cc550b Martijn Coenen 2020-05-13 1173 if ((config->info.lo_flags & ~LOOP_CONFIGURE_SETTABLE_FLAGS) != 0) {
3448914e8cc550b Martijn Coenen 2020-05-13 1174 error = -EINVAL;
3448914e8cc550b Martijn Coenen 2020-05-13 1175 goto out_unlock;
3448914e8cc550b Martijn Coenen 2020-05-13 1176 }
3448914e8cc550b Martijn Coenen 2020-05-13 1177
3448914e8cc550b Martijn Coenen 2020-05-13 1178 if (config->block_size) {
3448914e8cc550b Martijn Coenen 2020-05-13 1179 error = loop_validate_block_size(config->block_size);
3448914e8cc550b Martijn Coenen 2020-05-13 1180 if (error)
3448914e8cc550b Martijn Coenen 2020-05-13 1181 goto out_unlock;
3448914e8cc550b Martijn Coenen 2020-05-13 1182 }
3448914e8cc550b Martijn Coenen 2020-05-13 1183
3448914e8cc550b Martijn Coenen 2020-05-13 1184 error = loop_set_status_from_info(lo, &config->info);
3448914e8cc550b Martijn Coenen 2020-05-13 1185 if (error)
3448914e8cc550b Martijn Coenen 2020-05-13 1186 goto out_unlock;
3448914e8cc550b Martijn Coenen 2020-05-13 1187
456be1484ffc72a Christoph Hellwig 2011-10-17 1188 if (!(file->f_mode & FMODE_WRITE) || !(mode & FMODE_WRITE) ||
283e7e5d249f486 Al Viro 2015-04-03 1189 !file->f_op->write_iter)
3448914e8cc550b Martijn Coenen 2020-05-13 1190 lo->lo_flags |= LO_FLAGS_READ_ONLY;
^1da177e4c3f415 Linus Torvalds 2005-04-16 1191
87579e9b7d8dc36 Dan Schatzberg 2021-06-28 1192 lo->workqueue = alloc_workqueue("loop%d",
87579e9b7d8dc36 Dan Schatzberg 2021-06-28 1193 WQ_UNBOUND | WQ_FREEZABLE,
87579e9b7d8dc36 Dan Schatzberg 2021-06-28 1194 0,
87579e9b7d8dc36 Dan Schatzberg 2021-06-28 1195 lo->lo_number);
87579e9b7d8dc36 Dan Schatzberg 2021-06-28 1196 if (!lo->workqueue) {
87579e9b7d8dc36 Dan Schatzberg 2021-06-28 1197 error = -ENOMEM;
757ecf40b7e0295 Jan Kara 2018-11-08 1198 goto out_unlock;
87579e9b7d8dc36 Dan Schatzberg 2021-06-28 1199 }
^1da177e4c3f415 Linus Torvalds 2005-04-16 1200
9f65c489b68d424 Matteo Croce 2021-07-13 1201 disk_force_media_change(lo->lo_disk, DISK_EVENT_MEDIA_CHANGE);
7a2f0ce19f2e2ed Christoph Hellwig 2020-11-03 1202 set_disk_ro(lo->lo_disk, (lo->lo_flags & LO_FLAGS_READ_ONLY) != 0);
^1da177e4c3f415 Linus Torvalds 2005-04-16 1203
87579e9b7d8dc36 Dan Schatzberg 2021-06-28 1204 INIT_WORK(&lo->rootcg_work, loop_rootcg_workfn);
87579e9b7d8dc36 Dan Schatzberg 2021-06-28 1205 INIT_LIST_HEAD(&lo->rootcg_cmd_list);
87579e9b7d8dc36 Dan Schatzberg 2021-06-28 1206 INIT_LIST_HEAD(&lo->idle_worker_list);
87579e9b7d8dc36 Dan Schatzberg 2021-06-28 1207 lo->worker_tree = RB_ROOT;
87579e9b7d8dc36 Dan Schatzberg 2021-06-28 1208 timer_setup(&lo->timer, loop_free_idle_workers,
87579e9b7d8dc36 Dan Schatzberg 2021-06-28 1209 TIMER_DEFERRABLE);
3448914e8cc550b Martijn Coenen 2020-05-13 1210 lo->use_dio = lo->lo_flags & LO_FLAGS_DIRECT_IO;
^1da177e4c3f415 Linus Torvalds 2005-04-16 1211 lo->lo_device = bdev;
^1da177e4c3f415 Linus Torvalds 2005-04-16 1212 lo->lo_backing_file = file;
^1da177e4c3f415 Linus Torvalds 2005-04-16 1213 lo->old_gfp_mask = mapping_gfp_mask(mapping);
^1da177e4c3f415 Linus Torvalds 2005-04-16 1214 mapping_set_gfp_mask(mapping, lo->old_gfp_mask & ~(__GFP_IO|__GFP_FS));
^1da177e4c3f415 Linus Torvalds 2005-04-16 1215
3448914e8cc550b Martijn Coenen 2020-05-13 1216 if (!(lo->lo_flags & LO_FLAGS_READ_ONLY) && file->f_op->fsync)
21d0727f639e4ba Jens Axboe 2016-03-30 1217 blk_queue_write_cache(lo->lo_queue, true, false);
68db1961bbf4e16 Nikanth Karthikesan 2009-03-24 1218
3448914e8cc550b Martijn Coenen 2020-05-13 1219 if (config->block_size)
3448914e8cc550b Martijn Coenen 2020-05-13 1220 bsize = config->block_size;
3448914e8cc550b Martijn Coenen 2020-05-13 1221 else
3448914e8cc550b Martijn Coenen 2020-05-13 1222 bsize = 512;
85560117d00f5d5 Martijn Coenen 2019-09-04 1223
85560117d00f5d5 Martijn Coenen 2019-09-04 1224 blk_queue_logical_block_size(lo->lo_queue, bsize);
85560117d00f5d5 Martijn Coenen 2019-09-04 1225 blk_queue_physical_block_size(lo->lo_queue, bsize);
85560117d00f5d5 Martijn Coenen 2019-09-04 1226 blk_queue_io_min(lo->lo_queue, bsize);
85560117d00f5d5 Martijn Coenen 2019-09-04 1227
2b9ac22b12a266e Kristian Klausen 2021-06-18 1228 loop_config_discard(lo);
56a85fd8376ef32 Holger Hoffstätte 2019-02-12 1229 loop_update_rotational(lo);
2e5ab5f379f96a6 Ming Lei 2015-08-17 1230 loop_update_dio(lo);
ee86273062cbb31 Milan Broz 2010-08-23 1231 loop_sysfs_init(lo);
79e5dc59e2974a4 Martijn Coenen 2020-08-25 1232
79e5dc59e2974a4 Martijn Coenen 2020-08-25 1233 size = get_loop_size(lo, file);
5795b6f5607f7e4 Martijn Coenen 2020-05-13 1234 loop_set_size(lo, size);
^1da177e4c3f415 Linus Torvalds 2005-04-16 1235
3ce6e1f662a9109 Tetsuo Handa 2021-07-06 1236 /* Order wrt reading lo_state in loop_validate_file(). */
3ce6e1f662a9109 Tetsuo Handa 2021-07-06 1237 wmb();
3ce6e1f662a9109 Tetsuo Handa 2021-07-06 1238
6c9979185c7ef4f Serge E. Hallyn 2006-09-29 1239 lo->lo_state = Lo_bound;
e03c8dd14915fab Kay Sievers 2011-08-23 1240 if (part_shift)
e03c8dd14915fab Kay Sievers 2011-08-23 1241 lo->lo_flags |= LO_FLAGS_PARTSCAN;
85b0a54a82e4fbc Jan Kara 2018-11-08 1242 partscan = lo->lo_flags & LO_FLAGS_PARTSCAN;
fe6a8fc5ed2f008 Lennart Poettering 2020-08-10 1243 if (partscan)
fe6a8fc5ed2f008 Lennart Poettering 2020-08-10 1244 lo->lo_disk->flags &= ~GENHD_FL_NO_PART_SCAN;
c1681bf8a7b1b98 Anatol Pomozov 2013-04-01 1245
3ce6e1f662a9109 Tetsuo Handa 2021-07-06 1246 loop_global_unlock(lo, is_loop);
85b0a54a82e4fbc Jan Kara 2018-11-08 1247 if (partscan)
0384264ea8a39bd Christoph Hellwig 2021-06-24 1248 loop_reread_partitions(lo);
37c3fc9abb25cd7 Christoph Hellwig 2020-11-25 1249 if (!(mode & FMODE_EXCL))
37c3fc9abb25cd7 Christoph Hellwig 2020-11-25 1250 bd_abort_claiming(bdev, loop_configure);
^1da177e4c3f415 Linus Torvalds 2005-04-16 1251 return 0;
^1da177e4c3f415 Linus Torvalds 2005-04-16 1252
757ecf40b7e0295 Jan Kara 2018-11-08 1253 out_unlock:
3ce6e1f662a9109 Tetsuo Handa 2021-07-06 1254 loop_global_unlock(lo, is_loop);
33ec3e53e7b1869 Jan Kara 2019-05-16 1255 out_bdev:
37c3fc9abb25cd7 Christoph Hellwig 2020-11-25 1256 if (!(mode & FMODE_EXCL))
37c3fc9abb25cd7 Christoph Hellwig 2020-11-25 1257 bd_abort_claiming(bdev, loop_configure);
^1da177e4c3f415 Linus Torvalds 2005-04-16 1258 out_putf:
^1da177e4c3f415 Linus Torvalds 2005-04-16 1259 fput(file);
^1da177e4c3f415 Linus Torvalds 2005-04-16 1260 /* This is safe: open() is still holding a reference. */
^1da177e4c3f415 Linus Torvalds 2005-04-16 1261 module_put(THIS_MODULE);
^1da177e4c3f415 Linus Torvalds 2005-04-16 1262 return error;
^1da177e4c3f415 Linus Torvalds 2005-04-16 1263 }
^1da177e4c3f415 Linus Torvalds 2005-04-16 1264
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
[-- Attachment #2: .config.gz --]
[-- Type: application/gzip, Size: 32969 bytes --]
^ permalink raw reply [flat|nested] 15+ messages in thread
end of thread, other threads:[~2021-10-27 0:21 UTC | newest]
Thread overview: 15+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-10-25 9:44 [PATCH 0/8] loop: improve dio on backing file Ming Lei
2021-10-25 9:44 ` [PATCH 1/8] loop: move flush_dcache_page to ->complete of request Ming Lei
2021-10-26 7:21 ` Christoph Hellwig
2021-10-25 9:44 ` [PATCH 2/8] loop: remove always true check Ming Lei
2021-10-26 7:31 ` Christoph Hellwig
2021-10-25 9:44 ` [PATCH 3/8] loop: add one helper for submitting IO on backing file Ming Lei
2021-10-25 9:44 ` [PATCH 4/8] loop: cover simple read/write via lo_rw_aio() Ming Lei
2021-10-26 7:35 ` Christoph Hellwig
2021-10-25 9:44 ` [PATCH 5/8] loop: fallback to buffered IO in case of dio submission Ming Lei
2021-10-26 7:36 ` Christoph Hellwig
2021-10-25 9:44 ` [PATCH 6/8] loop: relax loop dio use condition Ming Lei
2021-10-26 7:37 ` Christoph Hellwig
2021-10-27 0:20 ` kernel test robot
2021-10-25 9:44 ` [PATCH 7/8] loop: remove lo->use_dio Ming Lei
2021-10-25 9:44 ` [RFC PATCH 8/8] loop: use backing dio at default Ming Lei
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).