From: "Alex Bennée" <alex.bennee@linaro.org>
To: Andrew Fasano <fasano@mit.edu>
Cc: qemu-devel@nongnu.org, elysia.witham@ll.mit.edu,
erdnaxe@crans.org, ma.mandourr@gmail.com
Subject: Re: [PATCH 4/8] plugins: add core API functions for QPP callbacks
Date: Thu, 09 Mar 2023 16:09:40 +0000 [thread overview]
Message-ID: <87mt4lnbmv.fsf@linaro.org> (raw)
In-Reply-To: <20221213213757.4123265-5-fasano@mit.edu>
Andrew Fasano <fasano@mit.edu> writes:
> From: Elysia Witham <elysia.witham@ll.mit.edu>
>
> Plugin callbacks and their registered functions are stored in a
> separate struct which is accessible from the plugin's ctx.
> In order for plugins to use another plugin's callbacks, we have
> internal functions that resolve a plugin's name to its ctx and
> find a target plugin.
>
> Signed-off-by: Elysia Witham <elysia.witham@ll.mit.edu>
> Signed-off-by: Andrew Fasano <fasano@mit.edu>
> ---
> include/qemu/qemu-plugin.h | 10 ++++++++++
> plugins/core.c | 23 +++++++++++++++++++++++
> plugins/loader.c | 10 ++++++++++
> plugins/plugin.h | 15 +++++++++++++++
> 4 files changed, 58 insertions(+)
>
> diff --git a/include/qemu/qemu-plugin.h b/include/qemu/qemu-plugin.h
> index 5326f33ce8..3ec82ce97f 100644
> --- a/include/qemu/qemu-plugin.h
> +++ b/include/qemu/qemu-plugin.h
> @@ -14,6 +14,7 @@
> #include <inttypes.h>
> #include <stdbool.h>
> #include <stddef.h>
> +#include <gmodule.h>
>
> /*
> * For best performance, build the plugin with -fvisibility=hidden so that
> @@ -38,6 +39,15 @@
> */
> typedef uint64_t qemu_plugin_id_t;
>
> +/**
> + * typedef cb_func_t - callback function pointer type
> + * @evdata: plugin callback defined event data
> + * @udata: plugin defined user data
> + *
> + * No return value.
> + */
> +typedef void (*cb_func_t) (gpointer evdata, gpointer udata);
> +
> /*
> * Versioning plugins:
> *
> diff --git a/plugins/core.c b/plugins/core.c
> index 6a50b4a6e6..0415a55ec5 100644
> --- a/plugins/core.c
> +++ b/plugins/core.c
> @@ -236,6 +236,17 @@ void qemu_plugin_vcpu_exit_hook(CPUState *cpu)
> qemu_rec_mutex_unlock(&plugin.lock);
> }
>
This looks like another unused function. I was looking to see what
locking was done before calling it as the suffix implies there should be
some.
> +struct qemu_plugin_ctx *plugin_name_to_ctx_locked(const char* name)
> +{
> + struct qemu_plugin_ctx *ctx;
> + QTAILQ_FOREACH(ctx, &plugin.ctxs, entry) {
> + if (strcmp(ctx->name, name) == 0) {
> + return plugin_id_to_ctx_locked(ctx->id);
> + }
> + }
> + return NULL;
> +}
> +
> int name_to_plugin_version(const char *name)
> {
> struct qemu_plugin_ctx *ctx;
> @@ -260,6 +271,18 @@ const char *id_to_plugin_name(qemu_plugin_id_t id)
> }
> }
>
This one too.
> +struct qemu_plugin_qpp_cb *plugin_find_qpp_cb(struct qemu_plugin_ctx *ctx,
> + const char *name)
> +{
> + struct qemu_plugin_qpp_cb *cb;
> + QTAILQ_FOREACH(cb, &ctx->qpp_cbs, entry) {
> + if (strcmp(cb->name, name) == 0) {
> + return cb;
> + }
> + }
> + return NULL;
> +}
> +
> struct plugin_for_each_args {
> struct qemu_plugin_ctx *ctx;
> qemu_plugin_vcpu_simple_cb_t cb;
> diff --git a/plugins/loader.c b/plugins/loader.c
> index 12c0680e03..ab01d0753c 100644
> --- a/plugins/loader.c
> +++ b/plugins/loader.c
> @@ -277,6 +277,7 @@ static int plugin_load(struct qemu_plugin_desc *desc, const qemu_info_t *info, E
> break;
> }
> }
> + QTAILQ_INIT(&ctx->qpp_cbs);
> QTAILQ_INSERT_TAIL(&plugin.ctxs, ctx, entry);
> ctx->installing = true;
> rc = install(ctx->id, info, desc->argc, desc->argv);
> @@ -303,6 +304,15 @@ static int plugin_load(struct qemu_plugin_desc *desc, const qemu_info_t *info, E
> return 1;
> }
>
> +void plugin_add_qpp_cb(struct qemu_plugin_ctx *ctx, const char *name)
> +{
> + struct qemu_plugin_qpp_cb *new_cb;
> + new_cb = qemu_memalign(qemu_dcache_linesize, sizeof(*new_cb));
> + memset(new_cb, 0, sizeof(*new_cb));
Is there a reason to do aligned allocation here. Have you measured a
difference between this and a normal g_new0() in performance?
> + new_cb->name = name;
> + QTAILQ_INSERT_TAIL(&ctx->qpp_cbs, new_cb, entry);
> +}
> +
I think we need some rules for this that can be enforced. Can a plugin
create a cb at any time? Or only during initialisation?
If it's at any time we need some sort of serialisation to prevent races.
> /* call after having removed @desc from the list */
> static void plugin_desc_free(struct qemu_plugin_desc *desc)
> {
> diff --git a/plugins/plugin.h b/plugins/plugin.h
> index 9e710c23a7..fee4741bc6 100644
> --- a/plugins/plugin.h
> +++ b/plugins/plugin.h
> @@ -47,6 +47,14 @@ struct qemu_plugin_state {
> struct qht dyn_cb_arr_ht;
> };
>
> +typedef void (*cb_func_t) (gpointer evdata, gpointer udata);
> +
> +struct qemu_plugin_qpp_cb {
> + const char *name;
> + cb_func_t registered_cb_funcs[QEMU_PLUGIN_EV_MAX];
> + int counter;
> + QTAILQ_ENTRY(qemu_plugin_qpp_cb) entry;
> +};
>
> struct qemu_plugin_ctx {
> GModule *handle;
> @@ -54,6 +62,7 @@ struct qemu_plugin_ctx {
> const char *name;
> int version;
> struct qemu_plugin_cb *callbacks[QEMU_PLUGIN_EV_MAX];
> + QTAILQ_HEAD(, qemu_plugin_qpp_cb) qpp_cbs;
> QTAILQ_ENTRY(qemu_plugin_ctx) entry;
> /*
> * keep a reference to @desc until uninstall, so that plugins do not have
> @@ -106,4 +115,10 @@ int name_to_plugin_version(const char *name);
>
> const char *id_to_plugin_name(qemu_plugin_id_t id);
>
> +struct qemu_plugin_qpp_cb *plugin_find_qpp_cb(struct qemu_plugin_ctx *plugin_ctx,
> + const char *cb_name);
> +
> +/* loader.c */
> +void plugin_add_qpp_cb(struct qemu_plugin_ctx *ctx, const char *name);
> +
> #endif /* PLUGIN_H */
--
Alex Bennée
Virtualisation Tech Lead @ Linaro
next prev parent reply other threads:[~2023-03-09 16:17 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-12-13 21:37 [PATCH 0/8] Inter-plugin interactions with QPP Andrew Fasano
2022-12-13 21:37 ` [PATCH 1/8] docs/devel: describe QPP API Andrew Fasano
2023-03-09 14:15 ` Alex Bennée
2022-12-13 21:37 ` [PATCH 2/8] plugins: version 2, require unique plugin names Andrew Fasano
2023-03-09 14:17 ` Alex Bennée
2022-12-13 21:37 ` [PATCH 3/8] plugins: add id_to_plugin_name Andrew Fasano
2023-03-09 14:45 ` Alex Bennée
2022-12-13 21:37 ` [PATCH 4/8] plugins: add core API functions for QPP callbacks Andrew Fasano
2023-03-09 16:09 ` Alex Bennée [this message]
2022-12-13 21:37 ` [PATCH 5/8] plugins: implement " Andrew Fasano
2023-03-09 16:17 ` Alex Bennée
2022-12-13 21:37 ` [PATCH 6/8] plugins: implement QPP import function Andrew Fasano
2023-03-09 16:26 ` Alex Bennée
2022-12-13 21:37 ` [PATCH 7/8] include/qemu: added macro for " Andrew Fasano
2022-12-13 21:37 ` [PATCH 8/8] tests: build and run QPP tests Andrew Fasano
2023-03-09 16:37 ` Alex Bennée
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87mt4lnbmv.fsf@linaro.org \
--to=alex.bennee@linaro.org \
--cc=elysia.witham@ll.mit.edu \
--cc=erdnaxe@crans.org \
--cc=fasano@mit.edu \
--cc=ma.mandourr@gmail.com \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).