From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754198AbdKBLlC (ORCPT ); Thu, 2 Nov 2017 07:41:02 -0400 Received: from mout.kundenserver.de ([217.72.192.74]:63762 "EHLO mout.kundenserver.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754131AbdKBLk7 (ORCPT ); Thu, 2 Nov 2017 07:40:59 -0400 From: Arnd Bergmann To: Andrew Morton Cc: Arnd Bergmann , Mark Brown , Masahiro Yamada , linux-kernel@vger.kernel.org Subject: [PATCH] [RESEND] [v2] iopoll: avoid -Wint-in-bool-context warning Date: Thu, 2 Nov 2017 12:40:36 +0100 Message-Id: <20171102114048.1526955-1-arnd@arndb.de> X-Mailer: git-send-email 2.9.0 X-Provags-ID: V03:K0:aag0Q/x6khEhOvw6N1akMUKwAOF+7Ij4XL1nxYxrHyiEbYerOfA Tyi8e41X3t1ddTMz6MQ2wtKBnFBMmSPJCTqK7R8kAxx/JizUD7We4aM6RcBkq8G7XZJQS2A cfOQOgOxrA41UXJHfeHvEBpPxl1CfRXzttD3mmImmalVkX3YqyY/v8fDx5az4mlCg2IG0UL Rld8RlAFhZQBEJGFxndCQ== X-UI-Out-Filterresults: notjunk:1;V01:K0:hLtxqbJhTQ0=:xeZ/BfFCi4CdMl/1Ca+VIg 7/Tb8lUtzPBtlpt5aRawoYMKrmFVCvgdnSjceg40BhDUqihs6SGSQHdKONc/5ZtXFEim4iDb5 7dgtfF4zxuz1PmE7OwPKnbAYKwMSOlVMIe8t1Y0OGTNTXnz9b+fIybyVYKy9/LEHexkLITp7G PiRnw/30Mv9QbzVbyYLKG/9qCXzTFrAL3rMTVSxdT+YzchcB7jJ7NcZOncxaHnJIwLp8/b9HF w8FkPhk2b4TtDkdsUwVwCAcwxh1ZAzIyUgPElQhvXIJS60u3K92TAzHZMxHp+MTx/ATsUtz+J nWwgv/Zi9CvfYZogH5kw8ssRfVh1B2WWbjG/sKpxwGzVG0arG2vEyL6b0W/w0HyrTMn2qmKKH nl36kbC9i//AjVYHkrobmsENWw/Q5cI0WJ/XjcN9nQW2pthKpYXxWlG9Ffrd6SNbpVxCnRy4Y vYz6c5LP/8vxzK7SHWuHeW+bJgXFk/pXgW1C52FnUj5wJed6JZxCMi0SRHd9VsU58EuxwOvWU v4zmvt2vyVaLk7kZNoZeIihqV0Stpmg+2nGlj82rk6CzR/Juxzeb1/wsyGnAfcHXVi/4K3212 12GL+HM6Hzgrj2rFTklOtI/bSaOUEUvs9plTTRNk3uakK9vn5GvFKuz7uEbcG7YgsEMo/6Xcx 0hRagIRPZBpHWCjDtElMG6XctiZm3IfVN98y6lofJW5lvhAxJZDXp3AcrLMERYFvImg/+WKUc tZ0UL/2cf/OvdBYDaHvyLT2ruoUjyAccPxVhgA== Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org When we pass the result of a multiplication as the timeout or the delay, we can get a warning from gcc-7: drivers/mmc/host/bcm2835.c:596:149: error: '*' in boolean context, suggest '&&' instead [-Werror=int-in-bool-context] drivers/mfd/arizona-core.c:247:195: error: '*' in boolean context, suggest '&&' instead [-Werror=int-in-bool-context] drivers/gpu/drm/sun4i/sun4i_hdmi_i2c.c:49:27: error: '*' in boolean context, suggest '&&' instead [-Werror=int-in-bool-context] The warning is a bit questionable inside of a macro, but this is intentional on the side of the gcc developers. It is also an indication of another problem: we evaluate the timeout and sleep arguments multiple times, which can have undesired side-effects when those are complex expressions. This changes the two iopoll variants to use local variables for storing copies of the timeouts. This adds some more type safety, and avoids both the double-evaluation and the gcc warning. Link: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=81484 Link: http://lkml.kernel.org/r/20170726133756.2161367-1-arnd@arndb.de Reviewed-by: Mark Brown Signed-off-by: Arnd Bergmann --- v2: the v1 patch was in mmotm since I first posted it, but it gained a conflict on the regmap header and got dropped. I've split it in two patches now as Mark originally suggested, only the iopoll patch should need to go through mmotm this time, while Mark has already picked up the other half. --- include/linux/iopoll.h | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/include/linux/iopoll.h b/include/linux/iopoll.h index d29e1e21bf3f..b1d861caca16 100644 --- a/include/linux/iopoll.h +++ b/include/linux/iopoll.h @@ -42,18 +42,21 @@ */ #define readx_poll_timeout(op, addr, val, cond, sleep_us, timeout_us) \ ({ \ - ktime_t timeout = ktime_add_us(ktime_get(), timeout_us); \ - might_sleep_if(sleep_us); \ + u64 __timeout_us = (timeout_us); \ + unsigned long __sleep_us = (sleep_us); \ + ktime_t __timeout = ktime_add_us(ktime_get(), __timeout_us); \ + might_sleep_if((__sleep_us) != 0); \ for (;;) { \ (val) = op(addr); \ if (cond) \ break; \ - if (timeout_us && ktime_compare(ktime_get(), timeout) > 0) { \ + if (__timeout_us && \ + ktime_compare(ktime_get(), __timeout) > 0) { \ (val) = op(addr); \ break; \ } \ - if (sleep_us) \ - usleep_range((sleep_us >> 2) + 1, sleep_us); \ + if (__sleep_us) \ + usleep_range((__sleep_us >> 2) + 1, __sleep_us); \ } \ (cond) ? 0 : -ETIMEDOUT; \ }) @@ -77,17 +80,20 @@ */ #define readx_poll_timeout_atomic(op, addr, val, cond, delay_us, timeout_us) \ ({ \ - ktime_t timeout = ktime_add_us(ktime_get(), timeout_us); \ + u64 __timeout_us = (timeout_us); \ + unsigned long __delay_us = (delay_us); \ + ktime_t __timeout = ktime_add_us(ktime_get(), __timeout_us); \ for (;;) { \ (val) = op(addr); \ if (cond) \ break; \ - if (timeout_us && ktime_compare(ktime_get(), timeout) > 0) { \ + if (__timeout_us && \ + ktime_compare(ktime_get(), __timeout) > 0) { \ (val) = op(addr); \ break; \ } \ - if (delay_us) \ - udelay(delay_us); \ + if (__delay_us) \ + udelay(__delay_us); \ } \ (cond) ? 0 : -ETIMEDOUT; \ }) -- 2.9.0