qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: "Denis V. Lunev" <den@openvz.org>
Cc: Kevin Wolf <kwolf@redhat.com>, "Denis V. Lunev" <den@openvz.org>,
	qemu-devel@nongnu.org, Stefan Hajnoczi <stefanha@redhat.com>
Subject: [Qemu-devel] [PATCH 27/27] block/parallels: improve image writing performance further
Date: Wed, 11 Mar 2015 13:28:21 +0300	[thread overview]
Message-ID: <1426069701-1405-28-git-send-email-den@openvz.org> (raw)
In-Reply-To: <1426069701-1405-1-git-send-email-den@openvz.org>

Try to perform IO for the biggest continuous block possible.
All blocks abscent in the image are accounted in the same type
and preallocation is made for all of them at once.

The performance for sequential write is increased from 200 Gb/sec to
235 Gb/sec on my SSD HDD.

Signed-off-by: Denis V. Lunev <den@openvz.org>
Reviewed-by: Roman Kagan <rkagan@parallels.com>
CC: Kevin Wolf <kwolf@redhat.com>
CC: Stefan Hajnoczi <stefanha@redhat.com>
---
 block/parallels.c | 44 ++++++++++++++++++++++++--------------------
 1 file changed, 24 insertions(+), 20 deletions(-)

diff --git a/block/parallels.c b/block/parallels.c
index 2a1e31f..7531340 100644
--- a/block/parallels.c
+++ b/block/parallels.c
@@ -179,43 +179,47 @@ static int64_t block_status(BDRVParallelsState *s, int64_t sector_num,
     return start_off;
 }
 
-static int64_t allocate_cluster(BlockDriverState *bs, int64_t sector_num)
+static int64_t allocate_clusters(BlockDriverState *bs, int64_t sector_num,
+                                 int nb_sectors, int *pnum)
 {
     BDRVParallelsState *s = bs->opaque;
-    uint32_t idx, offset;
-    int64_t pos;
+    uint32_t idx, to_allocate, i;
+    int64_t pos, space;
 
-    idx = sector_num / s->tracks;
-    offset = sector_num % s->tracks;
+    pos = block_status(s, sector_num, nb_sectors, pnum);
+    if (pos > 0) {
+        return pos;
+    }
 
+    idx = sector_num / s->tracks;
     if (idx >= s->bat_size) {
         return -EINVAL;
     }
-    if (s->bat_bitmap[idx] != 0) {
-        return bat2sect(s, idx) + offset;
-    }
 
-    pos = bdrv_getlength(bs->file) >> BDRV_SECTOR_BITS;
-    if (s->data_end + s->tracks > pos) {
+    to_allocate = (sector_num + *pnum + s->tracks - 1) / s->tracks - idx;
+    space = to_allocate * s->tracks;
+    if (s->data_end + space > bdrv_getlength(bs->file) >> BDRV_SECTOR_BITS) {
         int ret;
+        space += s->prealloc_size;
         if (s->prealloc_mode == PRL_PREALLOC_MODE_FALLOCATE) {
-            ret = bdrv_write_zeroes(bs->file, s->data_end,
-                                    s->prealloc_size, 0);
+            ret = bdrv_write_zeroes(bs->file, s->data_end, space, 0);
         } else {
             ret = bdrv_truncate(bs->file,
-                    (s->data_end + s->prealloc_size) << BDRV_SECTOR_BITS);
+                                (s->data_end + space) << BDRV_SECTOR_BITS);
         }
         if (ret < 0) {
             return ret;
         }
     }
-    pos = s->data_end;
-    s->data_end += s->tracks;
 
-    s->bat_bitmap[idx] = cpu_to_le32(pos / s->off_multiplier);
+    for (i = 0; i < to_allocate; i++) {
+        s->bat_bitmap[idx + i] = cpu_to_le32(s->data_end / s->off_multiplier);
+        s->data_end += s->tracks;
+        bitmap_set(s->bat_dirty_bmap,
+                   bat_entry_off(idx) / s->bat_dirty_block, 1);
+    }
 
-    bitmap_set(s->bat_dirty_bmap, bat_entry_off(idx) / s->bat_dirty_block, 1);
-    return bat2sect(s, idx) + offset;
+    return bat2sect(s, idx) + sector_num % s->tracks;
 }
 
 
