From: Ashish Sangwan <ashishsangwan2@gmail.com>
To: Miklos Szeredi <miklos@szeredi.hu>
Cc: fuse-devel@lists.sourceforge.net, linux-fsdevel@vger.kernel.org,
linux-kernel@vger.kernel.org,
Ashish Sangwan <ashishsangwan2@gmail.com>
Subject: [PATCH] FUSE: Improve aio directIO write performance for size extending writes.
Date: Thu, 7 Apr 2016 17:18:11 +0530 [thread overview]
Message-ID: <1460029691-7550-1-git-send-email-ashishsangwan2@gmail.com> (raw)
While sending the blocking directIO in fuse, the write request is broken
into sub-requests, each of default size 128k and all the requests are sent
in non-blocking background mode if async_dio mode is supported by libfuse.
The process which issue the write wait for the completion of all the
sub-requests. Sending multiple requests parallely gives a chance to perform
parallel writes in the user space fuse implementation if it is
multi-threaded and hence improves the performance.
When there is a size extending aio dio write, we switch to
blocking mode so that we can properly update the size of the file after
completion of the writes. However, in this situation all the sub-requests
are sent in serialized manner where the next request is sent only after
receiving the reply of the current request. Hence the multi-threaded user
space implementation is not utilized properly.
This patch changes the size extending aio dio behavior to exactly follow
blocking dio. For multi threaded fuse implementation having 10 threads and
using buffer size of 64MB to perform async directIO, we are getting double
the speed.
Signed-off-by: Ashish Sangwan <ashishsangwan2@gmail.com>
---
fs/fuse/file.c | 16 ++++++++--------
fs/fuse/fuse_i.h | 1 +
2 files changed, 9 insertions(+), 8 deletions(-)
diff --git a/fs/fuse/file.c b/fs/fuse/file.c
index 9dde38f..b4f8b83 100644
--- a/fs/fuse/file.c
+++ b/fs/fuse/file.c
@@ -572,11 +572,11 @@ static void fuse_aio_complete(struct fuse_io_priv *io, int err, ssize_t pos)
io->bytes = pos;
left = --io->reqs;
- if (!left && is_sync)
+ if (!left && (is_sync || io->blocking_aio))
complete(io->done);
spin_unlock(&io->lock);
- if (!left && !is_sync) {
+ if (!left && !is_sync && !io->blocking_aio) {
ssize_t res = fuse_get_res_by_io(io);
if (res >= 0) {
@@ -2884,17 +2884,17 @@ fuse_direct_IO(struct kiocb *iocb, struct iov_iter *iter, loff_t offset)
*/
io->async = async_dio;
io->iocb = iocb;
+ io->blocking_aio = false;
/*
- * We cannot asynchronously extend the size of a file. We have no method
- * to wait on real async I/O requests, so we must submit this request
- * synchronously.
+ * We cannot asynchronously extend the size of a file.
+ * In such case the aio will behave exactly like sync io.
*/
if (!is_sync && (offset + count > i_size) &&
iov_iter_rw(iter) == WRITE)
- io->async = false;
+ io->blocking_aio = true;
- if (io->async && is_sync) {
+ if (io->async && (is_sync | io->blocking_aio)) {
/*
* Additional reference to keep io around after
* calling fuse_aio_complete()
@@ -2914,7 +2914,7 @@ fuse_direct_IO(struct kiocb *iocb, struct iov_iter *iter, loff_t offset)
fuse_aio_complete(io, ret < 0 ? ret : 0, -1);
/* we have a non-extending, async request, so return */
- if (!is_sync)
+ if (!is_sync && !io->blocking_aio)
return -EIOCBQUEUED;
wait_for_completion(&wait);
diff --git a/fs/fuse/fuse_i.h b/fs/fuse/fuse_i.h
index eddbe02..a7cf03f 100644
--- a/fs/fuse/fuse_i.h
+++ b/fs/fuse/fuse_i.h
@@ -256,6 +256,7 @@ struct fuse_io_priv {
struct kiocb *iocb;
struct file *file;
struct completion *done;
+ bool blocking_aio;
};
#define FUSE_IO_PRIV_SYNC(f) \
--
1.7.9.5
next reply other threads:[~2016-04-07 11:48 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-04-07 11:48 Ashish Sangwan [this message]
2016-04-14 12:32 ` [PATCH] FUSE: Improve aio directIO write performance for size extending writes Ashish Sangwan
2016-06-14 11:44 ` Ashish Sangwan
2016-06-16 11:25 ` Miklos Szeredi
2016-06-16 11:51 ` Sedat Dilek
2016-06-16 12:01 ` Miklos Szeredi
2016-06-16 12:22 ` Sedat Dilek
2016-06-16 12:36 ` Miklos Szeredi
2016-06-20 9:20 ` Sedat Dilek
2016-06-20 6:50 ` Ashish Sangwan
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1460029691-7550-1-git-send-email-ashishsangwan2@gmail.com \
--to=ashishsangwan2@gmail.com \
--cc=fuse-devel@lists.sourceforge.net \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=miklos@szeredi.hu \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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).