From nobody Fri Dec 19 20:52:30 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 148672057935294.40577021832758; Fri, 10 Feb 2017 01:56:19 -0800 (PST) Received: from localhost ([::1]:42807 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cc7w9-0005AJ-V9 for importer@patchew.org; Fri, 10 Feb 2017 04:56:17 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:33619) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cc7qN-0000KV-NQ for qemu-devel@nongnu.org; Fri, 10 Feb 2017 04:50:21 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cc7qM-0005NG-5U for qemu-devel@nongnu.org; Fri, 10 Feb 2017 04:50:19 -0500 Received: from mail-wm0-x241.google.com ([2a00:1450:400c:c09::241]:36070) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1cc7qL-0005Mv-SW for qemu-devel@nongnu.org; Fri, 10 Feb 2017 04:50:18 -0500 Received: by mail-wm0-x241.google.com with SMTP id r18so6570939wmd.3 for ; Fri, 10 Feb 2017 01:50:17 -0800 (PST) Received: from donizetti.lan (94-39-187-56.adsl-ull.clienti.tiscali.it. [94.39.187.56]) by smtp.gmail.com with ESMTPSA id i203sm723664wmf.12.2017.02.10.01.50.15 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 10 Feb 2017 01:50:16 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=7iuHp2TSDO6xpoxr2LIsR9b6KA1lp63PfeOzAGrKcFI=; b=tc51BLt188OKtSojTv4yWWqZ9Em2doW0PRq63sdbHK8oUt5lmN0d4OWUcbe5IKml4M ASZsh6RZSUyWx2Cf6lXcUnsk8MEO/sARzNUHjbB5cSQWlijfT4PY79o4zaJcjrgRnESa 0QuV4Vh2Olx8kG8jZu2GQHOgOBwBzEko8EL9o4nKy5X7rgIyMhaHZv3YzmvNvhSZkPbl g4cNn2wEmMrykq51eYvATI/b3cJ++J2Tivbny677Ag3kp7thpiKKFFRGANelwjvyEqh4 jZgUO7aq0dwkOCidZ0lPVxKXyicrT1KsS9LGiECqJ1KtKMH05zFZpMZp5zi1gGhzxUUK 9YAg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references; bh=7iuHp2TSDO6xpoxr2LIsR9b6KA1lp63PfeOzAGrKcFI=; b=X0vr425gjdkhWi8FrMTk5StuMgC/kWrQOomojuQHw1PV6nJPfdhH3lOK8Bh+fsLHTv f4fJiZID4I1ShjdbhBdg4XHpSdzjm/P8lPxqTmoWSR/Jvk1SbH98vnOMWfCRohED3Us+ eS4Hjya0Zv1L/cBl9bt78sdsIRHbJaSxTL7XbGJ8+JW5lxX1jF1+6emGYTuBd2wDOk1k xj4gmfWdQRVoD3Z6gu+OV+ynAzSd1IFKw9yrkVGufIuZt2CAgnfvHaNOQNnatZLJUmy9 4chP/v83jHfj0stqr7RojP3qU0oBqHDLLxmmF7qljErXoCQA6d5bM9t+e6EbbPvIPGUH NoDg== X-Gm-Message-State: AMke39nzlMYA9iaXbI4jfYcIA3gMzmYZGT99MvID/KfMsP7ozFnB4uUvc+FaYUB1tF+uPg== X-Received: by 10.28.228.213 with SMTP id b204mr27687591wmh.59.1486720216740; Fri, 10 Feb 2017 01:50:16 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Fri, 10 Feb 2017 10:50:08 +0100 Message-Id: <20170210095012.16039-4-pbonzini@redhat.com> X-Mailer: git-send-email 2.9.3 In-Reply-To: <20170210095012.16039-1-pbonzini@redhat.com> References: <20170210095012.16039-1-pbonzini@redhat.com> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 2a00:1450:400c:c09::241 Subject: [Qemu-devel] [PATCH 3/7] cpus: reorganize signal handling code 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: kvm@vger.kernel.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Move the KVM "eat signals" code under CONFIG_LINUX, in preparation for moving it to kvm-all.c; reraise non-MCE SIGBUS immediately, without passing it to KVM. Signed-off-by: Paolo Bonzini --- cpus.c | 63 ++++++++++++++++++++++++++----------------------= ---- include/qemu/osdep.h | 9 ++++++++ target/i386/kvm.c | 15 ++----------- 3 files changed, 43 insertions(+), 44 deletions(-) diff --git a/cpus.c b/cpus.c index b28e08e..ce80783 100644 --- a/cpus.c +++ b/cpus.c @@ -792,6 +792,10 @@ static void sigbus_reraise(void) =20 static void sigbus_handler(int n, siginfo_t *siginfo, void *ctx) { + if (siginfo->si_code !=3D BUS_MCEERR_AO && siginfo->si_code !=3D BUS_M= CEERR_AR) { + sigbus_reraise(); + } + if (kvm_on_sigbus(siginfo->si_code, siginfo->si_addr)) { sigbus_reraise(); } @@ -809,6 +813,30 @@ static void qemu_init_sigbus(void) prctl(PR_MCE_KILL, PR_MCE_KILL_SET, PR_MCE_KILL_EARLY, 0, 0); } =20 +static void dummy_signal(int sig) +{ +} + +static void qemu_kvm_init_cpu_signals(CPUState *cpu) +{ + int r; + sigset_t set; + struct sigaction sigact; + + memset(&sigact, 0, sizeof(sigact)); + sigact.sa_handler =3D dummy_signal; + sigaction(SIG_IPI, &sigact, NULL); + + pthread_sigmask(SIG_BLOCK, NULL, &set); + sigdelset(&set, SIG_IPI); + sigdelset(&set, SIGBUS); + r =3D kvm_set_signal_mask(cpu, &set); + if (r) { + fprintf(stderr, "kvm_set_signal_mask: %s\n", strerror(-r)); + exit(1); + } +} + static void qemu_kvm_eat_signals(CPUState *cpu) { struct timespec ts =3D { 0, 0 }; @@ -830,6 +858,9 @@ static void qemu_kvm_eat_signals(CPUState *cpu) =20 switch (r) { case SIGBUS: + if (siginfo.si_code !=3D BUS_MCEERR_AO && siginfo.si_code !=3D= BUS_MCEERR_AR) { + sigbus_reraise(); + } if (kvm_on_sigbus_vcpu(cpu, siginfo.si_code, siginfo.si_addr))= { sigbus_reraise(); } @@ -845,9 +876,7 @@ static void qemu_kvm_eat_signals(CPUState *cpu) } } while (sigismember(&chkset, SIG_IPI) || sigismember(&chkset, SIGBUS)= ); } - #else /* !CONFIG_LINUX */ - static void qemu_init_sigbus(void) { } @@ -855,39 +884,11 @@ static void qemu_init_sigbus(void) static void qemu_kvm_eat_signals(CPUState *cpu) { } -#endif /* !CONFIG_LINUX */ - -#ifndef _WIN32 -static void dummy_signal(int sig) -{ -} - -static void qemu_kvm_init_cpu_signals(CPUState *cpu) -{ - int r; - sigset_t set; - struct sigaction sigact; - - memset(&sigact, 0, sizeof(sigact)); - sigact.sa_handler =3D dummy_signal; - sigaction(SIG_IPI, &sigact, NULL); - - pthread_sigmask(SIG_BLOCK, NULL, &set); - sigdelset(&set, SIG_IPI); - sigdelset(&set, SIGBUS); - r =3D kvm_set_signal_mask(cpu, &set); - if (r) { - fprintf(stderr, "kvm_set_signal_mask: %s\n", strerror(-r)); - exit(1); - } -} =20 -#else /* _WIN32 */ static void qemu_kvm_init_cpu_signals(CPUState *cpu) { - abort(); } -#endif /* _WIN32 */ +#endif /* !CONFIG_LINUX */ =20 static QemuMutex qemu_global_mutex; static QemuCond qemu_io_proceeded_cond; diff --git a/include/qemu/osdep.h b/include/qemu/osdep.h index 5201dbd..48bed95 100644 --- a/include/qemu/osdep.h +++ b/include/qemu/osdep.h @@ -277,6 +277,15 @@ void qemu_anon_ram_free(void *ptr, size_t size); =20 #endif =20 +#if defined(CONFIG_LINUX) +#ifndef BUS_MCEERR_AR +#define BUS_MCEERR_AR 4 +#endif +#ifndef BUS_MCEERR_AO +#define BUS_MCEERR_AO 5 +#endif +#endif + #if defined(__linux__) && \ (defined(__x86_64__) || defined(__arm__) || defined(__aarch64__)) /* Use 2 MiB alignment so transparent hugepages can be used by KVM. diff --git a/target/i386/kvm.c b/target/i386/kvm.c index 0c48dfd..f49a786 100644 --- a/target/i386/kvm.c +++ b/target/i386/kvm.c @@ -64,13 +64,6 @@ * 255 kvm_msr_entry structs */ #define MSR_BUF_SIZE 4096 =20 -#ifndef BUS_MCEERR_AR -#define BUS_MCEERR_AR 4 -#endif -#ifndef BUS_MCEERR_AO -#define BUS_MCEERR_AO 5 -#endif - const KVMCapabilityInfo kvm_arch_required_capabilities[] =3D { KVM_CAP_INFO(SET_TSS_ADDR), KVM_CAP_INFO(EXT_CPUID), @@ -469,9 +462,7 @@ int kvm_arch_on_sigbus_vcpu(CPUState *c, int code, void= *addr) ram_addr_t ram_addr; hwaddr paddr; =20 - if (code !=3D BUS_MCEERR_AR && code !=3D BUS_MCEERR_AO) { - return 1; - } + assert(code =3D=3D BUS_MCEERR_AR || code =3D=3D BUS_MCEERR_AO); =20 /* Because the MCE happened while running the VCPU, KVM could have * injected action required MCEs too. Action optional MCEs should @@ -504,9 +495,7 @@ int kvm_arch_on_sigbus(int code, void *addr) { X86CPU *cpu =3D X86_CPU(first_cpu); =20 - if (code !=3D BUS_MCEERR_AR && code !=3D BUS_MCEERR_AO) { - return 1; - } + assert(code =3D=3D BUS_MCEERR_AR || code =3D=3D BUS_MCEERR_AO); =20 if (code =3D=3D BUS_MCEERR_AR) { hardware_memory_error(); --=20 1.8.3.1