* [Qemu-devel] [PATCH 0/2] eliminate data write in bdrv_write_zeroes on Linux
@ 2014-12-25 5:37 Denis V. Lunev
2014-12-25 5:37 ` [Qemu-devel] [PATCH 1/2] block: use fallocate(FALLOC_FL_ZERO_RANGE) in handle_aiocb_write_zeroes Denis V. Lunev
2014-12-25 5:37 ` [Qemu-devel] [PATCH 2/2] block: use fallocate(FALLOC_FL_PUNCH_HOLE) & fallocate(0) to write zeroes Denis V. Lunev
0 siblings, 2 replies; 5+ messages in thread
From: Denis V. Lunev @ 2014-12-25 5:37 UTC (permalink / raw)
Cc: Kevin Wolf, Denis V. Lunev, qemu-devel, Stefan Hajnoczi
These patches eliminate data writes completely on Linux if fallocate
FALLOC_FL_ZERO_RANGE or FALLOC_FL_PUNCH_HOLE are supported on
underlying filesystem. This should seriously increase performance in
some cases.
Signed-off-by: Denis V. Lunev <den@openvz.org>
CC: Kevin Wolf <kwolf@redhat.com>
CC: Stefan Hajnoczi <stefanha@redhat.com>
^ permalink raw reply [flat|nested] 5+ messages in thread
* [Qemu-devel] [PATCH 1/2] block: use fallocate(FALLOC_FL_ZERO_RANGE) in handle_aiocb_write_zeroes
2014-12-25 5:37 [Qemu-devel] [PATCH 0/2] eliminate data write in bdrv_write_zeroes on Linux Denis V. Lunev
@ 2014-12-25 5:37 ` Denis V. Lunev
2014-12-26 8:45 ` Roman Kagan
2014-12-25 5:37 ` [Qemu-devel] [PATCH 2/2] block: use fallocate(FALLOC_FL_PUNCH_HOLE) & fallocate(0) to write zeroes Denis V. Lunev
1 sibling, 1 reply; 5+ messages in thread
From: Denis V. Lunev @ 2014-12-25 5:37 UTC (permalink / raw)
Cc: Kevin Wolf, Denis V. Lunev, qemu-devel, Stefan Hajnoczi
this efficiently writes zeroes in the middle of the file on Linux
systems if the kernel is capable enough.
Signed-off-by: Denis V. Lunev <den@openvz.org>
CC: Kevin Wolf <kwolf@redhat.com>
CC: Stefan Hajnoczi <stefanha@redhat.com>
---
block/raw-posix.c | 11 +++++++++++
configure | 19 +++++++++++++++++++
2 files changed, 30 insertions(+)
diff --git a/block/raw-posix.c b/block/raw-posix.c
index e51293a..9e66cb7 100644
--- a/block/raw-posix.c
+++ b/block/raw-posix.c
@@ -919,6 +919,17 @@ static ssize_t handle_aiocb_write_zeroes(RawPosixAIOData *aiocb)
return xfs_write_zeroes(s, aiocb->aio_offset, aiocb->aio_nbytes);
}
#endif
+
+#ifdef CONFIG_FALLOCATE_ZERO_RANGE
+ do {
+ if (fallocate(s->fd, CONFIG_FALLOCATE_ZERO_RANGE,
+ aiocb->aio_offset, aiocb->aio_nbytes) == 0) {
+ return 0;
+ }
+ } while (errno == EINTR);
+
+ ret = -errno;
+#endif
}
if (ret == -ENODEV || ret == -ENOSYS || ret == -EOPNOTSUPP ||
diff --git a/configure b/configure
index cae588c..dfcf7b3 100755
--- a/configure
+++ b/configure
@@ -3309,6 +3309,22 @@ if compile_prog "" "" ; then
fallocate_punch_hole=yes
fi
+# check that fallocate supports range zeroing inside the file
+fallocate_zero_range=no
+cat > $TMPC << EOF
+#include <fcntl.h>
+#include <linux/falloc.h>
+
+int main(void)
+{
+ fallocate(0, FALLOC_FL_ZERO_RANGE, 0, 0);
+ return 0;
+}
+EOF
+if compile_prog "" "" ; then
+ fallocate_zero_range=yes
+fi
+
# check for posix_fallocate
posix_fallocate=no
cat > $TMPC << EOF
@@ -4538,6 +4554,9 @@ fi
if test "$fallocate_punch_hole" = "yes" ; then
echo "CONFIG_FALLOCATE_PUNCH_HOLE=y" >> $config_host_mak
fi
+if test "$fallocate_zero_range" = "yes" ; then
+ echo "CONFIG_FALLOCATE_ZERO_RANGE=y" >> $config_host_mak
+fi
if test "$posix_fallocate" = "yes" ; then
echo "CONFIG_POSIX_FALLOCATE=y" >> $config_host_mak
fi
--
1.9.1
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [Qemu-devel] [PATCH 2/2] block: use fallocate(FALLOC_FL_PUNCH_HOLE) & fallocate(0) to write zeroes
2014-12-25 5:37 [Qemu-devel] [PATCH 0/2] eliminate data write in bdrv_write_zeroes on Linux Denis V. Lunev
2014-12-25 5:37 ` [Qemu-devel] [PATCH 1/2] block: use fallocate(FALLOC_FL_ZERO_RANGE) in handle_aiocb_write_zeroes Denis V. Lunev
@ 2014-12-25 5:37 ` Denis V. Lunev
2014-12-26 9:25 ` Roman Kagan
1 sibling, 1 reply; 5+ messages in thread
From: Denis V. Lunev @ 2014-12-25 5:37 UTC (permalink / raw)
Cc: Kevin Wolf, Denis V. Lunev, qemu-devel, Stefan Hajnoczi
This sequence works efficiently if FALLOC_FL_ZERO_RANGE is not supported.
The idea is that FALLOC_FL_PUNCH_HOLE could not increase file size
but it cleans already allocated blocks inside the file. If we have to
create something new, simple fallocate will do the job.
This should increase performance a bit for not-so-modern kernels or for
filesystems which do not support FALLOC_FL_ZERO_RANGE.
Signed-off-by: Denis V. Lunev <den@openvz.org>
CC: Kevin Wolf <kwolf@redhat.com>
CC: Stefan Hajnoczi <stefanha@redhat.com>
---
block/raw-posix.c | 12 ++++++++++++
1 file changed, 12 insertions(+)
diff --git a/block/raw-posix.c b/block/raw-posix.c
index 9e66cb7..60972a1 100644
--- a/block/raw-posix.c
+++ b/block/raw-posix.c
@@ -930,6 +930,18 @@ static ssize_t handle_aiocb_write_zeroes(RawPosixAIOData *aiocb)
ret = -errno;
#endif
+#ifdef CONFIG_FALLOCATE_PUNCH_HOLE
+ do {
+ if (fallocate(s->fd, FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE,
+ aiocb->aio_offset, aiocb->aio_nbytes) == 0 &&
+ fallocate(s->fd, 0,
+ aiocb->aio_offset, aiocb->aio_nbytes) == 0) {
+ return 0;
+ }
+ } while (errno == EINTR);
+
+ ret = -errno;
+#endif
}
if (ret == -ENODEV || ret == -ENOSYS || ret == -EOPNOTSUPP ||
--
1.9.1
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [Qemu-devel] [PATCH 1/2] block: use fallocate(FALLOC_FL_ZERO_RANGE) in handle_aiocb_write_zeroes
2014-12-25 5:37 ` [Qemu-devel] [PATCH 1/2] block: use fallocate(FALLOC_FL_ZERO_RANGE) in handle_aiocb_write_zeroes Denis V. Lunev
@ 2014-12-26 8:45 ` Roman Kagan
0 siblings, 0 replies; 5+ messages in thread
From: Roman Kagan @ 2014-12-26 8:45 UTC (permalink / raw)
To: Denis V. Lunev; +Cc: Kevin Wolf, qemu-devel, Stefan Hajnoczi
On Thu, Dec 25, 2014 at 08:37:29AM +0300, Denis V. Lunev wrote:
> +#ifdef CONFIG_FALLOCATE_ZERO_RANGE
> + do {
> + if (fallocate(s->fd, CONFIG_FALLOCATE_ZERO_RANGE,
Must be a typo, FALLOC_FL_ZERO_RANGE is what you mean.
Roman.
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [Qemu-devel] [PATCH 2/2] block: use fallocate(FALLOC_FL_PUNCH_HOLE) & fallocate(0) to write zeroes
2014-12-25 5:37 ` [Qemu-devel] [PATCH 2/2] block: use fallocate(FALLOC_FL_PUNCH_HOLE) & fallocate(0) to write zeroes Denis V. Lunev
@ 2014-12-26 9:25 ` Roman Kagan
0 siblings, 0 replies; 5+ messages in thread
From: Roman Kagan @ 2014-12-26 9:25 UTC (permalink / raw)
To: Denis V. Lunev; +Cc: Kevin Wolf, qemu-devel, Stefan Hajnoczi
On Thu, Dec 25, 2014 at 08:37:30AM +0300, Denis V. Lunev wrote:
> This sequence works efficiently if FALLOC_FL_ZERO_RANGE is not supported.
> The idea is that FALLOC_FL_PUNCH_HOLE could not increase file size
> but it cleans already allocated blocks inside the file. If we have to
> create something new, simple fallocate will do the job.
>
> This should increase performance a bit for not-so-modern kernels or for
> filesystems which do not support FALLOC_FL_ZERO_RANGE.
>
> Signed-off-by: Denis V. Lunev <den@openvz.org>
> CC: Kevin Wolf <kwolf@redhat.com>
> CC: Stefan Hajnoczi <stefanha@redhat.com>
> ---
> block/raw-posix.c | 12 ++++++++++++
> 1 file changed, 12 insertions(+)
>
> diff --git a/block/raw-posix.c b/block/raw-posix.c
> index 9e66cb7..60972a1 100644
> --- a/block/raw-posix.c
> +++ b/block/raw-posix.c
> @@ -930,6 +930,18 @@ static ssize_t handle_aiocb_write_zeroes(RawPosixAIOData *aiocb)
>
> ret = -errno;
> #endif
> +#ifdef CONFIG_FALLOCATE_PUNCH_HOLE
> + do {
> + if (fallocate(s->fd, FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE,
> + aiocb->aio_offset, aiocb->aio_nbytes) == 0 &&
> + fallocate(s->fd, 0,
> + aiocb->aio_offset, aiocb->aio_nbytes) == 0) {
> + return 0;
> + }
> + } while (errno == EINTR);
> +
> + ret = -errno;
> +#endif
This is suboptimal in that fallocate(FALLOC_FL_ZERO_RANGE) would always
be called in vain for such systems. Might be worth another flag in
BDRVRawState?
Roman.
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2014-12-26 9:26 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-12-25 5:37 [Qemu-devel] [PATCH 0/2] eliminate data write in bdrv_write_zeroes on Linux Denis V. Lunev
2014-12-25 5:37 ` [Qemu-devel] [PATCH 1/2] block: use fallocate(FALLOC_FL_ZERO_RANGE) in handle_aiocb_write_zeroes Denis V. Lunev
2014-12-26 8:45 ` Roman Kagan
2014-12-25 5:37 ` [Qemu-devel] [PATCH 2/2] block: use fallocate(FALLOC_FL_PUNCH_HOLE) & fallocate(0) to write zeroes Denis V. Lunev
2014-12-26 9:25 ` Roman Kagan
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).