All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 00/25] plugins: refactor API to maintain state through callbacks chain
@ 2026-06-03 20:51 Pierrick Bouvier
  2026-06-03 20:51 ` [PATCH 01/25] plugins: bump version Pierrick Bouvier
                   ` (24 more replies)
  0 siblings, 25 replies; 54+ messages in thread
From: Pierrick Bouvier @ 2026-06-03 20:51 UTC (permalink / raw)
  To: qemu-devel
  Cc: Chao Liu, Richard Henderson, Brian Cain,
	Philippe Mathieu-Daudé, Alex Bennée, Pierrick Bouvier,
	Alexandre Iooss

A coworker recently wrote a C++ plugin, and noticed interesting limitations of
current API. Basically, the biggest issue is that the only way to maintain state
in a plugin is by using global variables. The root cause is that some
callback types can't transfer user data.

Also, he asked why some callbacks have a qemu_plugin_id_t, and some other don't.
This excellent question exposed that we don't need this most of the time. And if
needed, we can rely on user data instead.

For functional programmers here, it allows to have something similar to
continuation-passing style, with all callbacks carrying data to next one.

This series modifies our callback types to make sure they all have a userdata,
and none have a qemu_plugin_id. Existing C plugins don't need to change, and
global variables can still exist.

After all those changes, we can finally implement a C++ plugin without any
static variable (well, out of qemu_plugin_version), using an object and
lambdas. This act as a demonstration of how we could write future plugins, and
also, how we are finally on the edge to offer a proper native interface
in Rust using closures.

Pierrick Bouvier (25):
  plugins: bump version
  plugins: add userdata for qemu_plugin_{uninstall, reset}
  plugins: add userdata to qemu_plugin_register_flush_cb
  plugins: remove type qemu_plugin_simple_cb_t
  plugins: remove qemu_plugin_id_t from qemu_plugin_udata_cb_t
  plugins: remove qemu_plugin_id_t from qemu_plugin_vcpu_simple_cb_t
  plugins: add userdata to qemu_plugin_register_vcpu_init_cb
  plugins: add userdata to qemu_plugin_register_vcpu_exit_cb
  plugins: add userdata to qemu_plugin_register_vcpu_idle_cb
  plugins: add userdata to qemu_plugin_register_vcpu_resume_cb
  plugins: add userdata to qemu_plugin_vcpu_for_each
  plugins: remove type qemu_plugin_vcpu_simple_cb_t
  plugins: add userdata to qemu_plugin_register_vcpu_discon_cb
  plugins: remove qemu_plugin_id from qemu_plugin_vcpu_discon_cb_t
  plugins: remove qemu_plugin_id from qemu_plugin_vcpu_tb_trans_cb_t
  plugins: add userdata to qemu_plugin_vcpu_tb_trans_cb_t
  plugins: remove qemu_plugin_id from qemu_plugin_vcpu_syscall_cb_t
  plugins: add userdata to qemu_plugin_register_vcpu_syscall_cb
  plugins: remove qemu_plugin_id from
    qemu_plugin_vcpu_syscall_filter_cb_t
  plugins: add userdata to qemu_plugin_register_vcpu_syscall_filter_cb
  plugins: remove qemu_plugin_id from qemu_plugin_vcpu_syscall_ret_cb_t
  plugins: add userdata to qemu_plugin_register_vcpu_syscall_ret_cb
  scripts/checkpatch: ignore spaces required around some operators in
    C++
  scripts/checkpatch: remove check on forbidden space before '[' in C++
  plugins/cpp: register callbacks using captureless lambda

 contrib/plugins/bbv.c         |  10 +--
 contrib/plugins/cache.c       |   6 +-
 contrib/plugins/cflow.c       |   6 +-
 contrib/plugins/cpp.cpp       |  89 +++++++++++++++++++++++++-
 contrib/plugins/drcov.c       |   6 +-
 contrib/plugins/execlog.c     |  10 +--
 contrib/plugins/hotblocks.c   |   6 +-
 contrib/plugins/hotpages.c    |   6 +-
 contrib/plugins/howvec.c      |   6 +-
 contrib/plugins/hwprofile.c   |   6 +-
 contrib/plugins/ips.c         |  14 ++---
 contrib/plugins/lockstep.c    |  18 +++---
 contrib/plugins/stoptrigger.c |   6 +-
 contrib/plugins/traps.c       |   9 +--
 contrib/plugins/uftrace.c     |  10 +--
 include/plugins/qemu-plugin.h | 114 +++++++++++++++++++---------------
 include/qemu/plugin.h         |   2 -
 plugins/api.c                 |  40 +++++++-----
 plugins/core.c                |  94 +++++++++++-----------------
 plugins/loader.c              |  13 ++--
 plugins/plugin.h              |   5 +-
 scripts/checkpatch.pl         |  20 +++++-
 tests/tcg/plugins/bb.c        |  10 +--
 tests/tcg/plugins/discons.c   |  10 +--
 tests/tcg/plugins/empty.c     |   4 +-
 tests/tcg/plugins/inline.c    |   6 +-
 tests/tcg/plugins/insn.c      |  10 +--
 tests/tcg/plugins/mem.c       |   6 +-
 tests/tcg/plugins/patch.c     |   4 +-
 tests/tcg/plugins/registers.c |   4 +-
 tests/tcg/plugins/reset.c     |  17 ++---
 tests/tcg/plugins/setpc.c     |  10 +--
 tests/tcg/plugins/syscall.c   |  22 ++++---
 33 files changed, 354 insertions(+), 245 deletions(-)

