Merge remote-tracking branch 'luiz/queue/qmp' into staging
# By Kevin Wolf (4) and others # Via Luiz Capitulino * luiz/queue/qmp: add timestamp to error_report() qapi-schema: Use existing type for drive-backup arguments qapi-schema: Use BlockdevSnapshot type for blockdev-snapshot-sync qapi.py: Allow top-level type reference for command definitions qapi.py: Avoid code duplication qemu-char: Fix ringbuf option size Message-id: 1373478767-20965-1-git-send-email-lcapitulino@redhat.com Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
This commit is contained in:
		
						commit
						c170a23ca0
					
				| @ -14,6 +14,7 @@ | ||||
| #define QEMU_ERROR_H | ||||
| 
 | ||||
| #include <stdarg.h> | ||||
| #include <stdbool.h> | ||||
| #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 | ||||
|  | ||||
| @ -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: | ||||
| @ -1801,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 | ||||
|  | ||||
| @ -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; | ||||
|  | ||||
| @ -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 | ||||
|  | ||||
| @ -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,27 +88,36 @@ 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'): | ||||
|             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 | ||||
|  | ||||
| @ -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); | ||||
|  | ||||
							
								
								
									
										26
									
								
								vl.c
									
									
									
									
									
								
							
							
						
						
									
										26
									
								
								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); | ||||
|             } | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Anthony Liguori
						Anthony Liguori