[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [patch 5/5][v2] Try to aggregate free clusters and freed cl
From: |
Laurent Vivier |
Subject: |
[Qemu-devel] [patch 5/5][v2] Try to aggregate free clusters and freed clusters |
Date: |
Tue, 29 Jul 2008 16:13:57 +0200 |
User-agent: |
quilt/0.45-1 |
In free_used_clusters(), try to aggregate free clusters and freed clusters.
Signed-off-by: Laurent Vivier <address@hidden>
---
block-qcow2.c | 61 ++++++++++++++++++++++++++++++++++------------------------
1 file changed, 36 insertions(+), 25 deletions(-)
Index: qemu/block-qcow2.c
===================================================================
--- qemu.orig/block-qcow2.c 2008-07-29 15:22:28.000000000 +0200
+++ qemu/block-qcow2.c 2008-07-29 15:22:30.000000000 +0200
@@ -649,6 +649,8 @@ static uint64_t free_used_clusters(Block
BDRVQcowState *s = bs->opaque;
int l1_index, ret;
uint64_t cluster_offset;
+ int i, j, do_loop;
+ uint64_t current;
l1_index = offset >> (s->l2_bits + s->cluster_bits);
if (l1_index >= s->l1_size) {
@@ -676,17 +678,6 @@ static uint64_t free_used_clusters(Block
if (nb_clusters && *nb_clusters > s->l2_size - (*l2_index))
*nb_clusters = s->l2_size - (*l2_index);
- if (!cluster_offset) {
- if (nb_clusters) {
- int i = 1;
- while (i < *nb_clusters && (*l2_table)[(*l2_index) + i] == 0) {
- i++;
- }
- *nb_clusters = i;
- }
- return 0;
- }
-
if (cluster_offset & QCOW_OFLAG_COPIED) {
if (nb_clusters) {
int i = 1;
@@ -702,8 +693,6 @@ static uint64_t free_used_clusters(Block
return cluster_offset;
}
- /* free the cluster */
-
if (cluster_offset & QCOW_OFLAG_COMPRESSED) {
int nb_csectors;
nb_csectors = ((cluster_offset >> s->csize_shift) & s->csize_mask) + 1;
@@ -714,22 +703,44 @@ static uint64_t free_used_clusters(Block
return 0;
}
- if (nb_clusters) {
- int i = 1;
- uint64_t current;
- while (i < *nb_clusters) {
- current = be64_to_cpu((*l2_table)[(*l2_index) + i]);
- if (cluster_offset + (i << s->cluster_bits) != current)
- break;
- i++;
- }
- *nb_clusters = i;
- free_clusters(bs, cluster_offset, i << s->cluster_bits);
+ if (!nb_clusters) {
+ if (cluster_offset)
+ free_clusters(bs, cluster_offset, s->cluster_size);
return 0;
}
- free_clusters(bs, cluster_offset, s->cluster_size);
+ i = 0;
+ do_loop = 1;
+ while (i < *nb_clusters && do_loop) {
+ i++;
+ if (!cluster_offset) {
+ while (i < *nb_clusters) {
+ cluster_offset = (*l2_table)[(*l2_index) + i];
+ if (cluster_offset)
+ break;
+ i++;
+ }
+ if ((cluster_offset & QCOW_OFLAG_COPIED) ||
+ (cluster_offset & QCOW_OFLAG_COMPRESSED))
+ do_loop = 0;
+ } else {
+ j = 1;
+ current = 0;
+ while (i < *nb_clusters) {
+ current = be64_to_cpu((*l2_table)[(*l2_index) + i]);
+ if (cluster_offset + (j << s->cluster_bits) != current)
+ break;
+ i++;
+ j++;
+ }
+ free_clusters(bs, cluster_offset, j << s->cluster_bits);
+ cluster_offset = current;
+ if (current)
+ do_loop = 0;
+ }
+ }
+ *nb_clusters = i;
return 0;
}
--
- [Qemu-devel] [patch 0/5][v2] qcow2: improve I/O performance with cache=off, Laurent Vivier, 2008/07/29
- [Qemu-devel] [patch 1/5][v2] Extract code from get_cluster_offset(), Laurent Vivier, 2008/07/29
- [Qemu-devel] [patch 4/5][v2] Aggregate same type clusters., Laurent Vivier, 2008/07/29
- [Qemu-devel] [patch 3/5][v2] Extract compressing part from alloc_cluster_offset(), Laurent Vivier, 2008/07/29
- [Qemu-devel] [patch 2/5][v2] Divide get_cluster_offset(), Laurent Vivier, 2008/07/29
- [Qemu-devel] [patch 5/5][v2] Try to aggregate free clusters and freed clusters,
Laurent Vivier <=
- Re: [Qemu-devel] [patch 0/5][v2] qcow2: improve I/O performance with cache=off, Anthony Liguori, 2008/07/29