--- block/qcow2-dedup.c | 11 +++++++++++ block/qcow2.h | 18 ++++++++++++++++++ 2 files changed, 29 insertions(+)
diff --git a/block/qcow2-dedup.c b/block/qcow2-dedup.c index 308b4f6..72ce1d7 100644 --- a/block/qcow2-dedup.c +++ b/block/qcow2-dedup.c @@ -1311,3 +1311,14 @@ void qcow2_dedup_close(BlockDriverState *bs) { qcow2_dedup_free(bs); } + +void qcow2_dedup_update_metrics(BlockDriverState *bs) +{ + BDRVQcowState *s = bs->opaque; + + uint64_t nb_hashs = s->dedup_metrics.ram_hash_creations - + s->dedup_metrics.ram_hash_deletions; + + s->dedup_metrics.ram_usage = nb_hashs * sizeof(GTreeNode_Copy) * 2; + s->dedup_metrics.ram_usage += nb_hashs * sizeof(QCowHashNode); +} diff --git a/block/qcow2.h b/block/qcow2.h index fc393d5..191b272 100644 --- a/block/qcow2.h +++ b/block/qcow2.h @@ -76,6 +76,23 @@ #define QCOW_STRATEGY_DISK (1 << 1) #define QCOW_STRATEGY_RUNNING (1 << 2) +/* This is an internal structure of glib gtree.c + * copy it here so we can compute it's size + * from glib/gtree.c in glib sources + */ +typedef struct _GTreeNode_Copy GTreeNode_Copy; + +struct _GTreeNode_Copy +{ + gpointer key; /* key for this node */ + gpointer value; /* value stored at this node */ + GTreeNode_Copy *left; /* left subtree */ + GTreeNode_Copy *right; /* right subtree */ + gint8 balance; /* height (right) - height (left) */ + guint8 left_child; + guint8 right_child; +}; + typedef enum { QCOW_HASH_SHA256 = 0, QCOW_HASH_SHA3 = 1, @@ -507,5 +524,6 @@ void qcow2_dedup_refcount_half_max_reached(BlockDriverState *bs, bool qcow2_dedup_is_running(BlockDriverState *bs); int qcow2_dedup_init(BlockDriverState *bs); void qcow2_dedup_close(BlockDriverState *bs); +void qcow2_dedup_update_metrics(BlockDriverState *bs); #endif -- 1.7.10.4