From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754577AbeAQXrY (ORCPT ); Wed, 17 Jan 2018 18:47:24 -0500 Received: from mail-by2nam03on0055.outbound.protection.outlook.com ([104.47.42.55]:19605 "EHLO NAM03-BY2-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1753514AbeAQXrW (ORCPT ); Wed, 17 Jan 2018 18:47:22 -0500 Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=Thomas.Lendacky@amd.com; Subject: Re: [PATCH] x86/mm: Rework wbinvd, hlt operation in stop_this_cpu() From: Tom Lendacky To: x86@kernel.org, linux-kernel@vger.kernel.org Cc: Juergen Gross , Tony Luck , Arjan van de Ven , Yu Chen , Baoquan He , Linus Torvalds , Ingo Molnar , kexec@lists.infradead.org, Rui Zhang , ebiederm@redhat.com, Borislav Petkov , "H. Peter Anvin" , Thomas Gleixner , Dave Young , Boris Ostrovsky , Dan Williams References: <20180117234141.21184.44067.stgit@tlendack-t1.amdoffice.net> Message-ID: <2a4c4e77-b27f-1537-515c-5ac7644c4768@amd.com> Date: Wed, 17 Jan 2018 17:47:11 -0600 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Thunderbird/52.5.2 MIME-Version: 1.0 In-Reply-To: <20180117234141.21184.44067.stgit@tlendack-t1.amdoffice.net> Content-Type: text/plain; charset=utf-8 Content-Language: en-US Content-Transfer-Encoding: 7bit X-Originating-IP: [165.204.78.1] X-ClientProxiedBy: BN6PR17CA0021.namprd17.prod.outlook.com (10.173.147.31) To MWHPR12MB1151.namprd12.prod.outlook.com (10.169.204.15) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 8fb86d28-e6e5-49b2-8b74-08d55e04a5a8 X-MS-Office365-Filtering-HT: Tenant X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(7020095)(4652020)(5600026)(4604075)(48565401081)(2017052603307)(7153060)(7193020);SRVR:MWHPR12MB1151; X-Microsoft-Exchange-Diagnostics: 1;MWHPR12MB1151;3:1n0NxTu4fKp9oqXN1w4lp+IIFOSQXIuLpKabMGeBQe/glOqUb3z5VqgLEvQl3bCzNBFKrNdsh8RQdKjXkPZJheJz2ec7JmMgxhAIN6XVU95uBi08CCWWL1trWh71ookKGVV1eaRFpouBBVYORR5lazB3Y2K2VJBbRwARAQYTEaHpe++G1Z4pklpHFLYaXPJovx+pLfwJ5oRkSuBab78YqZf7td8XcuRwCiWb/U/PAwEYjyRXyjuMS8FImTBxirPk;25:g7RvQH3qGrl1Lc162dJyFWITrYjX1Rg/hfuSbPjlE6rPpyrJe4bcaAsJvlKcIhRpKnEigk54LxPnSkrhDW00rJ1MyZtXZgwXkZvGzz/oANmtL34OKFkPQTiLTWy6ZhFVhfhVEVzQSuX1pKc5MAM8RHjyKJLi7qyeslnUzpUNNJzh0PNl+tUSRz/LmLjFi5XpaVkUvjn0rJf4Yq8p2OUSbKpmumtnSV5b9kncDwlWU723lmIT186WENh6Ufwagd8bTX3KLO8kIbJT2mvuffcrFuIfWAmgPZxh1FhRmPhyIa0sTum94AzffppmDgbhkXD+V+Emp/DGwYGRTiVD1XUp/A==;31:Ma+6EqZt7GwiQLJinWx3KI9rhVdV6UlpNdKeNPniBrSX97y58ndgNhCKlKOo4PJiwHhVqlxwqXnq0I0tMz8Kk1JHL+LNeZcC70juQOjDIlLf+8R/DbVsgAXFSGFJK55ysNSx1nUwU12GXvRWLR601jxJXHKJLj0f4QpInZ3GrepP8WkJJOjIUabNamyz9TW30AZ0uxrVFfscgEd+ASNjhfVt20lLu419VW3VjVuFT0E= X-MS-TrafficTypeDiagnostic: MWHPR12MB1151: X-Microsoft-Exchange-Diagnostics: 1;MWHPR12MB1151;20:VVyp2aWPc3coTtv80sLGh3CUxzd/kwH0b2F1OclLvuQDRr6KMoNSmfDVq2s4n2I2w1+WaoBcrbAXkM5SgftVyl2a+d9f/TRye3oGz0RJpaTZbGCy4nfcHGhFytxVQbF04AnjeXZ0BLv/FP30geCag0KBMTyKq5GMSnsAcGghtJjZ1tT0fT0A1SxId5FgyFA1uR6cVj3r2/ZbJQHHxy01GCWcAhTgzYEa7jXJ+BhophYZV2YDSAngBDWcJiJo1wpxgD6SXuQx7bVxiO60S2dgLvcxZGgu+gld8RWhl91ju2dyJwHek+rayzLZLcHxaxcvvnOF9ZKXHXGttMVKObIENmmSX4QEZcsMfLIhDqyf97Gar6mhy5wWrA7/qDsw8+MPIoA3CpoWTXUS1lZVJ2KK8CEBVIN/fFlY85dvkK0xrPo7Rt4vPwh5aW0qPcYv/V7OwNBiB7OoyJK98pRRw/Mz9paMRCE1/uvaknp7OlWVHSi1JD6uFoSkW6EUwI/DZkuf;4:JHYJ0egBd6R2aknxj8g/zL+hbuEAVZmwMqBinCWNIH1MLG6g5sB/rAIZzhmraWPYE0sFJbgXTyEI1EbfLFHs3PyMNMmjMLBf2eFgbzvgOviBFwwzgZD3RQYEiTmb9lA/6f5HC6uVM0bMO3XkVZ5aB10M2XMRoySJNZf7lRp93tTST/6IlMvC55qZ9itqEm55NSHdBE62PglYV/LssDfTK4/eimab27agLOuc1iOrDUh3kG8afOFJ8apV2I01Rw7zXZYsbZarvvFMQ05RR8GNZhz0DVZ+jP2k142MRgC77NC7DeQyv//jTVULYlxFs3EHYGQzPj1ik4pWibD6yVu5iw== X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(9452136761055)(767451399110); X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(6040470)(2401047)(5005006)(8121501046)(93006095)(93001095)(10201501046)(3231023)(2400053)(944501161)(3002001)(6055026)(6041268)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123564045)(20161123560045)(20161123558120)(20161123562045)(6072148)(201708071742011);SRVR:MWHPR12MB1151;BCL:0;PCL:0;RULEID:(100000803101)(100110400095);SRVR:MWHPR12MB1151; X-Forefront-PRVS: 0555EC8317 X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10009020)(6049001)(39860400002)(376002)(39380400002)(366004)(346002)(396003)(189003)(199004)(52116002)(53546011)(6116002)(3846002)(81156014)(81166006)(8936002)(7416002)(2906002)(8676002)(31696002)(68736007)(6486002)(230700001)(90366009)(77096007)(31686004)(83506002)(229853002)(36756003)(305945005)(58126008)(7736002)(4326008)(53936002)(316002)(6246003)(97736004)(50466002)(72206003)(26005)(3260700006)(54906003)(25786009)(16576012)(105586002)(386003)(16526018)(23676004)(52146003)(59450400001)(76176011)(2950100002)(65826007)(6666003)(2486003)(86362001)(478600001)(65956001)(64126003)(47776003)(65806001)(5660300001)(106356001)(66066001);DIR:OUT;SFP:1101;SCL:1;SRVR:MWHPR12MB1151;H:[10.236.65.116];FPR:;SPF:None;PTR:InfoNoRecords;MX:1;A:1;LANG:en; X-Microsoft-Exchange-Diagnostics: =?utf-8?B?MTtNV0hQUjEyTUIxMTUxOzIzOjJyM1NiTWdzeWVsTHJaNjdkNGwySFpuVlRk?= =?utf-8?B?N3NOVmFsb002Y0QzRjEzVC9wYnE1VFFBakZodzVDMUFpRlRZRDdvQ3pXUXZn?= =?utf-8?B?ZTk4T2x2SnVMVmRGeWZvSWw0dWFqOVNmWGJkSjdtRzRMcTZEcW16RjkvL2Fu?= =?utf-8?B?V2FPQnJxV0lOeEtEOVlLSWJhUTFYOU84cENUM05vdGpQK2d5dit0a05xOWU0?= =?utf-8?B?aHNvMjBUL09ycy9oWlRraDdZVEdnNXZrbXFGcG51VjR4cUJGR1hvRi9nVk9u?= =?utf-8?B?MDdJZmY3VnZnZlVQZHhDbUJ6aDZvRmMzQWdMb1k2S1lzTkdIWlFDdUxNZU5x?= =?utf-8?B?MXRHd2pOS09KSG1NemsyV3pINm5UdXdZOCsxd0R1RE90VkVYTWZ5WW8yQVQx?= =?utf-8?B?eU5uRGhWeFRqRy9ublpUK3pINXU2eGo0ZFBub3Nua2ZHSUhrVzByWkY0TXM3?= =?utf-8?B?QmdlSEFuY2RhQW1NbG52a0ZGbGFGYjVJcnV0YTU1MEgyRnYwcUpCZnRMMGdJ?= =?utf-8?B?YkN0di9hQmZzRnVXM1ljM1pVS3J3MVRkZXBTbDBHSzlwQnNhRldFQmdZbVVW?= =?utf-8?B?a0xmVGYxZjNXS3NSalpvTWtKeXhLdU5YRVpISUcwZUN5QUNHbDdNUHV1bWtY?= =?utf-8?B?REJPbWtSUmlFUUN4L2FYWUp0RXlIa0xiYkFUZnVEcUpsT1NVN21LZ1JWb3hZ?= =?utf-8?B?WGRjSEpvQTgvYVEzS3V3UVZ1aS9xQlhsYXlZb0RCbnNNVDRqMHBCNjh0b254?= =?utf-8?B?dVRmcjVtblNWVnFuVzZwWjVmWkpwc3FZaGc1TWdhblNUMlVmS3p4ZDk1eGRj?= =?utf-8?B?QVp4V3dTVTNBRCt3N21oK2xpT2VFTmZ0eXdrK2YwOGtqUXVyRzlRZHp5VzI2?= =?utf-8?B?R1N6bUw3THpyTUR5eEh3N3RaaEgyVkVjYlZFd2hzVDhyK3h6ODgyN1Axdi95?= =?utf-8?B?ZFJRUko5cGdwSE55Z01Rc3UvcGJ6TEYvcUNmdHFiUk4yUDJ0WHlBYXRrUll5?= =?utf-8?B?ZkZrVkhBT3pkNlJNcjhrYWtQTDZ5QWxabXdlRDR1eG9hbDRJc3dERDc2cWxS?= =?utf-8?B?MHJHb3lmUkQ3bllwVEQ3cXdndmg3WHVZOXNaaGtNdDRCVXlzbnRoYThZYlFP?= =?utf-8?B?STJKdGdwVWV3YVJlZEhzRzdmcElCWHVEN1E2QjVJRUFEWmFGcHlaMHRZQmF4?= =?utf-8?B?Wk1BbUlMY3AwZE5wbFlEYVM4NTNsalNWUHV2RkxlWWxJV1F6bktYYk9NQWJS?= =?utf-8?B?T0ZlTjV1UDk5OE5YRTNnbmxSV1NFNmZvV1llM2wzRk5mOVhYSE5jNkw4SU5l?= =?utf-8?B?dW9YaW9ldGwxNmZMOFBJRE0vUTJIODJpdlZhZFFNQmhNNU5aN0htMHJKOTBa?= =?utf-8?B?bUU4ZnkwTlY0S2RKaTdVdzA1Sit5MTZCckcybU9aZHVHR2FqaWxoNWdqWUlR?= =?utf-8?B?UHpaWEpGamdnMmhacnZVcTJYR1E0TmxTZWVHcGlndzJJRFQrN3NKNWtKc2NU?= =?utf-8?B?aVE5djk5eHVGelNWa3lKZDBVeUJDYjJJcUg3Q1Q0bkZ3L3lYKzQ5T3BnNTFJ?= =?utf-8?B?RDdPSmJXZ2k5NjZxL2MxcFhOSnpTNlhEcjUxaTlkOTY0ZVpGY3dDS3hLM2xK?= =?utf-8?B?Sm1WMTNza1Zmd28xRDYxYXdqTXlRTFEzbnN3WUJYbERTTjFzcmRsZHM3YVVt?= =?utf-8?B?L0lHN2RBSGdPRWRZS3lWWVRTSkxpMk1TTC80ZFd4cVRuU25qK3ZoYjhJYk00?= =?utf-8?B?Z1k1MW9acDhoWkxNWXJ3Z3ErYm5vY2FUeDJ3UzI0YzBJUFNYdUVnUXRYSVFU?= =?utf-8?B?RlhLYlhXN3NDVzFZaXVBUHFUMGVId2JCMmYyS3VmTFV1Q0kxVkk4b2V2OERv?= =?utf-8?B?OW1HekJMQ1M4SW4vaG1ZSDI4WFg1dVVlaklGQnRESTNZSCs3K1FZYngrV2NQ?= =?utf-8?B?S05LYWVWajNWVkdlMVhyb3prRU1pY1ZWMHRpVENqcFBGdG8vMU45OFMyUzVt?= =?utf-8?Q?Cwf+JX?= X-Microsoft-Exchange-Diagnostics: 1;MWHPR12MB1151;6:JFnNvoBVV7cjhjWeAstcy4JPvDxFySc1QvyQz1x33cG8U562P3/XOvqIXBVTKrTgwzHQmE3TFxUp/5l553CAEk/DtfnaDG+QA1hQzEJNz8xKfs9h7S7LNFM9as04/I+IXUovbQWs3Z52vhHO+Q1Ik+2EBEfobIyIv9K+4T+h5ltGtz6c8TDdOvFDctPrn22PAwgX0sfeJVoWr6t2KVrjqU4koi+Ff+6HdWhOtETdSj3vKdAJ9CvtaDLS2ja6cea5kbbjvtW7jlG6ct5QLmSc0HrXz1Yd/d7/bTMLAg+HMUufXX15KKv1QWGWP2bPRkoMCOPa9FFIuyF+tUjoAR5uQU0zh87aVddffy/8WdlCwGc=;5:Vyo6JeYCbNt7/1jUgax1p4XMnalONShJhnFDpzBkseB/qbrLCvdKbEPPY6nu2n7uhMGNpbOK8QAb5zV1JUEpOQ13erelRZlYQ5IWVk1F1st+m3Kz0gvjNo4s0weEcQUNJ0bKogkMm1joBGMWUnC+sjCFw6PxOdPptf34J9z/WaI=;24:JuX1JiMpHYTCX1zD/n9jAThR0jYe9ETIVqHD8kiInGSNqCX9CrXW0b7uDbuxhU5X+PyIvzM2e97MKbDf5kAJkx2astKmA0PO36SfLkESc3M=;7:LPPzaJCO1i5tYKNFRREzRAGnN5SHoxgwRi3XZp+17DIPrIolmU2QQvAFAX493dBEDRS8y+Nm50jvybmruPWOvKDdKmhAuTQYVagLsO7zXo4oOQIIvgOY+k0UMtpQWlL4Cd3gytwqVjrK4Witco9ke5LqSVUY5Ku3pelcpYHky5Y/aJBKaTr+nIczxD2ubBuj2320QmjHB9j0+qvRn+FGV73qST7w/YnNwyLiYiSPR4Ao5yLLyF+st4zuhdIU9NQc SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;MWHPR12MB1151;20:H7vb4ROUNehl/vIsPvgz01IjWfSEAf3qLltUhlEs4r0CD2J5bWzPfd1R05WTSGjXvYFXaSlV5FV34JQxgkzKTxA5ebPFweL4z1B4FWJwtMuOpTNCOzclSt4fOYzarBEok23p5iqGTXLLMnYc33JyW4id/ml3CkFQBxRSWRl65BCsLT8Pze8L77JmC7ewzxsGO2JVuvy5Fp1jYI715W4OhxT73n7M0nIM5WR5mkQydKhXY89FpnrjPwStf8fdrll4 X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 17 Jan 2018 23:47:16.6990 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 8fb86d28-e6e5-49b2-8b74-08d55e04a5a8 X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-Transport-CrossTenantHeadersStamped: MWHPR12MB1151 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 1/17/2018 5:41 PM, Tom Lendacky wrote: > Some issues have been reported with the for loop in stop_this_cpu() that > issues the 'wbinvd; hlt' sequence. Reverting this sequence to halt() > has been shown to resolve the issue. > > However, the wbinvd is needed when running with SME. The reason for the > wbinvd is to prevent cache flush races between encrypted and non-encrypted > entries that have the same physical address. This can occur when > kexec'ing from memory encryption active to inactive or vice-versa. The > important thing is to not have outside of kernel text memory references > (such as stack usage), so the usage of the native_*() functions is needed > since these expand as inline asm sequences. So instead of reverting the > change, rework the sequence. > > Move the wbinvd instruction outside of the for loop as native_wbinvd() > and make its execution conditional on X86_FEATURE_SME. In the for loop, > change the asm 'wbinvd; hlt' sequence back to a halt sequence but use > the native_halt() call. > > Cc: # 4.14.x > Fixes: bba4ed011a52 ("x86/mm, kexec: Allow kexec to be used with SME") > Reported-by: Dave Young Dave, Can you test this and see if it resolves your issue? Thanks, Tom > Signed-off-by: Tom Lendacky > --- > arch/x86/kernel/process.c | 25 +++++++++++++++---------- > 1 file changed, 15 insertions(+), 10 deletions(-) > > diff --git a/arch/x86/kernel/process.c b/arch/x86/kernel/process.c > index 63711fe..03408b9 100644 > --- a/arch/x86/kernel/process.c > +++ b/arch/x86/kernel/process.c > @@ -379,19 +379,24 @@ void stop_this_cpu(void *dummy) > disable_local_APIC(); > mcheck_cpu_clear(this_cpu_ptr(&cpu_info)); > > + /* > + * Use wbinvd on processors that support SME. This provides support > + * for performing a successful kexec when going from SME inactive > + * to SME active (or vice-versa). The cache must be cleared so that > + * if there are entries with the same physical address, both with and > + * without the encryption bit, they don't race each other when flushed > + * and potentially end up with the wrong entry being committed to > + * memory. > + */ > + if (boot_cpu_has(X86_FEATURE_SME)) > + native_wbinvd(); > for (;;) { > /* > - * Use wbinvd followed by hlt to stop the processor. This > - * provides support for kexec on a processor that supports > - * SME. With kexec, going from SME inactive to SME active > - * requires clearing cache entries so that addresses without > - * the encryption bit set don't corrupt the same physical > - * address that has the encryption bit set when caches are > - * flushed. To achieve this a wbinvd is performed followed by > - * a hlt. Even if the processor is not in the kexec/SME > - * scenario this only adds a wbinvd to a halting processor. > + * Use native_halt() so that memory contents don't change > + * (stack usage and variables) after possibly issuing the > + * native_wbinvd() above. > */ > - asm volatile("wbinvd; hlt" : : : "memory"); > + native_halt(); > } > } > >