From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754938AbcFQIPq (ORCPT ); Fri, 17 Jun 2016 04:15:46 -0400 Received: from mail-am1on0115.outbound.protection.outlook.com ([157.56.112.115]:53170 "EHLO emea01-am1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1754094AbcFQIPf (ORCPT ); Fri, 17 Jun 2016 04:15:35 -0400 Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=aryabinin@virtuozzo.com; Subject: Re: Divide-by-zero in post_init_entity_util_avg To: Peter Zijlstra , Yuyang Du References: <20160609090142.GS32344@nuc-i3427.alporthouse.com> <20160609013324.GH8105@intel.com> <20160609130750.GQ30909@twins.programming.kicks-ass.net> <20160616085040.GF30927@twins.programming.kicks-ass.net> <20160616122504.GG30927@twins.programming.kicks-ass.net> CC: Chris Wilson , Linus Torvalds , Mike Galbraith , Thomas Gleixner , , , , , , From: Andrey Ryabinin Message-ID: <5763B1D8.1010707@virtuozzo.com> Date: Fri, 17 Jun 2016 11:16:24 +0300 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.8.0 MIME-Version: 1.0 In-Reply-To: <20160616122504.GG30927@twins.programming.kicks-ass.net> Content-Type: text/plain; charset="windows-1252" Content-Transfer-Encoding: 7bit X-Originating-IP: [195.214.232.10] X-ClientProxiedBy: AM2PR09CA0021.eurprd09.prod.outlook.com (10.161.22.159) To DB6PR0801MB1303.eurprd08.prod.outlook.com (10.168.11.21) X-MS-Office365-Filtering-Correlation-Id: b3b36663-804b-4fe8-90c0-08d396878cfa X-Microsoft-Exchange-Diagnostics: 1;DB6PR0801MB1303;2:7Gb96sotpmt5a90p9WwZk+4Obfa5xF+AmCY2CKcgfnuNcty1BNUY0AcHupDpURfG+aQwIMegbtnev9x6nPeFzIPRXG9NSVcYtK0lBAueviKo7i9s+dmzd8SHCnMpM8dv5YEJ08tUefiD6ebbzWgfwdrjXAPnE99QJ/14Y1fo00/lGJLyDE9jvAz46kY9cJMp;3:4yPwnAnQ9tDk5AeP0/gqs8PkC6b0Zq1dcDp4GySWtXsJyIYLxYVsrDTGkfDJ6Ox7SZ0FomsWkz23Raqah4oDFPpNwBkybxAQ27mJUvROTGv0E1aRbWl4Mz+JJq1IQa4m X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:DB6PR0801MB1303; X-Microsoft-Exchange-Diagnostics: 1;DB6PR0801MB1303;25:F7hjehj3SMcb1gW2dcDdv7kifwQN/EjxGkcK/VkYu06VrDK6Cc67TyBEQKh2YHgivuxFDcb926Dj8TbtdP9BIpnInKqz2lTQG5+yM1HWSCIYvW7kN1++L/zAAFYD/OVOnP/CD9316gSu5dFUh7ISPVSjZ/itnxPd4cFQ2KBTf7di+abAEcI8STc0BwL+bTQPA8ScI7KxP7w4w2QQ5SFsBkkWlAo8Xm73fRFLVotStOnG/5sjwdB0Ly4CvU7cCpSI2yQ3Am9XEaIRSBemKGga5UJO26COAhjsisjOyaHAHLSuG1plVGha86HU1LXe4jXNIBZYWR4INgvmZn1RstyUT5Kh6vAPmwjtKM6KYBARRAEGtoVHfhMKvEL3jjMoB6gWN7PV6zSgEQoB4xiZ+x/GxzIUmvh3ZbE3G1MCAjvFaigH/at3pNga8gZM1s/XsUnzV7QKyB+pf0wkOlTOzQWQr+f1GlI0sfU9K+I+E+i42rTDM4kzhsVli8z1uD1TXlFiKUfh0TZ1TtN6D3DCkf2psEobDxZiPgww0JSEKiMKnle0tY06X9YhF1a1Wrc4yGNYrM1uCKIhDmtQq2I57ZNTrL1W64Hsv2FkKA+GC2uTbGdIewfDBhliGn8s6dEaqBhvrZx2y/ATfeGWByZcbSIzB1sOQgT09QLa7XmCUHtSb6JYRTZE/14TUeVEdchprjCgKVFqzvN2qc1nIQjtloqbpz/tuyvFhGuhFZqxx3FQc4i1a8zSGT8R+1NrrSRwekmrQ++JMODXn18z9ew4PhdvM76RfIPvoqHfhJ38xuTt68FhcNXllKxpgyx8kHNIXs/s X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(22074186197030)(183786458502308); X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(6040130)(601004)(2401047)(5005006)(8121501046)(10201501046)(3002001)(6041072)(6043046);SRVR:DB6PR0801MB1303;BCL:0;PCL:0;RULEID:;SRVR:DB6PR0801MB1303; X-Microsoft-Exchange-Diagnostics: 1;DB6PR0801MB1303;4:h3FrFWHgPDYKIP/4Rw+e0WSiygVwjn/4xGYzb6Y3ow/K26eoBgmw2QElaXpfLy9psuW/ppjdanuuJ6/JP/CoonYcf/JXzLBPFh5TVTPYfXLS9wkmtc2Ha52aZeYpWrpoS6T+ujYSBbKvFKC1oypFKjU+eHQT8605NWlpx7WrHZoOkqifVw8nXokejgLNuGmqE1a9o6GOW+IHTK74JufGjZMtiXvFsjQvMTgVwy2i3GR3SnVx1Vtus6D4Fw6DgbFMA0ApS6KjG40wolzOPTYooB7GYKDMn3ks9wE7+GrEtYZFuYddZIhLBud/vBjVySbcwS2TjmVwydoFGPcSQ9iW7ZXp2L0MKNpjV3eIdCipvSUZtGxyyR/wKCNnLNFZCJoXPyaJWOykddLXtAqxQds4BNjmVrdgcyfPppa5LgVqOWH1ZhTOgLH1gf8AAtHPa1iThT/JN5qkD1dJ1JcOzl/q3fXjYxXLfE9LnlUT3gfHsh6ySBQbOY4cc42kweikZyFE X-Forefront-PRVS: 09760A0505 X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10019020)(4630300001)(6049001)(6009001)(7916002)(189002)(24454002)(69234005)(377454003)(199003)(377424004)(586003)(59896002)(3846002)(5001770100001)(97736004)(6116002)(230783001)(50466002)(64126003)(4001350100001)(42186005)(2906002)(4326007)(36756003)(105586002)(81166006)(230700001)(106356001)(86362001)(93886004)(77096005)(81156014)(8676002)(15975445007)(65816999)(101416001)(23746002)(50986999)(5008740100001)(92566002)(33656002)(68736007)(76176999)(87266999)(54356999)(2950100001)(8666005)(83506001)(189998001)(47776003)(66066001)(65956001)(65806001)(5004730100002)(80316001)(19580395003)(7059030);DIR:OUT;SFP:1102;SCL:1;SRVR:DB6PR0801MB1303;H:[10.30.19.223];FPR:;SPF:None;PTR:InfoNoRecords;MX:1;A:1;LANG:en; X-Microsoft-Exchange-Diagnostics: =?Windows-1252?Q?1;DB6PR0801MB1303;23:vXrSZnc2vVcAo72W1XcFxV10UeoXe3xVZC0?= =?Windows-1252?Q?A8gm9sENyx/jDEL+TCDkC13r6dfFXVvESXYhn1B+0CAhnjH5EIueJN5H?= =?Windows-1252?Q?I/aR7FLqO4OmE8X+hmog1Xqyh28Zv+hMLvZVMpAAnOrlIqOsq6YSqCve?= =?Windows-1252?Q?aQ8bVMFndUZ0uzeKzgsOFr/1s+/op13CJNdl4wjhp/zBfCRXjaciCfjv?= =?Windows-1252?Q?ctMFbweLzm5sXCoCz8uF0qkUQP8BKI5oibiPoZ8RN1/183X11BZ2/ZS0?= =?Windows-1252?Q?HNGYoiBjwAzBuqvNekkMcZrsYmodi4fYh8y4oCU+HqxFAv2Rc4ESzDpc?= =?Windows-1252?Q?eBtz+6CoIPxM0KFRs8y8td5y0aCAyHkycHgtMdko6y+6LqrHwFcub7Mr?= =?Windows-1252?Q?MrPV+Bg5q4KpFBJy1ZqUi8Rqmt4DR12p5VKsVXMaityQYZN1MyS5dMih?= =?Windows-1252?Q?dlijSJzoEUzdbKRDsy1gyPppkX7pa2z51OrYit1zbfvQuoH26r0w7iyn?= =?Windows-1252?Q?imwg2XxIU3isL9Zswfm+LCryMp3Yanbu8f1XhK4W1SDJ9S9CkgPsZVAW?= =?Windows-1252?Q?W2hK7vpkb3ux8w3ChSJFsmWhvaMogi6tlDPUtsdSbE47Q4c47eLMGcFu?= =?Windows-1252?Q?pdVSK8dZ0CcI44fr0duhM8rjfD+Le23nwGPdRNKIrPKwT84T6BEal9LM?= =?Windows-1252?Q?OW4Amy329fxGEz91JptXUq/gJaTwO43H7yaSdwYuszwhrXS3dFbnJrtO?= =?Windows-1252?Q?JcMDGwnpX/zkGkn4ocwQ1hreUaee8nrtGKbzFmvb6to7BSkS6xeFj0Pd?= =?Windows-1252?Q?QAt5YHTj4IcdcYw+EtYQE2ILvgi+r/DUKX9qerp5D7jvbtFmm+OiykMX?= =?Windows-1252?Q?1uJmBBSRejMLcwrd1ABjhMiBCDCm8Tu+JjeStC2hlY3Qqf+zTo7H9ws5?= =?Windows-1252?Q?xV08+iDG43+ZKkrl6ZC6h12YJWxtwFYYCi5dsWkPOVPEYWPFfSbupbpN?= =?Windows-1252?Q?h/dMayA1DGCf2PoIcZZjyqJu1ePcXvGrM2AgirrjfKt2+f4/5nDQGw18?= =?Windows-1252?Q?K4nrxtRJ1YxKyrqj6Ptys99quJ9wai5qTS8W2zk5ngMx/4RjayUuBmpv?= =?Windows-1252?Q?uxoh0yVhLMvogElXzV7fYIhaejyLfL6CtX+KzQsOxOVqGY21EqostdW6?= =?Windows-1252?Q?bbvdeQA6NzbC1tP13tWfIlZTopDaGrJ4x5SPjW/lXx96YyRZHKRl28lC?= =?Windows-1252?Q?DawcaVdwG7SifWQh6UNSxDjV9RkTwWH9tzJ34qzCTqn9AXMxSC3Xj90m?= =?Windows-1252?Q?XeasuLlc0WkuKo4/ldAfckzMNZhnLopKHqMcNO9JvuLgkOiHOMXPucby?= =?Windows-1252?Q?uIM1rJwsxPvSQSSZyTGiclUBIr8z2i4BwMos6VdyQP6/kIvtDbFUYA6U?= =?Windows-1252?Q?PvKN++lu3D2hEjNhbe6bvSPNV6xwjA8+tcgzSivoF4k2o5QFz0sQGPYu?= =?Windows-1252?Q?5nglo0V78C6O93uzDffIaaLTPMx5b3s1Fvpm2bs4vedjsUNIvWQ=3D?= =?Windows-1252?Q?=3D?= X-Microsoft-Exchange-Diagnostics: 1;DB6PR0801MB1303;6:8eewvMs/OBnwvSQfTRDCLZHo09Miuc4D6nLum/0Zc2eaub2s+WD2S6BPTUe3zDq6V/YrTGOzHzsoyjM37WILncoe/kViFVFCcXDg9Kb/ssuF1QCYDDaJQ6zF1BmKM3vRK5OKFcELBBkY8l9HZ6Jbk//nbYSaacIU6YSxQ/cnTkR/9/ZXJLCzCL+6xx0sGTKvtRA7dVM5YfH4e4vp8gnbrBaOHBkEb6xmtlV1iVjES3VVe1AGrTLm8Xle3aWLuC7vsxx252Ut6yd0lMH7b3uWSeTbmatvUXwHLE3t5PpM4OhfdmA3eQZ0SU+tCb938Psr;5:0IvaJuq0iflUvWgK7OcNYFSxgRKGHgiyOvc9a4OKj4wFtrFcuGDCc3R14IYEWTpOzfEi5aw9UiRu5PciRBY9xiFcpxyBu3xl1yBnGUYPNIAPvS8kQP2a7SmlPvql1luf1q9QM/hEKYsEenk/7QsSLw==;24:g2jJnI/pIaSA+tKPVg3wXC4wHeKXFRhXiN+/+wdJSZjaJmbMDAc2RWP89pejizO+H/qhjh4H88NCrT0kXoOFneheO1yjXG/dbdbD3Jzm6mQ=;7:8ylmNhBNsursUPwv0Bhf2AL9OV79YClm9RAJbG3OdgUxvu4SXXgv64GMVqlSlU1qLiXds38/qNs75PcXGG8p7/9b4aDH2b+0TRScxa/T24eXlguzVmQ5MAcn9uxOOS1ibAEdNvgNiD4Fph5xjG4tfuSEfG9jSWS+QkF4P/NLKdFzEyVnKVC2RWAfPjaIZBt3YeNyXmD/mJhxx09XMDln0Q8pkrT1R4oXELsu1BhwaUbogqGQ9Zm5sRfZg2xGioon SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;DB6PR0801MB1303;20:pxmJjNqph4MVWSs6EvmrAjEt102leRYBrcz7PNzo45MILkWTEOoeC2WWxxKioYCMCK7f3UFOqsLwZxa2KXw2zyOe0to65tieKcHetvJ53tfRb+WRxdIukAZqetd7k7NzM6tLnSRYiTyTNXoDibQ7ca59b3dP3IQ/Vfi0jBCsTcw= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 17 Jun 2016 08:15:30.9566 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: DB6PR0801MB1303 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 06/16/2016 03:25 PM, Peter Zijlstra wrote: > On Thu, Jun 16, 2016 at 10:50:40AM +0200, Peter Zijlstra wrote: >> diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c >> index f75930bdd326..3fd3d903e6b6 100644 >> --- a/kernel/sched/fair.c >> +++ b/kernel/sched/fair.c >> @@ -2878,6 +2878,20 @@ static inline void cfs_rq_util_change(struct cfs_rq *cfs_rq) >> } >> } >> >> +/* >> + * Explicitly do a load-store to ensure the temporary value never hits memory. >> + * This allows lockless observations without ever seeing the negative values. >> + * >> + * Incidentally, this also generates much saner code for x86. >> + */ >> +#define sub_positive(type, ptr, val) do { \ >> + type tmp = READ_ONCE(*ptr); \ >> + tmp -= (val); \ >> + if (tmp < 0) \ >> + tmp = 0; \ >> + WRITE_ONCE(*ptr, tmp); \ >> +} while (0) >> + >> /* Group cfs_rq's load_avg is used for task_h_load and update_cfs_share */ >> static inline int >> update_cfs_rq_load_avg(u64 now, struct cfs_rq *cfs_rq, bool update_freq) >> @@ -2887,15 +2901,15 @@ update_cfs_rq_load_avg(u64 now, struct cfs_rq *cfs_rq, bool update_freq) >> >> if (atomic_long_read(&cfs_rq->removed_load_avg)) { >> s64 r = atomic_long_xchg(&cfs_rq->removed_load_avg, 0); >> - sa->load_avg = max_t(long, sa->load_avg - r, 0); >> - sa->load_sum = max_t(s64, sa->load_sum - r * LOAD_AVG_MAX, 0); >> + sub_positive(long, &sa->load_avg, r); >> + sub_positive(s64, &sa->load_sum, r * LOAD_AVG_MAX); > > Hmm, so either we should change these variables to signed types as > forced here, or this logic (along with the former) is plain wrong. > > As it stands any unsigned value with the MSB set will wipe the field > after this subtraction. > > I suppose instead we'd want something like: > > tmp = READ_ONCE(*ptr); > if (tmp > val) > tmp -= val; > else > tmp = 0; > WRITE_ONCE(*ptr, tmp); > > In order to generate: > > xchg %rax,0xa0(%r13) > mov 0x78(%r13),%rcx > sub %rax,%rcx > cmovae %r15,%rcx > mov %rcx,0x78(%r13) > > however, GCC isn't smart enough and generates: > > xchg %rax,0x98(%r13) > mov 0x70(%r13),%rsi > mov %rsi,%rcx > sub %rax,%rcx > cmp %rsi,%rax > cmovae %r15,%rcx > mov %rcx,0x70(%r13) > > Doing a CMP with the _same_ values it does the SUB with, resulting in > exactly the same CC values. > FYI - https://gcc.gnu.org/bugzilla/show_bug.cgi?id=3507 (Reported: 2001-07-01) > (this is with gcc-5.3, I'm still trying to build gcc-6.1 from the debian > package which I suppose I should just give up and do a source build) > > Opinions? >