From patchwork Mon Jul 24 17:46:50 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Llu=C3=ADs_Vilanova?= X-Patchwork-Id: 9859967 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 9B21660349 for ; Mon, 24 Jul 2017 17:47:44 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 87A8628111 for ; Mon, 24 Jul 2017 17:47:44 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 7C2D82859A; Mon, 24 Jul 2017 17:47:44 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.9 required=2.0 tests=BAYES_00,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id D6F9728111 for ; Mon, 24 Jul 2017 17:47:43 +0000 (UTC) Received: from localhost ([::1]:56153 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dZhSI-0003hX-Ef for patchwork-qemu-devel@patchwork.kernel.org; Mon, 24 Jul 2017 13:47:42 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:40801) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dZhRf-0003hH-H3 for qemu-devel@nongnu.org; Mon, 24 Jul 2017 13:47:04 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dZhRc-0004Ay-DS for qemu-devel@nongnu.org; Mon, 24 Jul 2017 13:47:03 -0400 Received: from roura.ac.upc.es ([147.83.33.10]:35543) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dZhRc-0004Al-11 for qemu-devel@nongnu.org; Mon, 24 Jul 2017 13:47:00 -0400 Received: from correu-1.ac.upc.es (correu-1.ac.upc.es [147.83.30.91]) by roura.ac.upc.es (8.13.8/8.13.8) with ESMTP id v6OHkvA6000622; Mon, 24 Jul 2017 19:46:57 +0200 Received: from localhost (unknown [31.210.188.120]) by correu-1.ac.upc.es (Postfix) with ESMTPSA id 849DC1759; Mon, 24 Jul 2017 19:46:51 +0200 (CEST) From: =?utf-8?b?TGx1w61z?= Vilanova To: qemu-devel@nongnu.org Date: Mon, 24 Jul 2017 20:46:50 +0300 Message-Id: <150091841019.30739.3661641061220051037.stgit@frigg.lan> X-Mailer: git-send-email 2.13.2 In-Reply-To: <150091574424.30739.4131793221953168474.stgit@frigg.lan> References: <150091574424.30739.4131793221953168474.stgit@frigg.lan> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 X-MIME-Autoconverted: from 8bit to quoted-printable by roura.ac.upc.es id v6OHkvA6000622 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6.x [fuzzy] X-Received-From: 147.83.33.10 Subject: [Qemu-devel] [PATCH 11/13] instrument: [qapi] Add library loader X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: "Emilio G. Cota" , Markus Armbruster , Stefan Hajnoczi Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" X-Virus-Scanned: ClamAV using ClamSMTP Signed-off-by: Lluís Vilanova --- instrument/Makefile.objs | 1 + instrument/qmp.c | 71 ++++++++++++++++++++++++++++++++++++ qapi-schema.json | 3 ++ qapi/instrument.json | 92 ++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 167 insertions(+) create mode 100644 instrument/qmp.c create mode 100644 qapi/instrument.json diff --git a/instrument/Makefile.objs b/instrument/Makefile.objs index aa6db29ff4..757a247321 100644 --- a/instrument/Makefile.objs +++ b/instrument/Makefile.objs @@ -44,3 +44,4 @@ $(obj)/qemu-instr/events.h-timestamp: $(BUILD_DIR)/trace-events-all $(BUILD_DIR) target-obj-y += control.o target-obj-y += cmdline.o +target-obj-y += qmp.o diff --git a/instrument/qmp.c b/instrument/qmp.c new file mode 100644 index 0000000000..3f577e0c78 --- /dev/null +++ b/instrument/qmp.c @@ -0,0 +1,71 @@ +/* + * QMP interface for dynamic trace instrumentation control commands. + * + * Copyright (C) 2012-2017 Lluís Vilanova + * + * This work is licensed under the terms of the GNU GPL, version 2 or later. + * See the COPYING file in the top-level directory. + */ + +#include "qemu/osdep.h" +#include "qemu-common.h" +#include "qapi/qmp/qerror.h" +#include "qmp-commands.h" + +#include + +#include "instrument/control.h" + + + +InstrLoadResult *qmp_instr_load(const char * path, + bool have_args, StringList * args, + Error **errp) +{ + int argc = 0; + const char **argv = NULL; + + StringList *entry = have_args ? args : NULL; + while (entry != NULL) { + argv = realloc(argv, sizeof(*argv) * (argc + 1)); + argv[argc] = entry->value->str; + argc++; + entry = entry->next; + } + + InstrLoadResult *res = g_malloc0(sizeof(*res)); + res->code = instr_load(path, argc, argv, &res->handle); + switch (res->code) { + case INSTR_LOAD_CODE_OK: + case INSTR_LOAD_CODE_UNAVAILABLE: + break; + case INSTR_LOAD_CODE_ERROR: + res->msg = dlerror(); + break; + default: + fprintf(stderr, "Unknown instrumentation load code: %d", res->code); + exit(1); + break; + } + return res; +} + +InstrUnloadResult *qmp_instr_unload(int64_t handle, Error **errp) +{ + InstrUnloadResult *res = g_malloc0(sizeof(*res)); + res->code = instr_unload(handle); + switch (res->code) { + case INSTR_UNLOAD_OK: + case INSTR_UNLOAD_UNAVAILABLE: + case INSTR_UNLOAD_INVALID: + break; + case INSTR_UNLOAD_CODE_ERROR: + res->msg = dlerror(); + break; + default: + fprintf(stderr, "Unknown instrumentation unload code: %d", res->code); + exit(1); + break; + } + return res; +} diff --git a/qapi-schema.json b/qapi-schema.json index ab438ead70..6c4f237af8 100644 --- a/qapi-schema.json +++ b/qapi-schema.json @@ -90,6 +90,9 @@ # QAPI introspection { 'include': 'qapi/introspect.json' } +# Instrumentation commands +{ 'include': 'qapi/instrument.json' } + ## # = QMP commands ## diff --git a/qapi/instrument.json b/qapi/instrument.json new file mode 100644 index 0000000000..f0d725e9a9 --- /dev/null +++ b/qapi/instrument.json @@ -0,0 +1,92 @@ +# *-*- Mode: Python -*-* +# +# QAPI trace instrumentation control commands. +# +# Copyright (C) 2012-2017 Lluís Vilanova +# +# This work is licensed under the terms of the GNU GPL, version 2 or later. +# See the COPYING file in the top-level directory. + +## +# @InstrLoadCode: +# +# Result code of an 'instr-load' command. +# +# @ok: Correctly loaded. +# @unavailable: Service not available. +# @error: Error with libdl (see 'msg'). +# +# Since: 2.10 +## +{ 'enum': 'InstrLoadCode', + 'data': [ 'ok', 'unavailable', 'error' ] } + +## +# @InstrLoadResult: +# +# Result of an 'instr-load' command. +# +# @code: Result code. +# @msg: Additional error message. +# @handle: Instrumentation library identifier (undefined in case of error). +# +# Since: 2.10 +## +{ 'struct': 'InstrLoadResult', + 'data': { 'code': 'InstrLoadCode', 'msg': 'str', 'handle': 'int' } } + +## +# @instr-load: +# +# Load an instrumentation library. +# +# @path: path to the dynamic instrumentation library +# @args: arguments to the dynamic instrumentation library +# +# Since: 2.10 +## +{ 'command': 'instr-load', + 'data': { 'path': 'str', '*args': ['String'] }, + 'returns': 'InstrLoadResult' } + + +## +# @InstrUnloadCode: +# +# Result code of an 'instr-unload' command. +# +# @ok: Correctly unloaded. +# @unavailable: Service not available. +# @invalid: Invalid handle. +# @error: Error with libdl (see 'msg'). +# +# Since: 2.10 +## +{ 'enum': 'InstrUnloadCode', + 'data': [ 'ok', 'unavailable', 'invalid', 'error' ] } + +## +# @InstrUnloadResult: +# +# Result of an 'instr-unload' command. +# +# @code: Result code. +# @msg: Additional error message. +# +# Since: 2.10 +## +{ 'struct': 'InstrUnloadResult', + 'data': { 'code': 'InstrUnloadCode', 'msg': 'str' } } + +## +# @instr-unload: +# +# Unload an instrumentation library. +# +# @handle: Instrumentation library identifier (see #InstrLoadResult). +# +# Since: 2.10 +## +{ 'command': 'instr-unload', + 'data': { 'handle': 'int' }, + 'returns': 'InstrUnloadResult' }