[PATCH 00/25] plugins: refactor API to maintain state through callbacks chain

Pierrick Bouvier posted 25 patches 4 days, 11 hours ago
Patches applied successfully (tree, apply log)
git fetch https://github.com/patchew-project/qemu tags/patchew/20260603205152.1440291-1-pierrick.bouvier@oss.qualcomm.com
Maintainers: "Alex Bennée" <alex.bennee@linaro.org>, Pierrick Bouvier <pierrick.bouvier@oss.qualcomm.com>, Alexandre Iooss <erdnaxe@crans.org>, Chao Liu <chao.liu.zevorn@gmail.com>
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(-)
[PATCH 00/25] plugins: refactor API to maintain state through callbacks chain
Posted by Pierrick Bouvier 4 days, 11 hours ago
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