This patch improves qcow_l2_cache_write() to only flush dirty L2 tables. Cc: Asias He <asias.hejun@xxxxxxxxx> Cc: Cyrill Gorcunov <gorcunov@xxxxxxxxx> Cc: Ingo Molnar <mingo@xxxxxxx> Cc: Prasad Joshi <prasadjoshi124@xxxxxxxxx> Cc: Sasha Levin <levinsasha928@xxxxxxxxx> Signed-off-by: Pekka Enberg <penberg@xxxxxxxxxx> --- tools/kvm/disk/qcow.c | 11 ++++++++++- tools/kvm/include/kvm/qcow.h | 1 + 2 files changed, 11 insertions(+), 1 deletions(-) diff --git a/tools/kvm/disk/qcow.c b/tools/kvm/disk/qcow.c index b71762f..13c8bea 100644 --- a/tools/kvm/disk/qcow.c +++ b/tools/kvm/disk/qcow.c @@ -93,9 +93,17 @@ static int qcow_l2_cache_write(struct qcow *q, struct qcow_l2_table *c) struct qcow_header *header = q->header; u64 size; + if (!c->dirty) + return 0; + size = 1 << header->l2_bits; - return pwrite_in_full(q->fd, c->table, size * sizeof(u64), c->offset); + if (pwrite_in_full(q->fd, c->table, size * sizeof(u64), c->offset) < 0) + return -1; + + c->dirty = 0; + + return 0; } static int cache_table(struct qcow *q, struct qcow_l2_table *c) @@ -447,6 +455,7 @@ static ssize_t qcow_write_cluster(struct qcow *q, u64 offset, void *buf, u32 src if (!clust_start) { clust_start = ALIGN(f_sz, clust_sz); l2t->table[l2t_idx] = cpu_to_be64(clust_start); + l2t->dirty = 1; } mutex_unlock(&q->mutex); diff --git a/tools/kvm/include/kvm/qcow.h b/tools/kvm/include/kvm/qcow.h index d44c64a..650d3c2 100644 --- a/tools/kvm/include/kvm/qcow.h +++ b/tools/kvm/include/kvm/qcow.h @@ -27,6 +27,7 @@ struct qcow_l2_table { u64 offset; struct rb_node node; struct list_head list; + u8 dirty; u64 table[]; }; -- 1.7.0.4 -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html