From: Eric Wheeler <ewheeler@ewheeler.net>
To: lvm-devel@redhat.com
Subject: [PATCH] dm-thinp: skip allocation on writes of all zeros to unallocated blocks
Date: Wed, 3 Dec 2014 23:25:07 -0800 (PST) [thread overview]
Message-ID: <alpine.DEB.2.02.1412032318290.29609@ware.dreamhost.com> (raw)
In-Reply-To: <alpine.DEB.2.02.1412032237010.12556@ware.dreamhost.com>
This patch skips all-zero writes to unallocated blocks of dm-thinp volumes.
Unallocated zero-writes are 70x faster and never allocate space in this test:
# dd if=/dev/zero of=/dev/test/test1 bs=1M count=1024
1073741824 bytes (1.1 GB) copied, 0.794343 s, 1.4 GB/s
Without the patch, zero-writes allocate space and hit the disk:
# dd if=/dev/zero of=/dev/test/test1 bs=1M count=1024
1073741824 bytes (1.1 GB) copied, 53.8064 s, 20.0 MB/s
For the test below, notice the allocation difference for thin volumes
test1 and test2 (after dd if=test1 of=test2), even though they have the
same md5sum:
LV VG Attr LSize Pool Origin Data%
test1 test Vwi-a-tz-- 4.00g thinp 22.04
test2 test Vwi-a-tz-- 4.00g thinp 18.33
An additional 3.71% of space was saved by the patch, and so were
the ~150MB of (possibly random) IOs that would have hit disk, not to
mention reads that now bypass the disk since they are unallocated.
We also save the metadata overhead of ~2400 allocations when calling
provision_block().
# lvcreate -T test/thinp -L 5G
# lvcreate -T test/thinp -V 4G -n test1
# lvcreate -T test/thinp -V 4G -n test2
Simple ext4+kernel tree extract test:
First prepare two dm-thinp volumes test1 and test2 of equal size. First
mkfs.ext4 /dev/test/test1 without the patch and then mount and extract
3.17.4's source tree onto the test1 filesystem, and unmount
Next, install patched dm_thin_pool.ko, then dd test1 over test2 and
verify checksums:
# dd if=/dev/test/test1 of=/dev/test/test2 bs=1M
# md5sum /dev/test/test?
b210f032a6465178103317f3c40ab59f /dev/test/test1
b210f032a6465178103317f3c40ab59f /dev/test/test2
Yes, they match!
Signed-off-by: Eric Wheeler <lvm-dev@lists.ewheeler.net>
---
Resending the patch as it was malformed on the first try.
Eric Wheeler, President eWheeler, Inc. dba Global Linux Security
888-LINUX26 (888-546-8926) Fax: 503-716-3878 PO Box 25107
www.GlobalLinuxSecurity.pro Linux since 1996! Portland, OR 97298
drivers/md/dm-thin.c | 45 +++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 45 insertions(+), 0 deletions(-)
diff --git a/drivers/md/dm-thin.c b/drivers/md/dm-thin.c
index fc9c848..71dd545 100644
--- a/drivers/md/dm-thin.c
+++ b/drivers/md/dm-thin.c
@@ -1230,6 +1230,42 @@ static void process_shared_bio(struct thin_c *tc, struct bio *bio,
}
}
+/* return true if bio data contains all 0x00's */
+bool bio_all_zeros(struct bio *bio)
+{
+ unsigned long flags;
+ struct bio_vec bv;
+ struct bvec_iter iter;
+
+ char *data;
+ uint64_t *p;
+ int i, count;
+
+ bool allzeros = true;
+
+ bio_for_each_segment(bv, bio, iter) {
+ data = bvec_kmap_irq(&bv, &flags);
+
+ p = (uint64_t*)data;
+ count = bv.bv_len / sizeof(uint64_t);
+
+ for (i = 0; i < count; i++) {
+ if (*p) {
+ allzeros = false;
+ break;
+ }
+ p++;
+ }
+
+ bvec_kunmap_irq(data, &flags);
+
+ if (likely(!allzeros))
+ break;
+ }
+
+ return allzeros;
+}
+
static void provision_block(struct thin_c *tc, struct bio *bio, dm_block_t block,
struct dm_bio_prison_cell *cell)
{
@@ -1258,6 +1294,15 @@ static void provision_block(struct thin_c *tc, struct bio *bio, dm_block_t block
return;
}
+ /*
+ * Skip writes of all zeroes
+ */
+ if (bio_data_dir(bio) == WRITE && unlikely( bio_all_zeros(bio) )) {
+ cell_defer_no_holder(tc, cell);
+ bio_endio(bio, 0);
+ return;
+ }
+
r = alloc_data_block(tc, &data_block);
switch (r) {
case 0:
--
1.7.1
next prev parent reply other threads:[~2014-12-04 7:25 UTC|newest]
Thread overview: 46+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-09-30 18:38 dm-thinp feature request: skip allocation on writes of all zeroes Eric Wheeler
2014-09-30 19:30 ` Zdenek Kabelac
2014-09-30 20:13 ` Mike Snitzer
2014-09-30 22:38 ` Eric Wheeler
2014-12-04 7:05 ` [PATCH] dm-thinp: skip allocation on writes of all zeros to unallocated blocks Eric Wheeler
2014-12-04 7:25 ` Eric Wheeler [this message]
2014-12-04 15:33 ` [PATCH] dm thin: optimize away writing all zeroes to unprovisioned blocks Mike Snitzer
2014-12-04 15:33 ` Mike Snitzer
2014-12-04 15:43 ` Mike Snitzer
2014-12-04 15:43 ` Mike Snitzer
2014-12-06 22:33 ` Eric Wheeler
2014-12-06 22:33 ` Eric Wheeler
2014-12-05 14:47 ` Mike Snitzer
2014-12-05 14:47 ` Mike Snitzer
2014-12-06 22:36 ` Eric Wheeler
2014-12-06 22:36 ` Eric Wheeler
2014-12-05 17:27 ` [PATCH] " Jens Axboe
2014-12-05 17:27 ` Jens Axboe
2014-12-05 18:33 ` Mike Snitzer
2014-12-05 18:33 ` Mike Snitzer
2014-12-06 22:40 ` Eric Wheeler
2014-12-06 22:40 ` Eric Wheeler
2014-12-07 1:41 ` [lvm-devel] " Jens Axboe
2014-12-07 1:41 ` Jens Axboe
2014-12-07 6:30 ` Eric Wheeler
2014-12-07 6:30 ` Eric Wheeler
2014-12-07 6:45 ` Eric Wheeler
2014-12-07 6:45 ` Eric Wheeler
2014-12-08 16:57 ` [lvm-devel] " Jens Axboe
2014-12-08 16:57 ` Jens Axboe
2014-12-09 8:02 ` Eric Wheeler
2014-12-09 8:02 ` Eric Wheeler
2014-12-09 15:31 ` [lvm-devel] " Jens Axboe
2014-12-09 15:31 ` Jens Axboe
2014-12-09 15:41 ` [lvm-devel] " Jens Axboe
2014-12-09 15:41 ` Jens Axboe
2014-12-10 2:52 ` [PATCH] " Eric Wheeler
2014-12-10 2:52 ` Eric Wheeler
2015-01-26 2:53 ` Eric Wheeler
2015-01-26 2:53 ` Eric Wheeler
2015-02-15 0:31 ` [lvm-devel] " Eric Wheeler
2015-02-15 0:31 ` Eric Wheeler
2014-12-09 14:38 ` Marian Csontos
2014-12-09 14:38 ` Marian Csontos
2014-12-07 1:36 ` Jens Axboe
2014-12-07 1:36 ` Jens Axboe
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=alpine.DEB.2.02.1412032318290.29609@ware.dreamhost.com \
--to=ewheeler@ewheeler.net \
--cc=lvm-devel@redhat.com \
/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 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.