@@ -280,8 +284,8 @@ static coroutine_fn int parallels_co_writev(BlockDriverState *bs,
 
     qemu_co_mutex_lock(&s->lock);
     while (nb_sectors > 0) {
-        int64_t position = allocate_cluster(bs, sector_num);
-        int n = cluster_remainder(s, sector_num, nb_sectors);
+        int n;
+        int64_t position = allocate_clusters(bs, sector_num, nb_sectors, &n);
         int nbytes = n << BDRV_SECTOR_BITS;
 
         if (position < 0) {
-- 
1.9.1

  parent reply	other threads:[~2015-03-11 10:27 UTC|newest]

Thread overview: 80+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-03-11 10:27 [Qemu-devel] [PATCH v3 0/27] write/create for Parallels images with reasonable performance Denis V. Lunev
2015-03-11 10:27 ` [Qemu-devel] [PATCH 01/27] iotests, parallels: quote TEST_IMG in 076 test to be path-safe Denis V. Lunev
2015-04-22 12:19   ` Stefan Hajnoczi
2015-03-11 10:27 ` [Qemu-devel] [PATCH 02/27] block/parallels: rename parallels_header to ParallelsHeader Denis V. Lunev
2015-04-22 12:19   ` Stefan Hajnoczi
2015-03-11 10:27 ` [Qemu-devel] [PATCH 03/27] block/parallels: switch to bdrv_read Denis V. Lunev
2015-04-22 12:23   ` Stefan Hajnoczi
2015-04-22 12:30     ` Denis V. Lunev
2015-04-23  8:48       ` Stefan Hajnoczi
2015-03-11 10:27 ` [Qemu-devel] [PATCH 04/27] block/parallels: read up to cluster end in one go Denis V. Lunev
2015-04-22 12:28   ` Stefan Hajnoczi
2015-03-11 10:27 ` [Qemu-devel] [PATCH 05/27] block/parallels: add get_block_status Denis V. Lunev
2015-04-22 12:39   ` Stefan Hajnoczi
2015-04-22 12:42     ` Denis V. Lunev
2015-04-23  9:03       ` Stefan Hajnoczi
2015-04-23  9:23         ` Denis V. Lunev
2015-04-24  8:27           ` Stefan Hajnoczi
2015-03-11 10:28 ` [Qemu-devel] [PATCH 06/27] block/parallels: provide _co_readv routine for parallels format driver Denis V. Lunev
2015-04-22 12:41   ` Stefan Hajnoczi
2015-04-22 12:43     ` Denis V. Lunev
2015-03-11 10:28 ` [Qemu-devel] [PATCH 07/27] block/parallels: replace magic constants 4, 64 with proper sizeofs Denis V. Lunev
2015-04-22 12:42   ` Stefan Hajnoczi
2015-03-11 10:28 ` [Qemu-devel] [PATCH 08/27] block/parallels: _co_writev callback for Parallels format Denis V. Lunev
2015-04-22 12:44   ` Denis V. Lunev
2015-04-22 13:00   ` Stefan Hajnoczi
2015-04-22 13:08   ` Stefan Hajnoczi
2015-04-22 13:16     ` Denis V. Lunev
2015-04-23  9:20       ` Stefan Hajnoczi
2015-04-23  9:32         ` Kevin Wolf
2015-04-23  9:47           ` Denis V. Lunev
2015-04-23 10:09             ` Kevin Wolf
2015-04-23  9:36         ` Denis V. Lunev
2015-03-11 10:28 ` [Qemu-devel] [PATCH 09/27] iotests, parallels: test for write into Parallels image Denis V. Lunev
2015-04-22 13:09   ` Stefan Hajnoczi
2015-03-11 10:28 ` [Qemu-devel] [PATCH 10/27] block/parallels: support parallels image creation Denis V. Lunev
2015-04-22 13:15   ` Stefan Hajnoczi
2015-03-11 10:28 ` [Qemu-devel] [PATCH 11/27] iotests, parallels: test for newly created parallels image via qemu-img Denis V. Lunev
2015-04-22 13:17   ` Stefan Hajnoczi
2015-03-11 10:28 ` [Qemu-devel] [PATCH 12/27] parallels: change copyright information in the image header Denis V. Lunev
2015-04-22 13:26   ` Stefan Hajnoczi
2015-04-22 13:26   ` Stefan Hajnoczi
2015-03-11 10:28 ` [Qemu-devel] [PATCH 13/27] block/parallels: rename catalog_ names to bat_ Denis V. Lunev
2015-04-22 13:28   ` Stefan Hajnoczi
2015-03-11 10:28 ` [Qemu-devel] [PATCH 14/27] block/parallels: create bat2sect helper Denis V. Lunev
2015-04-22 13:29   ` Stefan Hajnoczi
2015-03-11 10:28 ` [Qemu-devel] [PATCH 15/27] block/parallels: keep BAT bitmap data in little endian in memory Denis V. Lunev
2015-04-22 13:31   ` Stefan Hajnoczi
2015-03-11 10:28 ` [Qemu-devel] [PATCH 16/27] block/parallels: read parallels image header and BAT into single buffer Denis V. Lunev
2015-04-22 13:39   ` Stefan Hajnoczi
2015-03-11 10:28 ` [Qemu-devel] [PATCH 17/27] block/parallels: move parallels_open/probe to the very end of the file Denis V. Lunev
2015-04-22 13:40   ` Stefan Hajnoczi
2015-03-11 10:28 ` [Qemu-devel] [PATCH 18/27] block/parallels: implement parallels_check method of block driver Denis V. Lunev
2015-03-11 10:44   ` Roman Kagan
2015-04-22 13:53   ` Stefan Hajnoczi
2015-03-11 10:28 ` [Qemu-devel] [PATCH 19/27] block/parallels: implement incorrect close detection Denis V. Lunev
2015-04-22 13:55   ` Stefan Hajnoczi
2015-03-11 10:28 ` [Qemu-devel] [PATCH 20/27] iotests, parallels: check for incorrectly closed image in tests Denis V. Lunev
2015-04-22 14:04   ` Stefan Hajnoczi
2015-03-11 10:28 ` [Qemu-devel] [PATCH 21/27] block/parallels: no need to flush on each block allocation table update Denis V. Lunev
2015-04-22 14:05   ` Stefan Hajnoczi
2015-04-22 14:08     ` Denis V. Lunev
2015-03-11 10:28 ` [Qemu-devel] [PATCH 22/27] block/parallels: improve image reading performance Denis V. Lunev
2015-04-22 14:11   ` Stefan Hajnoczi
2015-04-22 14:13     ` Denis V. Lunev
2015-03-11 10:28 ` [Qemu-devel] [PATCH 23/27] block/parallels: create bat_entry_off helper Denis V. Lunev
2015-04-22 14:13   ` Stefan Hajnoczi
2015-03-11 10:28 ` [Qemu-devel] [PATCH 24/27] block/parallels: delay writing to BAT till bdrv_co_flush_to_os Denis V. Lunev
2015-04-22 14:16   ` Stefan Hajnoczi
2015-03-11 10:28 ` [Qemu-devel] [PATCH 25/27] block/parallels: add prealloc-mode and prealloc-size open paramemets Denis V. Lunev
2015-03-11 10:28 ` [Qemu-devel] [PATCH 26/27] block/parallels: optimize linear image expansion Denis V. Lunev
2015-04-22 14:18   ` Stefan Hajnoczi
2015-04-22 14:25     ` Denis V. Lunev
2015-04-22 15:41       ` Denis V. Lunev
2015-04-23  9:26       ` Stefan Hajnoczi
2015-03-11 10:28 ` Denis V. Lunev [this message]
2015-04-22 14:19 ` [Qemu-devel] [PATCH v3 0/27] write/create for Parallels images with reasonable performance Stefan Hajnoczi
  -- strict thread matches above, loose matches on Subject: below --
2015-04-28  7:46 [Qemu-devel] [PATCH v4 " Denis V. Lunev
2015-04-28  7:47 ` [Qemu-devel] [PATCH 27/27] block/parallels: improve image writing performance further Denis V. Lunev
2015-05-18 16:33   ` Stefan Hajnoczi
2015-03-10  8:50 [Qemu-devel] [PATCH v3 0/27] write/create for Parallels images with reasonable performance Denis V. Lunev
2015-03-10  8:51 ` [Qemu-devel] [PATCH 27/27] block/parallels: improve image writing performance further Denis V. Lunev
2015-03-11  9:25   ` Roman Kagan

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=1426069701-1405-28-git-send-email-den@openvz.org \
    --to=den@openvz.org \
    --cc=kwolf@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=stefanha@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 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).