From patchwork Fri Oct 28 17:15:15 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Claudio Imbrenda X-Patchwork-Id: 9402443 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 71975601C0 for ; Fri, 28 Oct 2016 17:16:55 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 626622A8B3 for ; Fri, 28 Oct 2016 17:16:55 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 572AF2A8B5; Fri, 28 Oct 2016 17:16:55 +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 B22162A8B3 for ; Fri, 28 Oct 2016 17:16:54 +0000 (UTC) Received: from localhost ([::1]:50860 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1c0Alx-0000Yy-Uy for patchwork-qemu-devel@patchwork.kernel.org; Fri, 28 Oct 2016 13:16:54 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:35175) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1c0AkX-0007xz-64 for qemu-devel@nongnu.org; Fri, 28 Oct 2016 13:15:26 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1c0AkT-0002yi-Ui for qemu-devel@nongnu.org; Fri, 28 Oct 2016 13:15:25 -0400 Received: from mx0b-001b2d01.pphosted.com ([148.163.158.5]:36725 helo=mx0a-001b2d01.pphosted.com) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1c0AkT-0002yG-PJ for qemu-devel@nongnu.org; Fri, 28 Oct 2016 13:15:21 -0400 Received: from pps.filterd (m0098413.ppops.net [127.0.0.1]) by mx0b-001b2d01.pphosted.com (8.16.0.17/8.16.0.17) with SMTP id u9SHDQBe080921 for ; Fri, 28 Oct 2016 13:15:21 -0400 Received: from e06smtp12.uk.ibm.com (e06smtp12.uk.ibm.com [195.75.94.108]) by mx0b-001b2d01.pphosted.com with ESMTP id 26c91dsggj-1 (version=TLSv1.2 cipher=AES256-SHA bits=256 verify=NOT) for ; Fri, 28 Oct 2016 13:15:20 -0400 Received: from localhost by e06smtp12.uk.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Fri, 28 Oct 2016 18:15:19 +0100 Received: from d06dlp03.portsmouth.uk.ibm.com (9.149.20.15) by e06smtp12.uk.ibm.com (192.168.101.142) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Fri, 28 Oct 2016 18:15:18 +0100 Received: from b06cxnps3074.portsmouth.uk.ibm.com (d06relay09.portsmouth.uk.ibm.com [9.149.109.194]) by d06dlp03.portsmouth.uk.ibm.com (Postfix) with ESMTP id 4264F1B08023 for ; Fri, 28 Oct 2016 18:17:25 +0100 (BST) Received: from d06av05.portsmouth.uk.ibm.com (d06av05.portsmouth.uk.ibm.com [9.149.37.229]) by b06cxnps3074.portsmouth.uk.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id u9SHFHLB42402022 for ; Fri, 28 Oct 2016 17:15:17 GMT Received: from d06av05.portsmouth.uk.ibm.com (localhost [127.0.0.1]) by d06av05.portsmouth.uk.ibm.com (8.14.4/8.14.4/NCO v10.0 AVout) with ESMTP id u9SHFHKl029288 for ; Fri, 28 Oct 2016 11:15:17 -0600 Received: from p-imbrenda.boeblingen.de.ibm.com (dyn-9-152-224-35.boeblingen.de.ibm.com [9.152.224.35]) by d06av05.portsmouth.uk.ibm.com (8.14.4/8.14.4/NCO v10.0 AVin) with ESMTP id u9SHFGWd029276 (version=TLSv1/SSLv3 cipher=AES256-SHA256 bits=256 verify=NO); Fri, 28 Oct 2016 11:15:17 -0600 From: Claudio Imbrenda To: qemu-devel@nongnu.org Date: Fri, 28 Oct 2016 19:15:15 +0200 X-Mailer: git-send-email 1.9.1 In-Reply-To: <1477674916-6795-1-git-send-email-imbrenda@linux.vnet.ibm.com> References: <1477674916-6795-1-git-send-email-imbrenda@linux.vnet.ibm.com> X-TM-AS-MML: disable X-Content-Scanned: Fidelis XPS MAILER x-cbid: 16102817-0008-0000-0000-000002E99B68 X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused x-cbparentid: 16102817-0009-0000-0000-00001A8541DC Message-Id: <1477674916-6795-2-git-send-email-imbrenda@linux.vnet.ibm.com> X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:, , definitions=2016-10-28_08:, , signatures=0 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 suspectscore=1 malwarescore=0 phishscore=0 adultscore=0 bulkscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1609300000 definitions=main-1610280292 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [generic] X-Received-From: 148.163.158.5 Subject: [Qemu-devel] [PATCH v3 1/2] move vm_start to cpus.c 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: pbonzini@redhat.com, palves@redhat.com, borntraeger@de.ibm.com Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" X-Virus-Scanned: ClamAV using ClamSMTP This patch: * moves vm_start to cpus.c . * exports qemu_vmstop_requested, since it's needed by vm_start . * extracts vm_prepare_start from vm_start; it does what vm_start did, except restarting the cpus. vm_start now calls vm_prepare_start. * moves the call to qemu_clock_enable away from resume_all_vcpus, and add an explicit call to it before each instance of resume_all_vcpus in the code. Signed-off-by: Claudio Imbrenda --- cpus.c | 44 +++++++++++++++++++++++++++++++++++++++++++- hw/i386/kvmvapic.c | 2 ++ include/sysemu/cpus.h | 1 + include/sysemu/sysemu.h | 2 ++ target-s390x/misc_helper.c | 2 ++ vl.c | 32 +++----------------------------- 6 files changed, 53 insertions(+), 30 deletions(-) diff --git a/cpus.c b/cpus.c index cfd5cdc..34667fa 100644 --- a/cpus.c +++ b/cpus.c @@ -1260,7 +1260,6 @@ void resume_all_vcpus(void) { CPUState *cpu; - qemu_clock_enable(QEMU_CLOCK_VIRTUAL, true); CPU_FOREACH(cpu) { cpu_resume(cpu); } @@ -1396,6 +1395,49 @@ int vm_stop(RunState state) return do_vm_stop(state); } +/** + * Prepare for (re)starting the VM. + * Returns -1 if the vCPUs are not to be restarted (e.g. if they are already + * running or in case of an error condition), 0 otherwise. + */ +int vm_prepare_start(void) +{ + RunState requested; + int res = 0; + + qemu_vmstop_requested(&requested); + if (runstate_is_running() && requested == RUN_STATE__MAX) { + return -1; + } + + /* Ensure that a STOP/RESUME pair of events is emitted if a + * vmstop request was pending. The BLOCK_IO_ERROR event, for + * example, according to documentation is always followed by + * the STOP event. + */ + if (runstate_is_running()) { + qapi_event_send_stop(&error_abort); + res = -1; + } else { + replay_enable_events(); + cpu_enable_ticks(); + runstate_set(RUN_STATE_RUNNING); + vm_state_notify(1, RUN_STATE_RUNNING); + } + + /* XXX: is it ok to send this even before actually resuming the CPUs? */ + qapi_event_send_resume(&error_abort); + return res; +} + +void vm_start(void) +{ + if (!vm_prepare_start()) { + qemu_clock_enable(QEMU_CLOCK_VIRTUAL, true); + resume_all_vcpus(); + } +} + /* does a state transition even if the VM is already stopped, current state is forgotten forever */ int vm_stop_force_state(RunState state) diff --git a/hw/i386/kvmvapic.c b/hw/i386/kvmvapic.c index 74a549b..3101860 100644 --- a/hw/i386/kvmvapic.c +++ b/hw/i386/kvmvapic.c @@ -446,6 +446,7 @@ static void patch_instruction(VAPICROMState *s, X86CPU *cpu, target_ulong ip) abort(); } + qemu_clock_enable(QEMU_CLOCK_VIRTUAL, true); resume_all_vcpus(); if (!kvm_enabled()) { @@ -686,6 +687,7 @@ static void vapic_write(void *opaque, hwaddr addr, uint64_t data, pause_all_vcpus(); patch_byte(cpu, env->eip - 2, 0x66); patch_byte(cpu, env->eip - 1, 0x90); + qemu_clock_enable(QEMU_CLOCK_VIRTUAL, true); resume_all_vcpus(); } diff --git a/include/sysemu/cpus.h b/include/sysemu/cpus.h index 3728a1e..5fa074b 100644 --- a/include/sysemu/cpus.h +++ b/include/sysemu/cpus.h @@ -5,6 +5,7 @@ bool qemu_in_vcpu_thread(void); void qemu_init_cpu_loop(void); void resume_all_vcpus(void); +void resume_some_vcpus(CPUState **cpus); void pause_all_vcpus(void); void cpu_stop_current(void); void cpu_ticks_init(void); diff --git a/include/sysemu/sysemu.h b/include/sysemu/sysemu.h index 66c6f15..ebe8b76 100644 --- a/include/sysemu/sysemu.h +++ b/include/sysemu/sysemu.h @@ -37,6 +37,7 @@ void vm_state_notify(int running, RunState state); #define VMRESET_REPORT true void vm_start(void); +int vm_prepare_start(void); int vm_stop(RunState state); int vm_stop_force_state(RunState state); @@ -60,6 +61,7 @@ void qemu_register_powerdown_notifier(Notifier *notifier); void qemu_system_debug_request(void); void qemu_system_vmstop_request(RunState reason); void qemu_system_vmstop_request_prepare(void); +bool qemu_vmstop_requested(RunState *r); int qemu_shutdown_requested_get(void); int qemu_reset_requested_get(void); void qemu_system_killed(int signal, pid_t pid); diff --git a/target-s390x/misc_helper.c b/target-s390x/misc_helper.c index 4df2ec6..2b74710 100644 --- a/target-s390x/misc_helper.c +++ b/target-s390x/misc_helper.c @@ -133,6 +133,7 @@ static int modified_clear_reset(S390CPU *cpu) s390_crypto_reset(); scc->load_normal(CPU(cpu)); cpu_synchronize_all_post_reset(); + qemu_clock_enable(QEMU_CLOCK_VIRTUAL, true); resume_all_vcpus(); return 0; } @@ -152,6 +153,7 @@ static int load_normal_reset(S390CPU *cpu) scc->initial_cpu_reset(CPU(cpu)); scc->load_normal(CPU(cpu)); cpu_synchronize_all_post_reset(); + qemu_clock_enable(QEMU_CLOCK_VIRTUAL, true); resume_all_vcpus(); return 0; } diff --git a/vl.c b/vl.c index 4ec8120..e2dbc45 100644 --- a/vl.c +++ b/vl.c @@ -746,7 +746,7 @@ StatusInfo *qmp_query_status(Error **errp) return info; } -static bool qemu_vmstop_requested(RunState *r) +bool qemu_vmstop_requested(RunState *r) { qemu_mutex_lock(&vmstop_lock); *r = vmstop_requested; @@ -767,34 +767,6 @@ void qemu_system_vmstop_request(RunState state) qemu_notify_event(); } -void vm_start(void) -{ - RunState requested; - - qemu_vmstop_requested(&requested); - if (runstate_is_running() && requested == RUN_STATE__MAX) { - return; - } - - /* Ensure that a STOP/RESUME pair of events is emitted if a - * vmstop request was pending. The BLOCK_IO_ERROR event, for - * example, according to documentation is always followed by - * the STOP event. - */ - if (runstate_is_running()) { - qapi_event_send_stop(&error_abort); - } else { - replay_enable_events(); - cpu_enable_ticks(); - runstate_set(RUN_STATE_RUNNING); - vm_state_notify(1, RUN_STATE_RUNNING); - resume_all_vcpus(); - } - - qapi_event_send_resume(&error_abort); -} - - /***********************************************************/ /* real time host monotonic timer */ @@ -1914,6 +1886,7 @@ static bool main_loop_should_exit(void) if (qemu_reset_requested()) { pause_all_vcpus(); qemu_system_reset(VMRESET_REPORT); + qemu_clock_enable(QEMU_CLOCK_VIRTUAL, true); resume_all_vcpus(); if (!runstate_check(RUN_STATE_RUNNING) && !runstate_check(RUN_STATE_INMIGRATE)) { @@ -1925,6 +1898,7 @@ static bool main_loop_should_exit(void) qemu_system_reset(VMRESET_SILENT); notifier_list_notify(&wakeup_notifiers, &wakeup_reason); wakeup_reason = QEMU_WAKEUP_REASON_NONE; + qemu_clock_enable(QEMU_CLOCK_VIRTUAL, true); resume_all_vcpus(); qapi_event_send_wakeup(&error_abort); }