From 0f953051178f2e3df36efa5158a71f33d35fa812 Mon Sep 17 00:00:00 2001 From: Markus Armbruster Date: Thu, 27 Jun 2013 16:22:07 +0200 Subject: qemu-char: Fix ringbuf option size Any attempt to use it trips an "opt->desc->type == QEMU_OPT_NUMBER" assertion. Broken in commit 1da48c65. Cc: qemu-stable@nongnu.org Signed-off-by: Markus Armbruster Reviewed-by: Eric Blake Signed-off-by: Luiz Capitulino --- qemu-char.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qemu-char.c b/qemu-char.c index 18c42a39da..800d6a62f9 100644 --- a/qemu-char.c +++ b/qemu-char.c @@ -3115,7 +3115,7 @@ static void qemu_chr_parse_memory(QemuOpts *opts, ChardevBackend *backend, backend->memory = g_new0(ChardevMemory, 1); - val = qemu_opt_get_number(opts, "size", 0); + val = qemu_opt_get_size(opts, "size", 0); if (val != 0) { backend->memory->has_size = true; backend->memory->size = val; -- cgit v1.2.3 From bd9927fee4e63b451b4ef67a4c49729070d8b05d Mon Sep 17 00:00:00 2001 From: Kevin Wolf Date: Mon, 1 Jul 2013 16:31:50 +0200 Subject: qapi.py: Avoid code duplication The code that interprets the read JSON expression and appends types to the respective global variables was duplicated. We can avoid that by splitting off the part that reads from the file. Signed-off-by: Kevin Wolf Reviewed-by: Michael Roth Signed-off-by: Luiz Capitulino --- scripts/qapi.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/scripts/qapi.py b/scripts/qapi.py index 02ad668ca3..31399944bd 100644 --- a/scripts/qapi.py +++ b/scripts/qapi.py @@ -78,10 +78,8 @@ def parse(tokens): def evaluate(string): return parse(map(lambda x: x, tokenize(string)))[0] -def parse_schema(fp): - exprs = [] +def get_expr(fp): expr = '' - expr_eval = None for line in fp: if line.startswith('#') or line == '\n': @@ -90,18 +88,20 @@ def parse_schema(fp): if line.startswith(' '): expr += line elif expr: - expr_eval = evaluate(expr) - if expr_eval.has_key('enum'): - add_enum(expr_eval['enum']) - elif expr_eval.has_key('union'): - add_enum('%sKind' % expr_eval['union']) - exprs.append(expr_eval) + yield expr expr = line else: expr += line if expr: + yield expr + +def parse_schema(fp): + exprs = [] + + for expr in get_expr(fp): expr_eval = evaluate(expr) + if expr_eval.has_key('enum'): add_enum(expr_eval['enum']) elif expr_eval.has_key('union'): -- cgit v1.2.3 From b35284ea207a0ae1c0b162344cdef2a83304befc Mon Sep 17 00:00:00 2001 From: Kevin Wolf Date: Mon, 1 Jul 2013 16:31:51 +0200 Subject: qapi.py: Allow top-level type reference for command definitions If 'data' for a command definition isn't a dict, but a string, it is taken as a (struct) type name and the fields of this struct are directly used as parameters. This is useful for transactionable commands that can use the same type definition for both the transaction action and the arguments of the standalone command. Signed-off-by: Kevin Wolf Reviewed-by: Michael Roth Signed-off-by: Luiz Capitulino --- scripts/qapi.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/scripts/qapi.py b/scripts/qapi.py index 31399944bd..baf13213a9 100644 --- a/scripts/qapi.py +++ b/scripts/qapi.py @@ -106,11 +106,18 @@ def parse_schema(fp): add_enum(expr_eval['enum']) elif expr_eval.has_key('union'): add_enum('%sKind' % expr_eval['union']) + elif expr_eval.has_key('type'): + add_struct(expr_eval) exprs.append(expr_eval) return exprs def parse_args(typeinfo): + if isinstance(typeinfo, basestring): + struct = find_struct(typeinfo) + assert struct != None + typeinfo = struct['data'] + for member in typeinfo: argname = member argentry = typeinfo[member] @@ -180,6 +187,18 @@ def type_name(name): return name enum_types = [] +struct_types = [] + +def add_struct(definition): + global struct_types + struct_types.append(definition) + +def find_struct(name): + global struct_types + for struct in struct_types: + if struct['type'] == name: + return struct + return None def add_enum(name): global enum_types -- cgit v1.2.3 From 852ad1a900a4ae23514e1a53c86632543592c31b Mon Sep 17 00:00:00 2001 From: Kevin Wolf Date: Mon, 1 Jul 2013 16:31:52 +0200 Subject: qapi-schema: Use BlockdevSnapshot type for blockdev-snapshot-sync We don't have to duplicate the definition any more now that we may refer to a type instead. Signed-off-by: Kevin Wolf Reviewed-by: Michael Roth Signed-off-by: Luiz Capitulino --- qapi-schema.json | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/qapi-schema.json b/qapi-schema.json index 5c32528a1c..a90aeb1d91 100644 --- a/qapi-schema.json +++ b/qapi-schema.json @@ -1709,16 +1709,7 @@ # # Generates a synchronous snapshot of a block device. # -# @device: the name of the device to generate the snapshot from. -# -# @snapshot-file: the target of the new image. If the file exists, or if it -# is a device, the snapshot will be created in the existing -# file/device. If does not exist, a new file will be created. -# -# @format: #optional the format of the snapshot image, default is 'qcow2'. -# -# @mode: #optional whether and how QEMU should create a new image, default is -# 'absolute-paths'. +# For the arguments, see the documentation of BlockdevSnapshot. # # Returns: nothing on success # If @device is not a valid block device, DeviceNotFound @@ -1726,8 +1717,7 @@ # Since 0.14.0 ## { 'command': 'blockdev-snapshot-sync', - 'data': { 'device': 'str', 'snapshot-file': 'str', '*format': 'str', - '*mode': 'NewImageMode'} } + 'data': 'BlockdevSnapshot' } ## # @human-monitor-command: -- cgit v1.2.3 From f53cae50f81449596e55159cfe61efbef9246b2e Mon Sep 17 00:00:00 2001 From: Kevin Wolf Date: Tue, 9 Jul 2013 10:05:35 +0200 Subject: qapi-schema: Use existing type for drive-backup arguments This removes duplicated definitions and documentation by reusing the existing data type. Signed-off-by: Kevin Wolf Reviewed-by: Eric Blake Signed-off-by: Luiz Capitulino --- qapi-schema.json | 32 ++------------------------------ 1 file changed, 2 insertions(+), 30 deletions(-) diff --git a/qapi-schema.json b/qapi-schema.json index a90aeb1d91..b251d282cc 100644 --- a/qapi-schema.json +++ b/qapi-schema.json @@ -1791,42 +1791,14 @@ # The operation can be stopped before it has completed using the # block-job-cancel command. # -# @device: the name of the device which should be copied. -# -# @target: the target of the new image. If the file exists, or if it -# is a device, the existing file/device will be used as the new -# destination. If it does not exist, a new file will be created. -# -# @format: #optional the format of the new destination, default is to -# probe if @mode is 'existing', else the format of the source -# -# @mode: #optional whether and how QEMU should create a new image, default is -# 'absolute-paths'. -# -# @speed: #optional the maximum speed, in bytes per second -# -# @on-source-error: #optional the action to take on an error on the source, -# default 'report'. 'stop' and 'enospc' can only be used -# if the block device supports io-status (see BlockInfo). -# -# @on-target-error: #optional the action to take on an error on the target, -# default 'report' (no limitations, since this applies to -# a different block device than @device). -# -# Note that @on-source-error and @on-target-error only affect background I/O. -# If an error occurs during a guest write request, the device's rerror/werror -# actions will be used. +# For the arguments, see the documentation of DriveBackup. # # Returns: nothing on success # If @device is not a valid block device, DeviceNotFound # # Since 1.6 ## -{ 'command': 'drive-backup', - 'data': { 'device': 'str', 'target': 'str', '*format': 'str', - '*mode': 'NewImageMode', '*speed': 'int', - '*on-source-error': 'BlockdevOnError', - '*on-target-error': 'BlockdevOnError' } } +{ 'command': 'drive-backup', 'data': 'DriveBackup' } ## # @drive-mirror -- cgit v1.2.3 From 5e2ac5191772dea782ff78e95edd395985273019 Mon Sep 17 00:00:00 2001 From: Seiji Aguchi Date: Wed, 3 Jul 2013 23:02:46 -0400 Subject: add timestamp to error_report() [Issue] When we offer a customer support service and a problem happens in a customer's system, we try to understand the problem by comparing what the customer reports with message logs of the customer's system. In this case, we often need to know when the problem happens. But, currently, there is no timestamp in qemu's error messages. Therefore, we may not be able to understand the problem based on error messages. [Solution] Add a timestamp to qemu's error message logged by error_report() with g_time_val_to_iso8601(). Signed-off-by: Seiji Aguchi Reviewed-by: Stefan Hajnoczi Signed-off-by: Luiz Capitulino --- include/qemu/error-report.h | 2 ++ qemu-options.hx | 11 +++++++++++ util/qemu-error.c | 10 ++++++++++ vl.c | 26 ++++++++++++++++++++++++++ 4 files changed, 49 insertions(+) diff --git a/include/qemu/error-report.h b/include/qemu/error-report.h index 14c1719ad2..3b098a9173 100644 --- a/include/qemu/error-report.h +++ b/include/qemu/error-report.h @@ -14,6 +14,7 @@ #define QEMU_ERROR_H #include +#include #include "qemu/compiler.h" typedef struct Location { @@ -40,5 +41,6 @@ void error_print_loc(void); void error_set_progname(const char *argv0); void error_report(const char *fmt, ...) GCC_FMT_ATTR(1, 2); const char *error_get_progname(void); +extern bool enable_timestamp_msg; #endif diff --git a/qemu-options.hx b/qemu-options.hx index 7cc4d8ef25..4e98b4f483 100644 --- a/qemu-options.hx +++ b/qemu-options.hx @@ -3100,6 +3100,17 @@ property must be set. These objects are placed in the '/objects' path. ETEXI +DEF("msg", HAS_ARG, QEMU_OPTION_msg, + "-msg timestamp[=on|off]\n" + " change the format of messages\n" + " on|off controls leading timestamps (default:on)\n", + QEMU_ARCH_ALL) +STEXI +@item -msg timestamp[=on|off] +@findex -msg +prepend a timestamp to each log message.(default:on) +ETEXI + HXCOMM This is the last statement. Insert new options before this line! STEXI @end table diff --git a/util/qemu-error.c b/util/qemu-error.c index 08a36f480c..fec02c6075 100644 --- a/util/qemu-error.c +++ b/util/qemu-error.c @@ -196,6 +196,7 @@ void error_print_loc(void) } } +bool enable_timestamp_msg; /* * Print an error message to current monitor if we have one, else to stderr. * Format arguments like sprintf(). The result should not contain @@ -206,6 +207,15 @@ void error_print_loc(void) void error_report(const char *fmt, ...) { va_list ap; + GTimeVal tv; + gchar *timestr; + + if (enable_timestamp_msg) { + g_get_current_time(&tv); + timestr = g_time_val_to_iso8601(&tv); + error_printf("%s ", timestr); + g_free(timestr); + } error_print_loc(); va_start(ap, fmt); diff --git a/vl.c b/vl.c index bea1a10cc6..25b8f2ff38 100644 --- a/vl.c +++ b/vl.c @@ -516,6 +516,18 @@ static QemuOptsList qemu_realtime_opts = { }, }; +static QemuOptsList qemu_msg_opts = { + .name = "msg", + .head = QTAILQ_HEAD_INITIALIZER(qemu_msg_opts.head), + .desc = { + { + .name = "timestamp", + .type = QEMU_OPT_BOOL, + }, + { /* end of list */ } + }, +}; + /** * Get machine options * @@ -1503,6 +1515,12 @@ static void configure_realtime(QemuOpts *opts) } } + +static void configure_msg(QemuOpts *opts) +{ + enable_timestamp_msg = qemu_opt_get_bool(opts, "timestamp", true); +} + /***********************************************************/ /* USB devices */ @@ -2942,6 +2960,7 @@ int main(int argc, char **argv, char **envp) qemu_add_opts(&qemu_object_opts); qemu_add_opts(&qemu_tpmdev_opts); qemu_add_opts(&qemu_realtime_opts); + qemu_add_opts(&qemu_msg_opts); runstate_init(); @@ -3838,6 +3857,13 @@ int main(int argc, char **argv, char **envp) } configure_realtime(opts); break; + case QEMU_OPTION_msg: + opts = qemu_opts_parse(qemu_find_opts("msg"), optarg, 0); + if (!opts) { + exit(1); + } + configure_msg(opts); + break; default: os_parse_cmd_args(popt->index, optarg); } -- cgit v1.2.3