plugins: add userdata to qemu_plugin_register_vcpu_idle_cb
Reviewed-by: Manos Pitsidianakis <manos.pitsidianakis@linaro.org> Link: https://lore.kernel.org/qemu-devel/20260615193526.2883349-10-pierrick.bouvier@oss.qualcomm.com Signed-off-by: Pierrick Bouvier <pierrick.bouvier@oss.qualcomm.com>
Pierrick Bouvier committed
Jun 15, 2026 at 12:35 UTC
89662f8903b4309623473e3b444195683c4eba44
3 files changed
+10
-7
include/plugins/qemu-plugin.h
+3
-1
@@ -272,12 +272,14 @@ void qemu_plugin_register_vcpu_exit_cb(qemu_plugin_id_t id,
272
* qemu_plugin_register_vcpu_idle_cb() - register a vCPU idle callback
273
* @id: plugin ID
274
* @cb: callback function
275
+ * @userdata: any plugin data to pass to the @cb
276
*
277
* The @cb function is called every time a vCPU idles.
278
*/
279
QEMU_PLUGIN_API
280
void qemu_plugin_register_vcpu_idle_cb(qemu_plugin_id_t id,
280
- qemu_plugin_vcpu_simple_cb_t cb);
281
+ qemu_plugin_vcpu_udata_cb_t cb,
282
+ void *userdata);
283
284
/**
285
* qemu_plugin_register_vcpu_resume_cb() - register a vCPU resume callback
plugins/core.c
+5
-4
@@ -89,7 +89,6 @@ static void plugin_vcpu_cb__simple(CPUState *cpu, enum qemu_plugin_event ev)
89
struct qemu_plugin_cb *cb, *next;
90
91
switch (ev) {
92
- case QEMU_PLUGIN_EV_VCPU_IDLE:
92
case QEMU_PLUGIN_EV_VCPU_RESUME:
93
/* iterate safely; plugins might uninstall themselves at any time */
94
QLIST_FOREACH_SAFE_RCU(cb, &plugin.cb_lists[ev], entry, next) {
@@ -114,6 +113,7 @@ static void plugin_vcpu_cb__udata(CPUState *cpu, enum qemu_plugin_event ev)
113
114
switch (ev) {
115
case QEMU_PLUGIN_EV_VCPU_INIT:
116
+ case QEMU_PLUGIN_EV_VCPU_IDLE:
117
case QEMU_PLUGIN_EV_VCPU_EXIT:
118
QLIST_FOREACH_SAFE_RCU(cb, &plugin.cb_lists[ev], entry, next) {
119
qemu_plugin_vcpu_udata_cb_t func = cb->f.vcpu_udata;
@@ -627,7 +627,7 @@ void qemu_plugin_vcpu_idle_cb(CPUState *cpu)
627
/* idle and resume cb may be called before init, ignore in this case */
628
if (cpu->cpu_index < plugin.num_vcpus) {
629
qemu_plugin_set_cb_flags(cpu, QEMU_PLUGIN_CB_RW_REGS_PC);
630
- plugin_vcpu_cb__simple(cpu, QEMU_PLUGIN_EV_VCPU_IDLE);
630
+ plugin_vcpu_cb__udata(cpu, QEMU_PLUGIN_EV_VCPU_IDLE);
631
qemu_plugin_set_cb_flags(cpu, QEMU_PLUGIN_CB_NO_REGS);
632
}
633
}
@@ -660,9 +660,10 @@ void qemu_plugin_vcpu_hostcall_cb(CPUState *cpu, uint64_t from)
660
}
661
662
void qemu_plugin_register_vcpu_idle_cb(qemu_plugin_id_t id,
663
- qemu_plugin_vcpu_simple_cb_t cb)
663
+ qemu_plugin_vcpu_udata_cb_t cb,
664
+ void *userdata)
665
{
665
- plugin_register_cb(id, QEMU_PLUGIN_EV_VCPU_IDLE, cb);
666
+ plugin_register_cb_udata(id, QEMU_PLUGIN_EV_VCPU_IDLE, cb, userdata);
667
}
668
669
void qemu_plugin_register_vcpu_resume_cb(qemu_plugin_id_t id,
tests/tcg/plugins/bb.c
+2
-2
@@ -56,7 +56,7 @@ static void plugin_exit(void *p)
56
qemu_plugin_scoreboard_free(counts);
57
}
58
59
-static void vcpu_idle(unsigned int cpu_index)
59
+static void vcpu_idle(unsigned int cpu_index, void *userdata)
60
{
61
CPUCount *count = qemu_plugin_scoreboard_find(counts, cpu_index);
62
g_autoptr(GString) report = g_string_new("");
@@ -124,7 +124,7 @@ QEMU_PLUGIN_EXPORT int qemu_plugin_install(qemu_plugin_id_t id,
124
counts, CPUCount, insn_count);
125
126
if (idle_report) {
127
- qemu_plugin_register_vcpu_idle_cb(id, vcpu_idle);
127
+ qemu_plugin_register_vcpu_idle_cb(id, vcpu_idle, NULL);
128
}
129
130
qemu_plugin_register_vcpu_tb_trans_cb(id, vcpu_tb_trans);