From 554a39eb3268ef927ccd19ea642b886f0acf8ec2 Mon Sep 17 00:00:00 2001 From: ZhiPeng Lu Date: Thu, 19 Oct 2017 19:16:33 +0800 Subject: [PATCH 1/2] hmp: Replace error_report_err MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Use hmp_handle_error instend of error_report_err to set error. Signed-off-by: ZhiPeng Lu Reviewed-by: Jiyun Fan Message-Id: <1508411793-22868-1-git-send-email-lu.zhipeng@zte.com.cn> Reviewed-by: Philippe Mathieu-Daudé Reviewed-by: Dr. David Alan Gilbert Signed-off-by: Dr. David Alan Gilbert --- hmp.c | 26 ++++++++------------------ 1 file changed, 8 insertions(+), 18 deletions(-) diff --git a/hmp.c b/hmp.c index a01be50daa..35a7041824 100644 --- a/hmp.c +++ b/hmp.c @@ -670,7 +670,7 @@ void hmp_info_vnc(Monitor *mon, const QDict *qdict) info2l = qmp_query_vnc_servers(&err); if (err) { - error_report_err(err); + hmp_handle_error(mon, &err); return; } if (!info2l) { @@ -785,7 +785,7 @@ void hmp_info_balloon(Monitor *mon, const QDict *qdict) info = qmp_query_balloon(&err); if (err) { - error_report_err(err); + hmp_handle_error(mon, &err); return; } @@ -1128,7 +1128,7 @@ void hmp_ringbuf_read(Monitor *mon, const QDict *qdict) data = qmp_ringbuf_read(chardev, size, false, 0, &err); if (err) { - error_report_err(err); + hmp_handle_error(mon, &err); return; } @@ -1195,9 +1195,7 @@ void hmp_balloon(Monitor *mon, const QDict *qdict) Error *err = NULL; qmp_balloon(value, &err); - if (err) { - error_report_err(err); - } + hmp_handle_error(mon, &err); } void hmp_block_resize(Monitor *mon, const QDict *qdict) @@ -1534,10 +1532,7 @@ void hmp_migrate_set_cache_size(Monitor *mon, const QDict *qdict) Error *err = NULL; qmp_migrate_set_cache_size(value, &err); - if (err) { - error_report_err(err); - return; - } + hmp_handle_error(mon, &err); } /* Kept for backwards compatibility */ @@ -1568,10 +1563,7 @@ void hmp_migrate_set_capability(Monitor *mon, const QDict *qdict) end: qapi_free_MigrationCapabilityStatusList(caps); - - if (err) { - error_report_err(err); - } + hmp_handle_error(mon, &err); } void hmp_migrate_set_parameter(Monitor *mon, const QDict *qdict) @@ -1680,9 +1672,7 @@ void hmp_migrate_set_parameter(Monitor *mon, const QDict *qdict) cleanup: qapi_free_MigrateSetParameters(p); visit_free(v); - if (err) { - error_report_err(err); - } + hmp_handle_error(mon, &err); } void hmp_client_migrate_info(Monitor *mon, const QDict *qdict) @@ -1936,7 +1926,7 @@ void hmp_migrate(Monitor *mon, const QDict *qdict) qmp_migrate(uri, !!blk, blk, !!inc, inc, false, false, &err); if (err) { - error_report_err(err); + hmp_handle_error(mon, &err); return; } From 751f8cfe2a556b3ef49f6af2860e2d1d2a1ec66a Mon Sep 17 00:00:00 2001 From: Greg Kurz Date: Tue, 17 Oct 2017 10:16:22 +0200 Subject: [PATCH 2/2] monitor: fix dangling CPU pointer If a CPU selected with the "cpu" command is hot-unplugged then "info cpus" causes QEMU to exit: (qemu) device_del cpu1 (qemu) info cpus qemu:qemu_cpu_kick_thread: No such process This happens because "cpu" stores the pointer to the selected CPU into the monitor structure. When the CPU is hot-unplugged, we end up with a dangling pointer. The "info cpus" command then does: hmp_info_cpus() monitor_get_cpu_index() mon_get_cpu() cpu_synchronize_state() <--- called with dangling pointer This could cause a QEMU crash as well. This patch switches the monitor to store the QOM path instead of a pointer to the current CPU. The path is then resolved when needed. If the resolution fails, we assume that the CPU was removed and the path is resetted to the default (ie, path of first_cpu). Reported-by: Satheesh Rajendran Suggested-by: Igor Mammedov Signed-off-by: Greg Kurz Message-Id: <150822818243.26242.12993827911736928961.stgit@bahia.lan> Reviewed-by: Igor Mammedov Signed-off-by: Dr. David Alan Gilbert --- monitor.c | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/monitor.c b/monitor.c index 7a802a345e..e36fb5308d 100644 --- a/monitor.c +++ b/monitor.c @@ -200,7 +200,7 @@ struct Monitor { ReadLineState *rs; MonitorQMP qmp; - CPUState *mon_cpu; + gchar *mon_cpu_path; BlockCompletionFunc *password_completion_cb; void *password_opaque; mon_cmd_t *cmd_table; @@ -579,6 +579,7 @@ static void monitor_data_init(Monitor *mon) static void monitor_data_destroy(Monitor *mon) { + g_free(mon->mon_cpu_path); qemu_chr_fe_deinit(&mon->chr, false); if (monitor_is_qmp(mon)) { json_message_parser_destroy(&mon->qmp.parser); @@ -1047,20 +1048,32 @@ int monitor_set_cpu(int cpu_index) if (cpu == NULL) { return -1; } - cur_mon->mon_cpu = cpu; + g_free(cur_mon->mon_cpu_path); + cur_mon->mon_cpu_path = object_get_canonical_path(OBJECT(cpu)); return 0; } CPUState *mon_get_cpu(void) { - if (!cur_mon->mon_cpu) { + CPUState *cpu; + + if (cur_mon->mon_cpu_path) { + cpu = (CPUState *) object_resolve_path_type(cur_mon->mon_cpu_path, + TYPE_CPU, NULL); + if (!cpu) { + g_free(cur_mon->mon_cpu_path); + cur_mon->mon_cpu_path = NULL; + } + } + if (!cur_mon->mon_cpu_path) { if (!first_cpu) { return NULL; } monitor_set_cpu(first_cpu->cpu_index); + cpu = first_cpu; } - cpu_synchronize_state(cur_mon->mon_cpu); - return cur_mon->mon_cpu; + cpu_synchronize_state(cpu); + return cpu; } CPUArchState *mon_get_cpu_env(void)