From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752285AbdI2OMz (ORCPT ); Fri, 29 Sep 2017 10:12:55 -0400 Received: from mail-eopbgr00099.outbound.protection.outlook.com ([40.107.0.99]:3536 "EHLO EUR02-AM5-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751346AbdI2OMx (ORCPT ); Fri, 29 Sep 2017 10:12:53 -0400 Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=aryabinin@virtuozzo.com; From: Andrey Ryabinin To: Thomas Gleixner , Ingo Molnar , "H. Peter Anvin" , x86@kernel.org Cc: Josh Poimboeuf , Peter Zijlstra , Andy Lutomirski , Linus Torvalds , linux-kernel@vger.kernel.org, Andrey Ryabinin Subject: [PATCH] x86: use register variable to get stack pointer value Date: Fri, 29 Sep 2017 17:15:36 +0300 Message-Id: <20170929141537.29167-1-aryabinin@virtuozzo.com> X-Mailer: git-send-email 2.13.6 MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [195.214.232.6] X-ClientProxiedBy: DB6PR1001CA0044.EURPRD10.PROD.OUTLOOK.COM (2603:10a6:4:55::30) To AM4PR08MB2819.eurprd08.prod.outlook.com (2603:10a6:205:d::25) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 514cc5ab-7abf-4e27-ef72-08d507442b0a X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(22001)(2017030254152)(2017052603199)(201703131423075)(201703031133081)(201702281549075);SRVR:AM4PR08MB2819; X-Microsoft-Exchange-Diagnostics: 1;AM4PR08MB2819;3:l7siph0Grn6BJvPdFomNmspW4Xbp2314zlRv+KJ7TEI7XvCr5xXo6md8/Sz/HBoanXo1OW6fE2AI0dBgk1bszIolpyXBtIXVS6p5Ol2YdboZM0oN6/HG9PptgoE3tDu8DZOkBWg5roIZ9gzwGmjvrHRFT8875Z9KqN+GvahaR8SL20OZPXs2TQYvaHxEksu9t+yQSErZ+KvPD2bATVuA1/hhzhDX0yPMNcTabcRhfLv0k6IPRy+zGh9eMMPMjLFj;25:Iuefa0UhaAC2+h8oy9h3HQWyz0HE1dkjRclZcxnBJBmzaXlzkgQEQNSmmmHfs+3cT6S4A5ZMxHNun2FbL9IuYuky7ww2BGlp/wDH2ubevn4jcOnZ8PDKi24JRaeRTW9VBR8JU8dhiQr8Mb/avd0168UyqxlTMm9GYfIEaESTy8O3xm3fdMLmv1hDMd8TEskYVXXhcwmLITnHCNJbBmhl7MihoGnJ+J9SlpkIoEOSlpGlt3KCjvXkIpNpIOLys5ilwypm7T6U9HgbpohYDoHfO+ak+QNfS9CuV97hpupVtbnn3tI7e/iJYw/x5pgw5yd1UjEOj7yzrKsyHPoeZskAJw==;31:u4qhYGi/+A17M+Nf6UASUfd3XBVRrlTslidDXqaf2/gUGDQY1FbMgVb+fBWGORuch/pO1anr7dfdAx8I8jQkmEJqypGLoTp4WvTjNC650cMxqpraJ/0WU0XEX4MGFw6dezOtapYByb/E8aQZ/qf7/NyRwkO90cvGHFudl64dQgtrSvzEIZklrivLZLtU5NOVzMEVLKIwAX4hi9FTBLsHuF8kZjxy1dJqPIvPPuYepO4= X-MS-TrafficTypeDiagnostic: AM4PR08MB2819: X-Microsoft-Exchange-Diagnostics: 1;AM4PR08MB2819;20:XKQOmLDSSX+L/d66peLKiKAGoOkM5a0dUOw4GVhPP7O1BDrUdwasdT2tAkOOv/78x63k3DjMMPXbRiDshKhG1hoAR+4y37+3t6giXb9NKRA+EsK6+yPtjJ/AeUfuUvy+Scqv5uhXuxlKuIlzev2lF4zPMb8LPonSkCdSMEZw3MtxDRpfgTs1TMJZrkLbal1TxYPv0nDstPxQpi/4v6LGm73cUmZBXc9btHrhBjVwb6YkYEUx+v28PJPf17q0TarpUiBq8UOhK9bhHP5g5xx9VckCLw8IAABphz6iwSNa0YjtQXvlfJ/7PqMPUnvz+4I2DqX6nz0jjXEgqcEfpRxqFckCppJdxdDR7bKZpDdNPNoBvVcrt1bf49EevJmqFZRD6Ix8KpsPNuwEChrsUTzFW+lYTA3e4BdX3cL+VEYJf1M=;4:ZyrWIuTCaGvFfxfXgqTYMyRBYswuWR0hA+0VBHJhTpQAK++GbR5+FfwwDZjPGeTM/P7hsx5nhq5MWF+Jy0YurVQtCOA9S+nGPxNS4GWFscufvxAl3n6bBEej/Rg3mNa8QXc4DcOfg/98YF2kbPIKfUoiH4Y/dDsyZL7XlAHKCpVisN2HKzI+4tKgQc2+KucRRLDReLY4Q/HZ54w4ePXcCQ0uAk3bIVyVK/1Qa4g1SvHElsahKeyDOnvyVWwenr0c X-Exchange-Antispam-Report-Test: UriScan:; X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(100000700101)(100105000095)(100000701101)(100105300095)(100000702101)(100105100095)(6040450)(2401047)(8121501046)(5005006)(100000703101)(100105400095)(3002001)(10201501046)(93006095)(93001095)(6041248)(20161123560025)(20161123564025)(20161123555025)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(20161123558100)(20161123562025)(6072148)(201708071742011)(100000704101)(100105200095)(100000705101)(100105500095);SRVR:AM4PR08MB2819;BCL:0;PCL:0;RULEID:(100000800101)(100110000095)(100000801101)(100110300095)(100000802101)(100110100095)(100000803101)(100110400095)(100000804101)(100110200095)(100000805101)(100110500095);SRVR:AM4PR08MB2819; X-Forefront-PRVS: 0445A82F82 X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10019020)(6009001)(6069001)(346002)(39830400002)(376002)(199003)(189002)(105586002)(48376002)(106356001)(6666003)(33646002)(189998001)(3846002)(16526017)(16586007)(110136005)(6116002)(5660300001)(50226002)(4326008)(5003940100001)(107886003)(66066001)(50466002)(47776003)(68736007)(1076002)(101416001)(25786009)(7736002)(2906002)(81166006)(50986999)(81156014)(305945005)(8676002)(53936002)(69596002)(54906003)(8936002)(6512007)(36756003)(6486002)(53416004)(76506005)(316002)(6506006)(478600001)(86362001)(575784001)(97736004);DIR:OUT;SFP:1102;SCL:1;SRVR:AM4PR08MB2819;H:localhost.sw.ru;FPR:;SPF:None;PTR:InfoNoRecords;A:1;MX:1;LANG:en; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;AM4PR08MB2819;23:RvFZEg5IGQE+qc6y/Re5ityWx/8OrWQ6fIIyJPKLO?= =?us-ascii?Q?xWx0e/nLouqd/1FxPQfxg1nrnaZ/UsDbpcSpTf6/t4pwqkHQuc2xCawrTN8V?= =?us-ascii?Q?Ahm0z9lFwG/6EE3dPCzklC6hX6+OyDuKPpCbyF+SQpOnGc5+PlFF/gMz0EgM?= =?us-ascii?Q?WnK8R/Au5Ep/dz8gGv44hWb9g6VuskipsPOnJuotwxP7orb3NdBL3aALKInJ?= =?us-ascii?Q?lyr6yGCTilijGdQT8ZDaJRYaiGdiMUwXLg7bUY+OZ2+WkqZeU4Bz7+tJo+V1?= =?us-ascii?Q?ZInV9F9AOmWsnnq32UDN76yEIq1wfqvT0tlJSZeVQZljAt7xw6yKLTZy5gZ9?= =?us-ascii?Q?FiSB6Sn+71G+MeoNz52xMzZLUikPdgTl+B6uW2ZeUAVIchrg5Qpfba3lB4ol?= =?us-ascii?Q?apO3NsJvj6qPm9nkayd6xRI1M9Sl/0XggreoXV0NaVW177H1KwcYfVNJHCJg?= =?us-ascii?Q?SXioWApIHpO2U4KpZKyFb4flQZDPZK1cSuCd1vUcsyM1wCKG43LDcNZqKQRD?= =?us-ascii?Q?XKJToq153N/dghpnF9e3Hv8LojnPdAFPb8ZnNoYBk1QikE7/TAv6ohI28Eok?= =?us-ascii?Q?SPGIm7AV29qhbYhWwKLzvIy8+RcQOd9q7RtXtCu/K0M4WrpKQeit5SAkpTgL?= =?us-ascii?Q?i9PIp6oWyZxw73B3l/mBvk8foHRLv2Su51+r2W/taHUPuiQ6bz2dfOAW9abm?= =?us-ascii?Q?7+dgO+Y8NAy8RHHC+BX2hVpekp3z1UsXez2Vf4/mvyF7MwUteIjmBQLOyEJ9?= =?us-ascii?Q?qn3bp+Q1c9y3GlhRnCpQNK2yeeWLoAi7ESQBArhCLD/jY2SsDGf4/GjfTGR3?= =?us-ascii?Q?qaGTeO3HKU0x40czi565XAPRph7VWhIVX5EL27RHCz0TsUXPnlwJdg3K7rXK?= =?us-ascii?Q?NrNEDVHQzf2CCJkUpDTRmi4NW9fAnZk5dCOC7lT90OdzrIacHY0u09ubNOJq?= =?us-ascii?Q?BIwMS3nlNCWzQyiVDMxzmf/6Zhy195mqZyrWqoKKtbFkp03jmB1kd62PCKMV?= =?us-ascii?Q?3A3/XEn9qy0Hv/ORsIs3XjmXkhYhbrH2nSNtHBxDSJnGxU6tp2glW1TFvRrg?= =?us-ascii?Q?7rxbVjosAI0GKykOIJHWw72UqLbvy1LlEduP0U+Ek/MTY1Lvqn0NfOHYTzxI?= =?us-ascii?Q?VJWLMSoUrlA8n6LUIqimefxexqNd797qKx235u6+95U9ayBkVfRXNvn6l+g4?= =?us-ascii?Q?gw54IkeldrMy2BCqedQgLhG54w8e2WkxtYU?= X-Microsoft-Exchange-Diagnostics: 1;AM4PR08MB2819;6:GX1JS79UZDUJj36LkBxOXR98D1qKHSLYLFC/7jbCsSKchwGPgokvRUjJy1smOG6LSiSFBMgaWRekQwGh08B7ilM+GUKqyWenBU0RaDiHd2Ajcm/N7ylVf/uag46WyNgxIymn+cmArcWyDDskY5sn9AS94x4hb862xe3QlnM/5PTMiSGbTK96D051b9/GmDtBRGezz+JJHvM0AxIUQzdzNH14emFrLGqDzY5IUDGSoelauGBW8l7qbK+dYmHwt7bYa0KvppvA1vF4TI3s4MLMrrzDBTYp6uQvAwnIeElu1HlcQeZszdUqRZ8mP3/lrgD5VcCzPZJuyPgeV2qVr3b8Pw==;5:szlTaEEogJff1F8ft/2fMWXxAnRi9Eb/NBE8dmM40jlBGrZ8ezdJpDzjdX7GppvgQM1JgNmelVYSEclIyNkAWxAi9PZYyrYlIAUsk3eV/B9AFtT6T9Mc0VrhRM0bUrfWWkDQ3Ll/oZ5l/nrGOXoqhETpZnRZnChkIJL1zA3vnpk=;24:kLR+moczLLv5HModBJQLtQzVjNFfLgwdts6T6w/KZHDDVzS9u2dXNTbPW0j3gaxMTEf3q2GGOh4d7DdooB9rlWI8YTBPeIZ2UtSFRJbBdXQ=;7:bgIwSYtLC0m3brzK2rPrYdQCWieoo8zyYIDV7aVnW5I0vTh4F3eWVEZWUVabDFf+F2THuXKoGFxDAo/yzgSNHopNI1reOc3ibmLlFBOdxqLMZA4+y8HUQ5I2rZ3KTmBMCqvaWmCWY13L+/AtUc53pR4cUSuBc2znHqrzyZMg0W1iV5LTOEfBc/JUPwae2mxFrJR4gPEGq0OYB0IFGIFP4n62BjET1Mky2qTbtGUVvEY= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;AM4PR08MB2819;20:hj5ZX77psC5AvJ6OVNRfMoLwcu4mVK9UEZIXVhNCfBVP8EBMI7uCezuaBcA90lzpqCBNrSyaLRfcDEeFMV/7A4813kdhqDfpGiIcYK2r4UUJnp2MEipZPZHCjpxcCjqAGCGtVnHUQqTLxswYBs8XXtr08IJwdg/inTe7NbsacnU= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 29 Sep 2017 14:12:49.3944 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 0bc7f26d-0264-416e-a6fc-8352af79c58f X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM4PR08MB2819 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Currently we use current_stack_pointer() function to get the value of the stack pointer register. Since commit f5caf621ee35 ("x86/asm: Fix inline asm call constraints for Clang") we have stack register variable declared. It can be used instead of current_stack_pointer() function which allows to optimize away some excessive "mov %rsp, %" instructions: -mov %rsp,%rdx -sub %rdx,%rax -cmp $0x3fff,%rax -ja ffffffff810722fd +sub %rsp,%rax +cmp $0x3fff,%rax +ja ffffffff810722fa Remove current_stack_pointer(), rename __asm_call_sp to current_stack_pointer and use it instead of removed function. Signed-off-by: Andrey Ryabinin --- arch/x86/include/asm/asm.h | 4 ++-- arch/x86/include/asm/thread_info.h | 11 ----------- arch/x86/kernel/irq_32.c | 6 +++--- arch/x86/kernel/traps.c | 2 +- arch/x86/mm/tlb.c | 2 +- 5 files changed, 7 insertions(+), 18 deletions(-) diff --git a/arch/x86/include/asm/asm.h b/arch/x86/include/asm/asm.h index 30c3c9ac784a..b0dc91f4bedc 100644 --- a/arch/x86/include/asm/asm.h +++ b/arch/x86/include/asm/asm.h @@ -141,8 +141,8 @@ * gets set up by the containing function. If you forget to do this, objtool * may print a "call without frame pointer save/setup" warning. */ -register unsigned long __asm_call_sp asm(_ASM_SP); -#define ASM_CALL_CONSTRAINT "+r" (__asm_call_sp) +register unsigned long current_stack_pointer asm(_ASM_SP); +#define ASM_CALL_CONSTRAINT "+r" (current_stack_pointer) #endif #endif /* _ASM_X86_ASM_H */ diff --git a/arch/x86/include/asm/thread_info.h b/arch/x86/include/asm/thread_info.h index 5161da1a0fa0..89e7eeb5cec1 100644 --- a/arch/x86/include/asm/thread_info.h +++ b/arch/x86/include/asm/thread_info.h @@ -158,17 +158,6 @@ struct thread_info { */ #ifndef __ASSEMBLY__ -static inline unsigned long current_stack_pointer(void) -{ - unsigned long sp; -#ifdef CONFIG_X86_64 - asm("mov %%rsp,%0" : "=g" (sp)); -#else - asm("mov %%esp,%0" : "=g" (sp)); -#endif - return sp; -} - /* * Walks up the stack frames to make sure that the specified object is * entirely contained by a single stack frame. diff --git a/arch/x86/kernel/irq_32.c b/arch/x86/kernel/irq_32.c index 1f38d9a4d9de..d4eb450144fd 100644 --- a/arch/x86/kernel/irq_32.c +++ b/arch/x86/kernel/irq_32.c @@ -64,7 +64,7 @@ static void call_on_stack(void *func, void *stack) static inline void *current_stack(void) { - return (void *)(current_stack_pointer() & ~(THREAD_SIZE - 1)); + return (void *)(current_stack_pointer & ~(THREAD_SIZE - 1)); } static inline int execute_on_irq_stack(int overflow, struct irq_desc *desc) @@ -88,7 +88,7 @@ static inline int execute_on_irq_stack(int overflow, struct irq_desc *desc) /* Save the next esp at the bottom of the stack */ prev_esp = (u32 *)irqstk; - *prev_esp = current_stack_pointer(); + *prev_esp = current_stack_pointer; if (unlikely(overflow)) call_on_stack(print_stack_overflow, isp); @@ -139,7 +139,7 @@ void do_softirq_own_stack(void) /* Push the previous esp onto the stack */ prev_esp = (u32 *)irqstk; - *prev_esp = current_stack_pointer(); + *prev_esp = current_stack_pointer; call_on_stack(__do_softirq, isp); } diff --git a/arch/x86/kernel/traps.c b/arch/x86/kernel/traps.c index 34ea3651362e..67db4f43309e 100644 --- a/arch/x86/kernel/traps.c +++ b/arch/x86/kernel/traps.c @@ -142,7 +142,7 @@ void ist_begin_non_atomic(struct pt_regs *regs) * from double_fault. */ BUG_ON((unsigned long)(current_top_of_stack() - - current_stack_pointer()) >= THREAD_SIZE); + current_stack_pointer) >= THREAD_SIZE); preempt_enable_no_resched(); } diff --git a/arch/x86/mm/tlb.c b/arch/x86/mm/tlb.c index 93fe97cce581..49d9778376d7 100644 --- a/arch/x86/mm/tlb.c +++ b/arch/x86/mm/tlb.c @@ -191,7 +191,7 @@ void switch_mm_irqs_off(struct mm_struct *prev, struct mm_struct *next, * mapped in the new pgd, we'll double-fault. Forcibly * map it. */ - unsigned int index = pgd_index(current_stack_pointer()); + unsigned int index = pgd_index(current_stack_pointer); pgd_t *pgd = next->pgd + index; if (unlikely(pgd_none(*pgd))) -- 2.13.6