[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH v4 08/20] instrument: [hmp] Add library loader
From: |
Markus Armbruster |
Subject: |
Re: [Qemu-devel] [PATCH v4 08/20] instrument: [hmp] Add library loader |
Date: |
Thu, 07 Sep 2017 10:51:54 +0200 |
User-agent: |
Gnus/5.13 (Gnus v5.13) Emacs/25.2 (gnu/linux) |
Lluís Vilanova <address@hidden> writes:
> Signed-off-by: Lluís Vilanova <address@hidden>
> ---
> hmp-commands.hx | 28 ++++++++++++++++++++++++++
> monitor.c | 60
> +++++++++++++++++++++++++++++++++++++++++++++++++++++++
> 2 files changed, 88 insertions(+)
>
> diff --git a/hmp-commands.hx b/hmp-commands.hx
> index 1941e19932..703d7262f5 100644
> --- a/hmp-commands.hx
> +++ b/hmp-commands.hx
> @@ -1858,6 +1858,34 @@ ETEXI
> .sub_table = info_cmds,
> },
>
> + {
> + .name = "instr-load",
> + .args_type = "path:F,args:s?",
> + .params = "path [arg]",
> + .help = "load an instrumentation library",
> + .cmd = hmp_instr_load,
> + },
> +
> +STEXI
> address@hidden instr-load @var{path} [args=value[,...]]
> address@hidden instr-load
> +Load an instrumentation library.
> +ETEXI
> +
> + {
> + .name = "instr-unload",
> + .args_type = "handle:i",
> + .params = "handle",
> + .help = "unload an instrumentation library",
> + .cmd = hmp_instr_unload,
> + },
> +
> +STEXI
> address@hidden instr-unload
> address@hidden instr-unload
> +Unload an instrumentation library.
> +ETEXI
> +
> STEXI
> @end table
> ETEXI
Want #ifdef CONFIG_INSTRUMENT, see my review of the previous patch.
See also my remark there on returning handles vs. passing in IDs.
> diff --git a/monitor.c b/monitor.c
> index e0f880107f..8a7684f860 100644
> --- a/monitor.c
> +++ b/monitor.c
> @@ -2319,6 +2319,66 @@ int monitor_fd_param(Monitor *mon, const char *fdname,
> Error **errp)
> return fd;
> }
>
> +static void hmp_instr_load(Monitor *mon, const QDict *qdict)
> +{
> + const char *path = qdict_get_str(qdict, "path");
> + const char *str = qdict_get_try_str(qdict, "args");
> + strList args;
Blank line between last declaration and first statement, please.
> + args.value = (str == NULL) ? NULL : (char *)str;
What's wrong with
args.value = (char *)str;
?
> + args.next = NULL;
> + InstrLoadResult *res = qmp_instr_load(path, args.value != NULL,
> + args.value != NULL ? &args : NULL,
> + NULL);
> + switch (res->code) {
> + case INSTR_LOAD_CODE_OK:
> + monitor_printf(mon, "Handle: %"PRId64"\n", res->handle);
> + monitor_printf(mon, "OK\n");
> + break;
> + case INSTR_LOAD_CODE_TOO_MANY:
> + monitor_printf(mon, "Too many instrumentation libraries already
> loaded\n");
> + break;
> + case INSTR_LOAD_CODE_ERROR:
> + monitor_printf(mon, "Instrumentation library returned a non-zero
> value during initialization");
> + break;
> + case INSTR_LOAD_CODE_DLERROR:
> + monitor_printf(mon, "Error loading library: %s\n", res->msg);
> + break;
> + case INSTR_LOAD_CODE_UNAVAILABLE:
> + monitor_printf(mon, "Service not available\n");
> + break;
> + default:
> + fprintf(stderr, "Unknown instrumentation load code: %d", res->code);
> + exit(1);
Impossible conditions should be assertion failures, but it's a moot point
because...
> + break;
> + }
> + qapi_free_InstrLoadResult(res);
> +}
With qmp_instr_load() fixed to set an error on failure, this becomes
something like
InstrLoadResult *res = qmp_instr_load(path, args.value != NULL,
args.value != NULL ? &args : NULL,
&err);
if (err) {
error_report_err(err);
} else {
monitor_printf(mon, "Handle: %"PRId64"\n", res->handle);
monitor_printf(mon, "OK\n");
}
qapi_free_InstrLoadResult(res);
> +
> +static void hmp_instr_unload(Monitor *mon, const QDict *qdict)
> +{
> + int64_t handle = qdict_get_int(qdict, "handle");
> + InstrUnloadResult *res = qmp_instr_unload(handle, NULL);
> + switch (res->code) {
> + case INSTR_UNLOAD_CODE_OK:
> + monitor_printf(mon, "OK\n");
> + break;
> + case INSTR_UNLOAD_CODE_INVALID:
> + monitor_printf(mon, "Invalid handle\n");
> + break;
> + case INSTR_UNLOAD_CODE_DLERROR:
> + monitor_printf(mon, "Error unloading library: %s\n", res->msg);
> + break;
> + case INSTR_UNLOAD_CODE_UNAVAILABLE:
> + monitor_printf(mon, "Service not available\n");
> + break;
> + default:
> + fprintf(stderr, "Unknown instrumentation unload code: %d",
> res->code);
> + exit(1);
> + break;
> + }
> + qapi_free_InstrUnloadResult(res);
> +}
> +
> /* Please update hmp-commands.hx when adding or changing commands */
> static mon_cmd_t info_cmds[] = {
> #include "hmp-commands-info.h"
Likewise.
- [Qemu-devel] [PATCH v4 03/20] instrument: Add generic library loader, (continued)
- [Qemu-devel] [PATCH v4 03/20] instrument: Add generic library loader, Lluís Vilanova, 2017/09/06
- [Qemu-devel] [PATCH v4 04/20] instrument: [linux-user] Add command line library loader, Lluís Vilanova, 2017/09/06
- [Qemu-devel] [PATCH v4 05/20] instrument: [bsd-user] Add command line library loader, Lluís Vilanova, 2017/09/06
- [Qemu-devel] [PATCH v4 06/20] instrument: [softmmu] Add command line library loader, Lluís Vilanova, 2017/09/06
- [Qemu-devel] [PATCH v4 07/20] instrument: [qapi] Add library loader, Lluís Vilanova, 2017/09/06
- [Qemu-devel] [PATCH v4 08/20] instrument: [hmp] Add library loader, Lluís Vilanova, 2017/09/06
- Re: [Qemu-devel] [PATCH v4 08/20] instrument: [hmp] Add library loader,
Markus Armbruster <=
- [Qemu-devel] [PATCH v4 09/20] instrument: Add basic control interface, Lluís Vilanova, 2017/09/06
- [Qemu-devel] [PATCH v4 10/20] instrument: Add support for tracing events, Lluís Vilanova, 2017/09/06
- [Qemu-devel] [PATCH v4 11/20] instrument: Track vCPUs, Lluís Vilanova, 2017/09/06
- [Qemu-devel] [PATCH v4 12/20] instrument: Add event 'guest_cpu_enter', Lluís Vilanova, 2017/09/06