Received: by 2002:a25:ab43:0:0:0:0:0 with SMTP id u61csp6143034ybi; Wed, 29 May 2019 03:33:31 -0700 (PDT) X-Google-Smtp-Source: APXvYqxWlY5Zkkd31cz2SMbEuEPoUa8EUO5vMEuGGohtTOWoJfHh2UUlhi5mD060gw9t91Zf3cv6 X-Received: by 2002:a17:90a:d683:: with SMTP id x3mr11482607pju.42.1559126011551; Wed, 29 May 2019 03:33:31 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1559126011; cv=none; d=google.com; s=arc-20160816; b=Swwjw4bORVgq+gvol32W5vmyTcvC0QPeJyUA4dkIBgBwFcMYzUQebHsxc5NGb9uZUW qNMhupzukjYp1F2Qv75t7YTkHOaznhrJa1leqyEj8TfcXsIWpEtNmlrL3zwcZbNo3Qc0 bSGwo2b1HElK+w1aaffoj04QEcB2WFQmgIqSY2cooHLtMapXN4K2qHJAucdJ5YDHtm2d c2oYZKyT4hjoECD1ZMEUPjkVFOEJ+8kpVqb1dV2vzdqNZdYDYrMwfZ+kGQ7sfzqdYuou ka7Txv5i2hjpoyIuQNUJ9wmlTgdIU8oeV+bQLgrYHLp/ktjpwnDlvVDpERxz4o5nfF94 6/pw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:user-agent:references :message-id:in-reply-to:subject:cc:to:from:date:dkim-signature; bh=wfKzncNesPxC+R5fKE1ElO4GcGSf1lXYTzXA0+KIX/U=; b=zkxUmvKm0n0KkrR69SvE3ULVQ3IpKxBg7l9SPxGTTsUzSgYS4TGlmsn+HQhQqazgeY Ku4hoZCVMNTrvXvIeKAlLIfdg9BlYbg9VwVprXsm8nFGVFHIOE2OQ7cR9ppPZ1UR8wOS duU0hMmHC0yCwo+xEEc71DRWSegXSlBVMWJycq0siR4Yr+4BJJ+gb/eiYAhLIz4Sgnr4 tHhEX5qVeBn7FWlayx7IBxcpDdQejOrOq2pQQRbFTK72voGNTpgItmZYm0uHcMWr7tIZ FkPON0HZv1qNQ1uT3eoTzc8dFDXJv+tI9/VTmaF1F11ql5RCrS10znvNyNmH3CvkSEz/ MC+Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=P5l7mvrY; 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; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id o61si26872579pld.66.2019.05.29.03.33.15; Wed, 29 May 2019 03:33:31 -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=P5l7mvrY; 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; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726683AbfE2KcH (ORCPT + 99 others); Wed, 29 May 2019 06:32:07 -0400 Received: from mail.kernel.org ([198.145.29.99]:39782 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725936AbfE2KcH (ORCPT ); Wed, 29 May 2019 06:32:07 -0400 Received: from pobox.suse.cz (prg-ext-pat.suse.com [213.151.95.130]) (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 0787421721; Wed, 29 May 2019 10:32:03 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1559125926; bh=tSyB8R9LSCvDZM0gfCgG+2cjclheMogFDxE5DrDOEOk=; h=Date:From:To:cc:Subject:In-Reply-To:References:From; b=P5l7mvrYQpdnqXe/9pQu4/3eUvCtSn1lisXJrdp4GmIP/xBunN5o33lLawdTA3QrG ITgdZHdfivXS6ZTG2JSf6ozrCLQo03I+JsYTEK8D/FqHjGkkywNXkC8918sRRSpBOa X6ohzL8SBf2QZTTB9eJB5VZon2Tk34Hqhi3R/9PI= Date: Wed, 29 May 2019 12:32:02 +0200 (CEST) From: Jiri Kosina To: "Rafael J. Wysocki" , Pavel Machek , Thomas Gleixner , Ingo Molnar , Borislav Petkov , "H. Peter Anvin" , Josh Poimboeuf , Peter Zijlstra cc: x86@kernel.org, linux-pm@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v2] x86/power: Fix 'nosmt' vs. hibernation triple fault during resume In-Reply-To: Message-ID: References: User-Agent: Alpine 2.21 (LSU 202 2017-01-01) MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Jiri Kosina As explained in 0cc3cd21657b ("cpu/hotplug: Boot HT siblings at least once") we always, no matter what, have to bring up x86 HT siblings during boot at least once in order to avoid first MCE bringing the system to its knees. That means that whenever 'nosmt' is supplied on the kernel command-line, all the HT siblings are as a result sitting in mwait or cpudile after going through the online-offline cycle at least once. This causes a serious issue though when a kernel, which saw 'nosmt' on its commandline, is going to perform resume from hibernation: if the resume from the hibernated image is successful, cr3 is flipped in order to point to the address space of the kernel that is being resumed, which in turn means that all the HT siblings are all of a sudden mwaiting on address which is no longer valid. That results in triple fault shortly after cr3 is switched, and machine reboots. Fix this by always waking up all the SMT siblings before initiating the 'restore from hibernation' process; this guarantees that all the HT siblings will be properly carried over to the resumed kernel waiting in resume_play_dead(), and acted upon accordingly afterwards, based on the target kernel configuration. Cc: stable@vger.kernel.org # v4.19+ Debugged-by: Thomas Gleixner Fixes: 0cc3cd21657b ("cpu/hotplug: Boot HT siblings at least once") Acked-by: Rafael J. Wysocki Signed-off-by: Jiri Kosina --- v1 -> v2: restructure error handling as suggested by peterz add Rafael's ack arch/x86/power/cpu.c | 10 ++++++++++ include/linux/cpu.h | 2 ++ kernel/cpu.c | 2 +- 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/arch/x86/power/cpu.c b/arch/x86/power/cpu.c index a7d966964c6f..513ce09e9950 100644 --- a/arch/x86/power/cpu.c +++ b/arch/x86/power/cpu.c @@ -299,7 +299,17 @@ int hibernate_resume_nonboot_cpu_disable(void) * address in its instruction pointer may not be possible to resolve * any more at that point (the page tables used by it previously may * have been overwritten by hibernate image data). + * + * First, make sure that we wake up all the potentially disabled SMT + * threads which have been initially brought up and then put into + * mwait/cpuidle sleep. + * Those will be put to proper (not interfering with hibernation + * resume) sleep afterwards, and the resumed kernel will decide itself + * what to do with them. */ + ret = cpuhp_smt_enable(); + if (ret) + return ret; smp_ops.play_dead = resume_play_dead; ret = disable_nonboot_cpus(); smp_ops.play_dead = play_dead; diff --git a/include/linux/cpu.h b/include/linux/cpu.h index 3813fe45effd..b5523552a607 100644 --- a/include/linux/cpu.h +++ b/include/linux/cpu.h @@ -201,10 +201,12 @@ enum cpuhp_smt_control { extern enum cpuhp_smt_control cpu_smt_control; extern void cpu_smt_disable(bool force); extern void cpu_smt_check_topology(void); +extern int cpuhp_smt_enable(void); #else # define cpu_smt_control (CPU_SMT_NOT_IMPLEMENTED) static inline void cpu_smt_disable(bool force) { } static inline void cpu_smt_check_topology(void) { } +static inline int cpuhp_smt_enable(void) { return 0; } #endif /* diff --git a/kernel/cpu.c b/kernel/cpu.c index f2ef10460698..3ff5ce0e4132 100644 --- a/kernel/cpu.c +++ b/kernel/cpu.c @@ -2093,7 +2093,7 @@ static int cpuhp_smt_disable(enum cpuhp_smt_control ctrlval) return ret; } -static int cpuhp_smt_enable(void) +int cpuhp_smt_enable(void) { int cpu, ret = 0; -- Jiri Kosina SUSE Labs