Received: by 2002:ac0:bc90:0:0:0:0:0 with SMTP id a16csp645680img; Fri, 22 Mar 2019 05:50:34 -0700 (PDT) X-Google-Smtp-Source: APXvYqxeUJdzSFr1Mq6ruxmPbnnQUbfZ6Y8scxOHn7WfeZIVb5ELtxCG3e/ifaPGoP9sDHEyli9d X-Received: by 2002:aa7:8b03:: with SMTP id f3mr8965503pfd.208.1553259034580; Fri, 22 Mar 2019 05:50:34 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1553259034; cv=none; d=google.com; s=arc-20160816; b=nzrZpcDfBfHd8EfX6dpbel34rrkQOILnGOlO+M6npB7vhXuAHaiUJGIer0vJ5ffGNG N9i9DbXKCCe2nmm2pLnvGoBs0gFJwyq6ud2HnX7T4TPAH2N2V2GE6xIrBVdQhOCaAwQS t26WlWyYOoiQtYWaIf65JPrkDw1XjAXNyWv0AIMmrNS0y6BSIF0TUUHiEiP0nHOZBHGC uDAeVo/1Eicb8OfHP66KEb2e5B7AgqGIAne9Xqcw8nawkZZ1RcjJlou4ub2VHYybp7su hUxP7zmFg9OoN9u4+OE/+H+4eizBZAxpCWuyuxuKdnHFHrYZfwZtHSgpGrqgRKWEnNlL HGog== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=XCbkNTq//5m/Y4JdK6WM2Ka9RMWuH14/TAeEGp1nafQ=; b=ASFGyuWqqlHDv/0L9pLIB9FfRpuuGbwW8vAxuM6hbc12//j6Fmt1E1nczaQMi8fFMu KVIoW3bx2NGaOjtd5gQvec257bldiMEkqwjcg/40FLA0kjTA6WY9DapSqye6gEMQ7hXc jy09JFJpl+Jzk4mCQuKeY8qlJzhQo86va4gKrj/eDr2XZ+/dQVy5TsO56DDBWsDhHS4P gVwKf8GAIQDyrDzA77NgokAqVXPinPBmdlRFIiUEUVVTYuv8pozr0PzMF0vn7PcBk2dN eqltVR1L6REdW1Is7r29E0/V8s1Iu+isaGea+kLtR4JmtmsT7eYo9uLvYkBZKU7/WCBI pzKw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=Y9aWrWVF; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id 124si6720172pfw.148.2019.03.22.05.50.17; Fri, 22 Mar 2019 05:50:34 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=Y9aWrWVF; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2387800AbfCVMsH (ORCPT + 99 others); Fri, 22 Mar 2019 08:48:07 -0400 Received: from mail.kernel.org ([198.145.29.99]:34286 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2387721AbfCVL5p (ORCPT ); Fri, 22 Mar 2019 07:57:45 -0400 Received: from localhost (83-86-89-107.cable.dynamic.v4.ziggo.nl [83.86.89.107]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 416F420850; Fri, 22 Mar 2019 11:57:44 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1553255864; bh=Vt8O4dy7jkwslh7TmHFOclzp+qAhH3dTKYLNCFzuwLI=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Y9aWrWVFnz6zxEbxPBNHsH5Qj82AuN2H1sPqTebuPaKpqlxLJdUexizq4BrbgWn2a vmjJh1t20nT8cNcw9VZeXg05399cqH7Giu3muMGDeGDdEyTX34ItuVswGqG0PcQtzp mTs1Rd9DBTY2kZzA1hAACSRUtR4a2b2LWsIgPR7o= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Andrew Jones , Christoffer Dall , Marc Zyngier , Sasha Levin Subject: [PATCH 4.19 038/280] KVM: arm/arm64: Reset the VCPU without preemption and vcpu state loaded Date: Fri, 22 Mar 2019 12:13:11 +0100 Message-Id: <20190322111308.458170930@linuxfoundation.org> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190322111306.356185024@linuxfoundation.org> References: <20190322111306.356185024@linuxfoundation.org> User-Agent: quilt/0.65 X-stable: review X-Patchwork-Hint: ignore MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 4.19-stable review patch. If anyone has any objections, please let me know. ------------------ [ Upstream commit e761a927bc9a7ee6ceb7c4f63d5922dbced87f0d ] We have two ways to reset a vcpu: - either through VCPU_INIT - or through a PSCI_ON call The first one is easy to reason about. The second one is implemented in a more bizarre way, as it is the vcpu that handles PSCI_ON that resets the vcpu that is being powered-on. As we need to turn the logic around and have the target vcpu to reset itself, we must take some preliminary steps. Resetting the VCPU state modifies the system register state in memory, but this may interact with vcpu_load/vcpu_put if running with preemption disabled, which in turn may lead to corrupted system register state. Address this by disabling preemption and doing put/load if required around the reset logic. Reviewed-by: Andrew Jones Signed-off-by: Christoffer Dall Signed-off-by: Marc Zyngier Signed-off-by: Sasha Levin --- arch/arm64/kvm/reset.c | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/arch/arm64/kvm/reset.c b/arch/arm64/kvm/reset.c index e37c78bbe1ca..644dd0050766 100644 --- a/arch/arm64/kvm/reset.c +++ b/arch/arm64/kvm/reset.c @@ -99,16 +99,33 @@ int kvm_arch_dev_ioctl_check_extension(struct kvm *kvm, long ext) * This function finds the right table above and sets the registers on * the virtual CPU struct to their architecturally defined reset * values. + * + * Note: This function can be called from two paths: The KVM_ARM_VCPU_INIT + * ioctl or as part of handling a request issued by another VCPU in the PSCI + * handling code. In the first case, the VCPU will not be loaded, and in the + * second case the VCPU will be loaded. Because this function operates purely + * on the memory-backed valus of system registers, we want to do a full put if + * we were loaded (handling a request) and load the values back at the end of + * the function. Otherwise we leave the state alone. In both cases, we + * disable preemption around the vcpu reset as we would otherwise race with + * preempt notifiers which also call put/load. */ int kvm_reset_vcpu(struct kvm_vcpu *vcpu) { const struct kvm_regs *cpu_reset; + int ret = -EINVAL; + bool loaded; + + preempt_disable(); + loaded = (vcpu->cpu != -1); + if (loaded) + kvm_arch_vcpu_put(vcpu); switch (vcpu->arch.target) { default: if (test_bit(KVM_ARM_VCPU_EL1_32BIT, vcpu->arch.features)) { if (!cpu_has_32bit_el1()) - return -EINVAL; + goto out; cpu_reset = &default_regs_reset32; } else { cpu_reset = &default_regs_reset; @@ -131,5 +148,10 @@ int kvm_reset_vcpu(struct kvm_vcpu *vcpu) vcpu->arch.workaround_flags |= VCPU_WORKAROUND_2_FLAG; /* Reset timer */ - return kvm_timer_vcpu_reset(vcpu); + ret = kvm_timer_vcpu_reset(vcpu); +out: + if (loaded) + kvm_arch_vcpu_load(vcpu, smp_processor_id()); + preempt_enable(); + return ret; } -- 2.19.1