From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751807AbdBOOF7 (ORCPT ); Wed, 15 Feb 2017 09:05:59 -0500 Received: from mail-eopbgr10099.outbound.protection.outlook.com ([40.107.1.99]:15000 "EHLO EUR02-HE1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751747AbdBOOF4 (ORCPT ); Wed, 15 Feb 2017 09:05:56 -0500 Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=aryabinin@virtuozzo.com; Subject: Re: [RFC] kasan stack overflow warnings again: READ_ONCE(), typecheck() To: Arnd Bergmann , Dmitry Vyukov References: <1745339.Zp71hEDpdI@wuerfel> CC: "kasan-dev@googlegroups.com" , Alexander Potapenko , , Christian Borntraeger From: Andrey Ryabinin Message-ID: <36862803-f365-6ab4-198e-e858f41ee914@virtuozzo.com> Date: Wed, 15 Feb 2017 17:06:53 +0300 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.7.0 MIME-Version: 1.0 In-Reply-To: <1745339.Zp71hEDpdI@wuerfel> Content-Type: text/plain; charset="windows-1252" Content-Transfer-Encoding: 7bit X-Originating-IP: [195.214.232.6] X-ClientProxiedBy: AM4PR01CA0036.eurprd01.prod.exchangelabs.com (10.164.74.174) To VI1PR0801MB2064.eurprd08.prod.outlook.com (10.173.74.149) X-MS-Office365-Filtering-Correlation-Id: 8d3b8f04-0e01-4e6a-0e7d-08d455abc088 X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(22001);SRVR:VI1PR0801MB2064; X-Microsoft-Exchange-Diagnostics: 1;VI1PR0801MB2064;3:cc0FQDEV4ZTLMtB4QaC4exI8D7sOmmFwex6pQ7vBVBh73gGmW3gHJtn1KYAIwPTa5YeIy0FSwtva58I0isBi39Z8VkudGMa81G60WMGb07BWHJ8Uy9oK4pG9Vuly8eHeRcqPCTIQrhiZU2+9YrNilDFFYXAVwzQlphFLQJ9Nlge0s29phsomklHdWgV0nvRPkqLCCoFTfVpy530HTEURVdavhKQBzwtUjjSM0e/8cPVvMqLxOrlhi6oAzGFMYHsS9XmBHhcS2UD+4WkQH2tVDg==;25:iV1sja05Wt2uvu48FkjZfsrjFTwlUfTRbm/xn3FZ4TE9FYhL9IkhTyizd517snOzlshEGGdIpS2e8uUBSI5dJctf/SpqaQgIIzwq+M9WbapVfN05BCru7e6n+O41qbE8CE7asSyxCYbhw1auv8Avfts6/pcZLG+au7g+iOnCYN/57hEP2EsuSY6cAgKk8uHX6yID5DD9YIOLpijYOOB4QDhdfMry+xCknTo3JKmfexSgXRhMaX3DhSfz/yrLEItOAN7eE/zucCiLjsOXr/+V2Ty6yZVuEzPn0l4DM8Xk5BA/EPwlbaCh4SAVmBkovUD6IPo7Z2bNYItzlpfc0xbLrl8dypM13is2547yuNU8aQQbMiVGQtxK/OxyL1gW05e2d/HRY/h6CX8VmjPT+2+v+UKiU5Q+dGqQIIDQMy4EQTKVOg1Ya3+JUrc+lVKREFQfLSD3/pt+W/cxKFa6He5MsA== X-Microsoft-Exchange-Diagnostics: 1;VI1PR0801MB2064;31:fXJsR4bhk1s0NDe98aY9mcHau0nRAlnHxZ9V4NSkOjDNPtIsOA1sW1JPUWTlDW7j8ozP8EFn5/FeNPWsiRxrbBqB5wOW0aAh7KYr/WRfZO3cTRLzNLlN+sNB5CeClI2IxctGPgSclAlNol+tLsHAEpzKgLC0Gdzxfb3lAkzIe5PRtgxCRQEGBYoH67HEbSZ3ucxhWSOVkbjxO4W9Efq6xZJeJIviJXlUo9tdIHdyHcrshpN1xqdbpPjTIvWPmKI/c4C4qbD/zgemXvtJoT2oWw==;20:De4wh/KINiIzGSjzqmGvpBNKe5xB7R9hCaFaNG8svW0mmDWLH+0Nr4q/JhQesSSExTPPlJIrN11tTCO3hQFSYAuNS5TlKHlgVS4UMLa82OBay5V2wrGVVyMprD13KIPL7fbFPYfE4pFrPxNVIHeJAksW5/kc7KBwZJoQs8CRh2S8u7R3vkgIB2O9rJ/BN+1cJSEKoGuddt/o9TM9XTzE/Odh4TlN8TKra570afH29lcLS9J3M2RDZgWjiSnKzY/ZR9P/SIhJ/1vGfwkHveb6oks/jixkSluXV1SruywRmFzKEKdvLTwJJoJgMrUXTq0FiIQlDCZS4H3T1rfH4m7IpoS7RZ6CdUSEmmHmF09VOxsGhXhosfw0JVuC1NQWRCl6R8Xay2c8NrJOaN+Bbk0V4YxDzVriqsA3nU1YjqLSSsg= X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(6040375)(601004)(2401047)(8121501046)(5005006)(10201501046)(3002001)(6041248)(20161123560025)(20161123564025)(20161123555025)(20161123562025)(20161123558025)(6072148);SRVR:VI1PR0801MB2064;BCL:0;PCL:0;RULEID:;SRVR:VI1PR0801MB2064; X-Microsoft-Exchange-Diagnostics: 1;VI1PR0801MB2064;4:T2I8QIiv3ICAJguziZyz9gasr5ywO/1F8TjNv+0CRiszqu9sdzoAJfyNKm2EWy4h+lR+dDAqkHHGozAAy4z6TaOZnWGvxRP+nnItzUEn7SLAtmIEjySv/PLOTurQ1n+fXnhSunV1qy1s1xaXA3/1crugkWEXYeOVoJmBwRBmmw5G1b6AoZ74f0e0HkDEVFLbuYrl6GL9zdHB3x5cIb2U7rg4tUwvsTRF463QbGuq8TZHTAnLYv2aCWbPfi1xzjduTJZBPkK6c5V9a78+2fCLHgt0WEe7wusQTjQIFzeD1Pq7EE1592Z2w91G2LNfRz8FV2S/WnVwVkRyBvz23IZgOpRPwQ7wA95zeccyr0SIDQP4qTlilUL6L4Lk8QyhTXzi8fasQrF2Q8X8bmhWQN4nfzM4NqGeAOqb4eWv1h154RnjCmuF1DWjHxiWhchy3Yc3HnEqARljFgOrAJwy/doY/x7UNowUjVGOBtADSTS+FZgfjjlB2G+2OTnM032ebiXYJUTuZ3kCrBknIBH3iSbKJbo0DK0wzPGym9LaXlqS6YnQ35aQTIIbEduzbvI3phXzLuIswFwoZHqsnCsqL06bQBeCsQpJUxbtLGidaKFDHrg= X-Forefront-PRVS: 021975AE46 X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10019020)(4630300001)(6049001)(6009001)(7916002)(39830400002)(39450400003)(39410400002)(189002)(377454003)(43544003)(199003)(24454002)(47776003)(6246003)(36756003)(92566002)(31696002)(53546003)(54906002)(5660300001)(101416001)(86362001)(6486002)(189998001)(81166006)(389900002)(305945005)(81156014)(8676002)(66066001)(77096006)(7736002)(25786008)(65956001)(90366009)(65806001)(229853002)(2906002)(68736007)(33646002)(4001350100001)(4326007)(50466002)(230700001)(6116002)(42186005)(31686004)(65826007)(83506001)(3846002)(97736004)(23746002)(105586002)(38730400002)(76176999)(106356001)(54356999)(53936002)(50986999)(64126003)(2950100002);DIR:OUT;SFP:1102;SCL:1;SRVR:VI1PR0801MB2064;H:[172.16.25.12];FPR:;SPF:None;PTR:InfoNoRecords;MX:1;A:1;LANG:en; X-Microsoft-Exchange-Diagnostics: =?Windows-1252?Q?1;VI1PR0801MB2064;23:b/qW07llto74VSLVH7hJfbAeF/JfWT6CZ/o?= =?Windows-1252?Q?ix6yb+zsl0y/Hed2MwY50qWmInhwtlMzfSrCWTGxIKkIuC1IDKEMS+2f?= =?Windows-1252?Q?5YvczeJ0ZCqEXW3xR78xSbqp1VJ3pWPgKzjHpaiO4x8n1N7HperErPvX?= =?Windows-1252?Q?a/3wNnxvJctQKY1SncMe7NOjIL/6LCoSPb/sdx7iQQdHwqf2VxT2Iy6v?= =?Windows-1252?Q?IEllTRwZg2dyQ/GAn3w7mAROUZ3ywFz28YFk84ItEqXkgyDaxaalxULE?= =?Windows-1252?Q?99aPGXkL4Tas80PxbWY805uvirEwKJ37LZ2g0kCtKpGib3Rrn4ZzG9at?= =?Windows-1252?Q?D79XXFJ/kRZpoY7aRWB2+8gSOsRF8cPvKQAs54mEZERk6uuSjHv7IIwp?= =?Windows-1252?Q?3AjHQoD78fv9qsSQt+YxK1MJ1Ka4zKLXkmluTP+4a/Zki9CIRjez588o?= =?Windows-1252?Q?RCNEQ9NTbUMYfuB1na6Nk6v6ncDU3LbTOIDHk2Jg76w9i8OOM0uu1jel?= =?Windows-1252?Q?GWhJpRmHAV7TEHEqVryclbx7/JrN9Hv+vTrnaCO0REGSJ2nEl5PlliJ7?= =?Windows-1252?Q?niXEIL7Leq40bE/J3gI0k8zry+QODiW/Nw8Dxa/g/1uDC7hKbECMOKiF?= =?Windows-1252?Q?mOnG5cfjCuxgSeiZUFh28EWKo0GOap/0LaKCrujVvnKVVAyeuaslTTdJ?= =?Windows-1252?Q?DfyRDwN+Le/kbg4Jo7In1Y8Pit/YfL8gjHco3XuE1pV5DRraCxNkhdtp?= =?Windows-1252?Q?922V+jx+GDiInUhO7uJA0Iit/fTjVnLUB7p3Z3QgJwjntKZPJQwtIHGw?= =?Windows-1252?Q?/pX1NVvRSJQo6p0fUdMVW2ErdV36C8saaZvbwVcipd8M+kX+EjRukhHF?= =?Windows-1252?Q?tTvePwVP0yh0ytrvx5CUrKwPqDUPy3Gg3spfRg/9eAlLokOird6c5fZh?= =?Windows-1252?Q?s5ZZ04IjScpmWiAw8IFhyxUhlAUPegbkOQzg0cp/XeEmQNbWFjt/fvkN?= =?Windows-1252?Q?Agob8vPF635g1qK7IQuC4OMMuHqRnQjyQjetrJ6W0lyHBX3ueMODQ0kd?= =?Windows-1252?Q?m8GWHUZWj1K1Io7DkeOHj4tOGRHppXP8GceqCgI4cDdn6dIHno8FTKhq?= =?Windows-1252?Q?hDg1bOWJmXBr+DNdafyG0h9uUoAea3BhHOGFWaG/Klq3CuRfIj6NoLi+?= =?Windows-1252?Q?WFuTVuGirv7ePWidtFodE5XC6USoT0fl1DgIPOJlvkAwTMk2IihCnSvR?= =?Windows-1252?Q?JK6VGfZBfqn1BTtoAox9IEvUygdb+B4pyAoTyC+X2CNqmKehHeuahscL?= =?Windows-1252?Q?6etNDolqrZNN8jFbl8PBK8+vv7B7nez8jv9tu8cXAclHero5bDAorF1T?= =?Windows-1252?Q?uPFv0sVf9Zn+23rUP+Vdnl+c9lCnM1KVAiN7QOFtwhxBJE5f7mldJIo4?= =?Windows-1252?Q?m2Ac9K6w9tT5zNN/DaoJa76Z8rDIpalb9K5TC0W0RmV6I/Uo3JtIoqtW?= =?Windows-1252?Q?6HOGYk3+TmVhlPip0CQ5k0PwUMx3txE+z+gpJppkdSIVmZ3hsI4UXtRz?= =?Windows-1252?Q?D+pW8rNY1RrCxVpTFmQ+PGwn0wMw9y8u7e5R6?= X-Microsoft-Exchange-Diagnostics: 1;VI1PR0801MB2064;6:FojXiQ3mpXQaumStFk8PVKXrJ8kcPke8lV4Ur/A+j8zHjJMYfZDhAIdu1cm1MCqai3M/PNBkpICKPptj1S3vX2b/T5Pq0iHsGYT+EQ1DiNaiW/w1NGR2t4v0j76rj+rRmtCpg8mfNl1rTkEQ5hlcljyMuwn1nTPIYnCtCLA27MBv7vd8qjhDnQlswWm3HSWi8TElYiRTpa1AAhu6RT/iAFI6jJkR6LUnoAMw0geAKUHvNeCOGaHNalmZGjo/hNM6YRot7ErKZFC6lND7Qua1hwCg6V2XASZlP03/jzguLaddMdmpZj7K/teoztFtJ2v4qsk+sYY0kuNMT9Na08mxxnV87sIMjKqVVNzQZIzHg00zXTcUO1RnXjDm1/trf6eV7et7SABzoJYE6p7UJvisYA==;5:MZP49JNJjEJ7jjFr/Bb73QP45xG7s7OkmRgHAVOMioKjEJyQ0b+8uFT/1A2nTRzSYXHZ92nSq2r7VEVF1/CitZxq+BVg63fRNIbeG2rlwZQzUmYdzC/5yjKr2dEM6xRAlJdpGRsG9aI++SWydErroA==;24:VrSyxtrOwYnQ+JizQtIpU2Uqy7Cno2+yFFAeFKpqvmAxfw097NhBzpTgSKrrB2USQ7boG0J23zx3dDNuH0sAYd1d84hg6dqo8yHi5G/MiyM= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;VI1PR0801MB2064;7:MP50/qpkrB1E4Ii/hIpx7qpOGURS4Qj2mczD8Coz/otDZjhMy+n3cNuW1dWNA7JsA1vrf4jP7AXQ60GNKydh3uGBHkiduhDSMIcgj4rsR+GRFYSS9uK0S62EZxu9/4FP9OuZ/i72G1zhC2QNoyjsS/7E/u6IUxgNFUZxMc03sHEbbMFEH8uo2Qm9VbyvszYtzuQuTSHHWSypY3j30JL4p6bkF/jCFry9d1Jm7HbbKRF3mIfSSeUGfq66ej28RPfbykNH/mZE6+SCl5Ey7CdNzd396yVT5cPWZNr77MF3DM9bBJtXFI25oYOZxRRagEPMGSIZZVAjToGl1u+BGxFZmM0G3VPcHgCfEpPFe36iv/zrLCnUuZmG8cAGVL606IJm72VkO0R7ItjKRH+LMJflyylk9eBOy5N3JxCPNXrQNo6vWAALrnztpIbIA/OEyTdwOHqnUrlh3AJz9JhwOIw4v1g9jWlA0CAMWoD1upiSePsYj57cpQRRasnB4mfn7CoFg4yWhrkQItyonSmwX5sa/w==;20:hgvEAUFgvSczocPL5m7o9VhhFGuXTh6Ag+I+HVn1tbsN1Y6Hpl48+vsJH3cthZ6KIkkbsVewpy5AGu0eB77fQ6LIgke7BEH0QEE9RspFGanASuAJ0wtaTJRs+O1b/V0O99Ljk8ndKlhV1MDWjW42JnK3XniUWrI9So6ZFcbnbbo= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 15 Feb 2017 14:05:51.8979 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR0801MB2064 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 02/15/2017 02:03 AM, Arnd Bergmann wrote: > Hi Dmitry, > > I've come a little further on the stack size analysis after initially > finding that gcc-7.0.1 is much better than the horrible stack frames > we were seeing on gcc-7.0.0 (I found over 80kb in one case), I found > more that remain with the newer compiler, but also analyzed the worst > remaining ones down to two common helpers: typecheck() caused the > worst remaining problem, but only in a few files like > "drivers/net/wireless/ralink/rt2x00/rt2800lib.c:5068:1: error: the frame > size of 23768 bytes is larger than 1024 bytes". I think my fix should > be able to make it in, but I'd give it some more testing. It also seems > here that gcc asan-stack isn't too smart, as it adds checks to local > variables we never use except for comparing their addresses. This may > also impact min() and max(), which have the same check. > > READ_ONCE()/WRITE_ONCE() are used for atomic_t and caused the next worst > offender (12688 byte stacks in lib/atomic64_test.c) as well as a lot > of other instances that were over 2048 byte stacks. This one is a lot > trickier as my the version from my patch is most likely not safe > for all callers, and the helper has been extended to cover a lot of > corner cases that my version destroys (it doesn't force aggregates > to be accessed as scalars for example, I think the following patch on top of yours should fix that for READ_ONCE(). WRITE_ONCE() probably can be fixed in a similar way, but I didn't try it. diff --git a/include/linux/compiler.h b/include/linux/compiler.h index 10bca12..5d9dd63 100644 --- a/include/linux/compiler.h +++ b/include/linux/compiler.h @@ -301,10 +301,10 @@ static __always_inline void __write_once_size(volatile void *p, void *res, int s */ #define __READ_ONCE(x, check) \ - __builtin_choose_expr(sizeof(x) == 1, *(volatile typeof(&(x)))&(x), \ - __builtin_choose_expr(sizeof(x) == 2, *(volatile typeof(&(x)))&(x), \ - __builtin_choose_expr(sizeof(x) == 4, *(volatile typeof(&(x)))&(x), \ - __builtin_choose_expr(sizeof(x) == sizeof(long), *(volatile typeof(&(x)))&(x), \ + __builtin_choose_expr(sizeof(x) == 1, (typeof(x))(__u64)*(volatile __u8 *)&(x), \ + __builtin_choose_expr(sizeof(x) == 2, (typeof(x))(__u64)*(volatile __u16 *)&(x), \ + __builtin_choose_expr(sizeof(x) == 4, (typeof(x))(__u64)*(volatile __u32 *)&(x), \ + __builtin_choose_expr(sizeof(x) == 8, (typeof(x))(__u64)*(volatile __u64 *)&(x), \ ({union { typeof(x) __val; char __c[1]; } __u; \ if (check) \ __read_once_size(&(x), __u.__c, sizeof(x)); \ > probably also causes sparse > warnings, and maybe doesn't even guarantee the "ONCE" semantics). > > I see that Andrey also provided a READ_ONCE_NOCHECK() helper that > would also take care of this if used consistently, but it seems > wrong to use that for all atomics. Any other ideas? > > Arnd > > diff --git a/include/linux/compiler.h b/include/linux/compiler.h > index 416b17e03016..b8018eddd757 100644 > --- a/include/linux/compiler.h > +++ b/include/linux/compiler.h > @@ -310,14 +310,17 @@ static __always_inline void __write_once_size(volatile void *p, void *res, int s > */ > > #define __READ_ONCE(x, check) \ > -({ \ > - union { typeof(x) __val; char __c[1]; } __u; \ > + __builtin_choose_expr(sizeof(x) == 1, *(volatile typeof(&(x)))&(x), \ > + __builtin_choose_expr(sizeof(x) == 2, *(volatile typeof(&(x)))&(x), \ > + __builtin_choose_expr(sizeof(x) == 4, *(volatile typeof(&(x)))&(x), \ > + __builtin_choose_expr(sizeof(x) == sizeof(long), *(volatile typeof(&(x)))&(x), \ > + ({union { typeof(x) __val; char __c[1]; } __u; \ This should be under "if (check)" otherwise it breaks READ_ONCE_NOCHECK() > if (check) \ > __read_once_size(&(x), __u.__c, sizeof(x)); \ > else \ > __read_once_size_nocheck(&(x), __u.__c, sizeof(x)); \ > __u.__val; \ > -}) > + }))))) > #define READ_ONCE(x) __READ_ONCE(x, 1) >