On 12/17/24 16:43, Pierrick Bouvier wrote:
> Signed-off-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
> ---
> contrib/plugins/hotblocks.c | 29 ++++++++++++++++++++++++-----
> 1 file changed, 24 insertions(+), 5 deletions(-)
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
r~
>
> diff --git a/contrib/plugins/hotblocks.c b/contrib/plugins/hotblocks.c
> index 02bc5078bdd..f12bfb7a267 100644
> --- a/contrib/plugins/hotblocks.c
> +++ b/contrib/plugins/hotblocks.c
> @@ -29,7 +29,7 @@ static guint64 limit = 20;
> *
> * The internals of the TCG are not exposed to plugins so we can only
> * get the starting PC for each block. We cheat this slightly by
> - * xor'ing the number of instructions to the hash to help
> + * checking the number of instructions as well to help
> * differentiate.
> */
> typedef struct {
> @@ -50,6 +50,20 @@ static gint cmp_exec_count(gconstpointer a, gconstpointer b)
> return count_a > count_b ? -1 : 1;
> }
>
> +static guint exec_count_hash(gconstpointer v)
> +{
> + const ExecCount *e = v;
> + return e->start_addr ^ e->insns;
> +}
> +
> +static gboolean exec_count_equal(gconstpointer v1, gconstpointer v2)
> +{
> + const ExecCount *ea = v1;
> + const ExecCount *eb = v2;
> + return (ea->start_addr == eb->start_addr) &&
> + (ea->insns == eb->insns);
> +}
> +
> static void exec_count_free(gpointer key, gpointer value, gpointer user_data)
> {
> ExecCount *cnt = value;
> @@ -91,7 +105,7 @@ static void plugin_exit(qemu_plugin_id_t id, void *p)
>
> static void plugin_init(void)
> {
> - hotblocks = g_hash_table_new(NULL, g_direct_equal);
> + hotblocks = g_hash_table_new(exec_count_hash, exec_count_equal);
> }
>
> static void vcpu_tb_exec(unsigned int cpu_index, void *udata)
> @@ -111,10 +125,15 @@ static void vcpu_tb_trans(qemu_plugin_id_t id, struct qemu_plugin_tb *tb)
> ExecCount *cnt;
> uint64_t pc = qemu_plugin_tb_vaddr(tb);
> size_t insns = qemu_plugin_tb_n_insns(tb);
> - uint64_t hash = pc ^ insns;
>
> g_mutex_lock(&lock);
> - cnt = (ExecCount *) g_hash_table_lookup(hotblocks, (gconstpointer) hash);
> + {
> + ExecCount e;
> + e.start_addr = pc;
> + e.insns = insns;
> + cnt = (ExecCount *) g_hash_table_lookup(hotblocks, &e);
> + }
> +
> if (cnt) {
> cnt->trans_count++;
> } else {
> @@ -123,7 +142,7 @@ static void vcpu_tb_trans(qemu_plugin_id_t id, struct qemu_plugin_tb *tb)
> cnt->trans_count = 1;
> cnt->insns = insns;
> cnt->exec_count = qemu_plugin_scoreboard_new(sizeof(uint64_t));
> - g_hash_table_insert(hotblocks, (gpointer) hash, (gpointer) cnt);
> + g_hash_table_insert(hotblocks, cnt, cnt);
> }
>
> g_mutex_unlock(&lock);