@samitouri / QOSamiQemu / commits / d3b790036a

plugins: add userdata for qemu_plugin_{uninstall, reset}

We do both at the same time because they internally use the same implementation. Reviewed-by: Manos Pitsidianakis <manos.pitsidianakis@linaro.org> Link: https://lore.kernel.org/qemu-devel/20260615193526.2883349-3-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 d3b790036a5819f3679953eaedd2a3ca5bf9cdb9
6 files changed +31 -21
contrib/plugins/lockstep.c
+5 -5
@@ -77,7 +77,7 @@ static char *path_to_unlink;
77
78 static bool verbose;
79
80 -static void plugin_cleanup(qemu_plugin_id_t id)
80 +static void plugin_cleanup(qemu_plugin_id_t id, void *userdata)
81 {
82 /* Free our block data */
83 g_slist_free_full(blocks, &g_free);
@@ -98,7 +98,7 @@ static void plugin_exit(qemu_plugin_id_t id, void *p)
98 g_string_append_printf(out, "Executed ~%ld instructions\n", insn_count);
99 qemu_plugin_outs(out->str);
100
101 - plugin_cleanup(id);
101 + plugin_cleanup(id, NULL);
102 }
103
104 /*
@@ -189,7 +189,7 @@ static void report_divergance(ExecState *us, ExecState *them)
189 }
190 qemu_plugin_outs(out->str);
191 qemu_plugin_outs("giving up\n");
192 - qemu_plugin_uninstall(our_id, plugin_cleanup);
192 + qemu_plugin_uninstall(our_id, plugin_cleanup, NULL);
193 }
194 }
195
@@ -212,7 +212,7 @@ static void vcpu_tb_exec(unsigned int cpu_index, void *udata)
212 qemu_plugin_outs(bytes < 0 ?
213 "problem writing to socket" :
214 "wrote less than expected to socket");
215 - qemu_plugin_uninstall(our_id, plugin_cleanup);
215 + qemu_plugin_uninstall(our_id, plugin_cleanup, NULL);
216 return;
217 }
218
@@ -225,7 +225,7 @@ static void vcpu_tb_exec(unsigned int cpu_index, void *udata)
225 qemu_plugin_outs(bytes < 0 ?
226 "problem reading from socket" :
227 "read less than expected");
228 - qemu_plugin_uninstall(our_id, plugin_cleanup);
228 + qemu_plugin_uninstall(our_id, plugin_cleanup, NULL);
229 return;
230 }
231
include/plugins/qemu-plugin.h
+6 -2
@@ -221,6 +221,7 @@ typedef void (*qemu_plugin_vcpu_discon_cb_t)(qemu_plugin_id_t id,
221 * qemu_plugin_uninstall() - Uninstall a plugin
222 * @id: this plugin's opaque ID
223 * @cb: callback to be called once the plugin has been removed
224 + * @userdata: any plugin data to pass to the @cb
225 *
226 * Do NOT assume that the plugin has been uninstalled once this function
227 * returns. Plugins are uninstalled asynchronously, and therefore the given
@@ -229,12 +230,14 @@ typedef void (*qemu_plugin_vcpu_discon_cb_t)(qemu_plugin_id_t id,
230 * Note: Calling this function from qemu_plugin_install() is a bug.
231 */
232 QEMU_PLUGIN_API
232 -void qemu_plugin_uninstall(qemu_plugin_id_t id, qemu_plugin_simple_cb_t cb);
233 +void qemu_plugin_uninstall(qemu_plugin_id_t id, qemu_plugin_udata_cb_t cb,
234 + void *userdata);
235
236 /**
237 * qemu_plugin_reset() - Reset a plugin
238 * @id: this plugin's opaque ID
239 * @cb: callback to be called once the plugin has been reset
240 + * @userdata: any plugin data to pass to the @cb
241 *
242 * Unregisters all callbacks for the plugin given by @id.
243 *
@@ -243,7 +246,8 @@ void qemu_plugin_uninstall(qemu_plugin_id_t id, qemu_plugin_simple_cb_t cb);
246 * callbacks until @cb is called.
247 */
248 QEMU_PLUGIN_API
246 -void qemu_plugin_reset(qemu_plugin_id_t id, qemu_plugin_simple_cb_t cb);
249 +void qemu_plugin_reset(qemu_plugin_id_t id, qemu_plugin_udata_cb_t cb,
250 + void *userdata);
251
252 /**
253 * qemu_plugin_register_vcpu_init_cb() - register a vCPU initialization callback
plugins/api.c
+6 -4
@@ -51,14 +51,16 @@
51
52 /* Uninstall and Reset handlers */
53
54 -void qemu_plugin_uninstall(qemu_plugin_id_t id, qemu_plugin_simple_cb_t cb)
54 +void qemu_plugin_uninstall(qemu_plugin_id_t id, qemu_plugin_udata_cb_t cb,
55 + void *userdata)
56 {
56 - plugin_reset_uninstall(id, cb, false);
57 + plugin_reset_uninstall(id, cb, userdata, false);
58 }
59
59 -void qemu_plugin_reset(qemu_plugin_id_t id, qemu_plugin_simple_cb_t cb)
60 +void qemu_plugin_reset(qemu_plugin_id_t id, qemu_plugin_udata_cb_t cb,
61 + void *userdata)
62 {
61 - plugin_reset_uninstall(id, cb, true);
63 + plugin_reset_uninstall(id, cb, userdata, true);
64 }
65
66 /*
plugins/loader.c
+8 -5
@@ -253,7 +253,7 @@ static int plugin_load(struct qemu_plugin_desc *desc, const qemu_info_t *info, E
253 * call a full uninstall if the plugin did not yet call it.
254 */
255 if (!ctx->uninstalling) {
256 - plugin_reset_uninstall(ctx->id, NULL, false);
256 + plugin_reset_uninstall(ctx->id, NULL, NULL, false);
257 }
258 }
259
@@ -314,7 +314,8 @@ int qemu_plugin_load_list(QemuPluginList *head, Error **errp)
314
315 struct qemu_plugin_reset_data {
316 struct qemu_plugin_ctx *ctx;
317 - qemu_plugin_simple_cb_t cb;
317 + qemu_plugin_udata_cb_t cb;
318 + void *userdata;
319 bool reset;
320 };
321
@@ -338,7 +339,7 @@ static void plugin_reset_destroy__locked(struct qemu_plugin_reset_data *data)
339 if (data->reset) {
340 g_assert(ctx->resetting);
341 if (data->cb) {
341 - data->cb(ctx->id);
342 + data->cb(ctx->id, data->userdata);
343 }
344 ctx->resetting = false;
345 g_free(data);
@@ -357,7 +358,7 @@ static void plugin_reset_destroy__locked(struct qemu_plugin_reset_data *data)
358 g_assert(success);
359 QTAILQ_REMOVE(&plugin.ctxs, ctx, entry);
360 if (data->cb) {
360 - data->cb(ctx->id);
361 + data->cb(ctx->id, data->userdata);
362 }
363 if (!g_module_close(ctx->handle)) {
364 warn_report("%s: %s", __func__, g_module_error());
@@ -383,7 +384,8 @@ static void plugin_flush_destroy(CPUState *cpu, run_on_cpu_data arg)
384 }
385
386 void plugin_reset_uninstall(qemu_plugin_id_t id,
386 - qemu_plugin_simple_cb_t cb,
387 + qemu_plugin_udata_cb_t cb,
388 + void *userdata,
389 bool reset)
390 {
391 struct qemu_plugin_reset_data *data;
@@ -401,6 +403,7 @@ void plugin_reset_uninstall(qemu_plugin_id_t id,
403 data = g_new(struct qemu_plugin_reset_data, 1);
404 data->ctx = ctx;
405 data->cb = cb;
406 + data->userdata = userdata;
407 data->reset = reset;
408 /*
409 * Only flush the code cache if the vCPUs have been created. If so,
plugins/plugin.h
+2 -1
@@ -76,7 +76,8 @@ void plugin_register_inline_op_on_entry(GArray **arr,
76 uint64_t imm);
77
78 void plugin_reset_uninstall(qemu_plugin_id_t id,
79 - qemu_plugin_simple_cb_t cb,
79 + qemu_plugin_udata_cb_t cb,
80 + void *userdata,
81 bool reset);
82
83 void plugin_register_cb(qemu_plugin_id_t id, enum qemu_plugin_event ev,
tests/tcg/plugins/reset.c
+4 -4
@@ -14,7 +14,7 @@ static qemu_plugin_id_t plugin_id;
14 static bool was_reset;
15 static bool was_uninstalled;
16
17 -static void after_uninstall(qemu_plugin_id_t id)
17 +static void after_uninstall(qemu_plugin_id_t id, void *userdata)
18 {
19 g_assert(was_reset && !was_uninstalled);
20 qemu_plugin_outs("uninstall done\n");
@@ -24,7 +24,7 @@ static void after_uninstall(qemu_plugin_id_t id)
24 static void tb_exec_after_reset(unsigned int vcpu_index, void *userdata)
25 {
26 g_assert(was_reset && !was_uninstalled);
27 - qemu_plugin_uninstall(plugin_id, after_uninstall);
27 + qemu_plugin_uninstall(plugin_id, after_uninstall, NULL);
28 }
29
30 static void tb_trans_after_reset(qemu_plugin_id_t id, struct qemu_plugin_tb *tb)
@@ -34,7 +34,7 @@ static void tb_trans_after_reset(qemu_plugin_id_t id, struct qemu_plugin_tb *tb)
34 QEMU_PLUGIN_CB_NO_REGS, NULL);
35 }
36
37 -static void after_reset(qemu_plugin_id_t id)
37 +static void after_reset(qemu_plugin_id_t id, void *userdata)
38 {
39 g_assert(!was_reset && !was_uninstalled);
40 qemu_plugin_outs("reset done\n");
@@ -45,7 +45,7 @@ static void after_reset(qemu_plugin_id_t id)
45 static void tb_exec_before_reset(unsigned int vcpu_index, void *userdata)
46 {
47 g_assert(!was_reset && !was_uninstalled);
48 - qemu_plugin_reset(plugin_id, after_reset);
48 + qemu_plugin_reset(plugin_id, after_reset, NULL);
49 }
50
51 static void tb_trans_before_reset(qemu_plugin_id_t id, struct qemu_plugin_tb *tb)