-- 
2.43.0



^ permalink raw reply	[flat|nested] 54+ messages in thread

end of thread, other threads:[~2026-06-11  6:29 UTC | newest]

Thread overview: 54+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-06-03 20:51 [PATCH 00/25] plugins: refactor API to maintain state through callbacks chain Pierrick Bouvier
2026-06-03 20:51 ` [PATCH 01/25] plugins: bump version Pierrick Bouvier
2026-06-08  5:58   ` Manos Pitsidianakis
2026-06-08 16:53     ` Pierrick Bouvier
2026-06-03 20:51 ` [PATCH 02/25] plugins: add userdata for qemu_plugin_{uninstall, reset} Pierrick Bouvier
2026-06-08  6:01   ` Manos Pitsidianakis
2026-06-03 20:51 ` [PATCH 03/25] plugins: add userdata to qemu_plugin_register_flush_cb Pierrick Bouvier
2026-06-08  6:05   ` Manos Pitsidianakis
2026-06-03 20:51 ` [PATCH 04/25] plugins: remove type qemu_plugin_simple_cb_t Pierrick Bouvier
2026-06-08  6:10   ` Manos Pitsidianakis
2026-06-03 20:51 ` [PATCH 05/25] plugins: remove qemu_plugin_id_t from qemu_plugin_udata_cb_t Pierrick Bouvier
2026-06-11  5:13   ` Manos Pitsidianakis
2026-06-03 20:51 ` [PATCH 06/25] plugins: remove qemu_plugin_id_t from qemu_plugin_vcpu_simple_cb_t Pierrick Bouvier
2026-06-11  5:17   ` Manos Pitsidianakis
2026-06-03 20:51 ` [PATCH 07/25] plugins: add userdata to qemu_plugin_register_vcpu_init_cb Pierrick Bouvier
2026-06-11  5:19   ` Manos Pitsidianakis
2026-06-03 20:51 ` [PATCH 08/25] plugins: add userdata to qemu_plugin_register_vcpu_exit_cb Pierrick Bouvier
2026-06-11  5:31   ` Manos Pitsidianakis
2026-06-03 20:51 ` [PATCH 09/25] plugins: add userdata to qemu_plugin_register_vcpu_idle_cb Pierrick Bouvier
2026-06-11  5:32   ` Manos Pitsidianakis
2026-06-03 20:51 ` [PATCH 10/25] plugins: add userdata to qemu_plugin_register_vcpu_resume_cb Pierrick Bouvier
2026-06-11  5:33   ` Manos Pitsidianakis
2026-06-03 20:51 ` [PATCH 11/25] plugins: add userdata to qemu_plugin_vcpu_for_each Pierrick Bouvier
2026-06-11  5:34   ` Manos Pitsidianakis
2026-06-03 20:51 ` [PATCH 12/25] plugins: remove type qemu_plugin_vcpu_simple_cb_t Pierrick Bouvier
2026-06-11  5:35   ` Manos Pitsidianakis
2026-06-03 20:51 ` [PATCH 13/25] plugins: add userdata to qemu_plugin_register_vcpu_discon_cb Pierrick Bouvier
2026-06-11  5:35   ` Manos Pitsidianakis
2026-06-03 20:51 ` [PATCH 14/25] plugins: remove qemu_plugin_id from qemu_plugin_vcpu_discon_cb_t Pierrick Bouvier
2026-06-11  5:36   ` Manos Pitsidianakis
2026-06-03 20:51 ` [PATCH 15/25] plugins: remove qemu_plugin_id from qemu_plugin_vcpu_tb_trans_cb_t Pierrick Bouvier
2026-06-11  5:55   ` Manos Pitsidianakis
2026-06-03 20:51 ` [PATCH 16/25] plugins: add userdata to qemu_plugin_vcpu_tb_trans_cb_t Pierrick Bouvier
2026-06-11  5:57   ` Manos Pitsidianakis
2026-06-03 20:51 ` [PATCH 17/25] plugins: remove qemu_plugin_id from qemu_plugin_vcpu_syscall_cb_t Pierrick Bouvier
2026-06-11  5:58   ` Manos Pitsidianakis
2026-06-03 20:51 ` [PATCH 18/25] plugins: add userdata to qemu_plugin_register_vcpu_syscall_cb Pierrick Bouvier
2026-06-11  6:00   ` Manos Pitsidianakis
2026-06-03 20:51 ` [PATCH 19/25] plugins: remove qemu_plugin_id from qemu_plugin_vcpu_syscall_filter_cb_t Pierrick Bouvier
2026-06-11  6:02   ` Manos Pitsidianakis
2026-06-03 20:51 ` [PATCH 20/25] plugins: add userdata to qemu_plugin_register_vcpu_syscall_filter_cb Pierrick Bouvier
2026-06-11  6:03   ` Manos Pitsidianakis
2026-06-03 20:51 ` [PATCH 21/25] plugins: remove qemu_plugin_id from qemu_plugin_vcpu_syscall_ret_cb_t Pierrick Bouvier
2026-06-11  6:10   ` Manos Pitsidianakis
2026-06-03 20:51 ` [PATCH 22/25] plugins: add userdata to qemu_plugin_register_vcpu_syscall_ret_cb Pierrick Bouvier
2026-06-11  6:08   ` Manos Pitsidianakis
2026-06-03 20:51 ` [PATCH 23/25] scripts/checkpatch: ignore spaces required around some operators in C++ Pierrick Bouvier
2026-06-08  9:21   ` Peter Maydell
2026-06-08 16:56     ` Pierrick Bouvier
2026-06-03 20:51 ` [PATCH 24/25] scripts/checkpatch: remove check on forbidden space before '[' " Pierrick Bouvier
2026-06-04  6:22   ` Philippe Mathieu-Daudé
2026-06-11  6:07   ` Manos Pitsidianakis
2026-06-11  6:28   ` Chao Liu
2026-06-03 20:51 ` [PATCH 25/25] plugins/cpp: register callbacks using captureless lambda Pierrick Bouvier

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.