From patchwork Tue Nov 14 17:36:26 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Geert Uytterhoeven X-Patchwork-Id: 10057991 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 005846023A for ; Tue, 14 Nov 2017 17:36:39 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id DCEB829803 for ; Tue, 14 Nov 2017 17:36:38 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id D194E2980B; Tue, 14 Nov 2017 17:36:38 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.9 required=2.0 tests=BAYES_00,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id B26EF29808 for ; Tue, 14 Nov 2017 17:36:37 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755934AbdKNRgh (ORCPT ); Tue, 14 Nov 2017 12:36:37 -0500 Received: from andre.telenet-ops.be ([195.130.132.53]:52946 "EHLO andre.telenet-ops.be" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754732AbdKNRgg (ORCPT ); Tue, 14 Nov 2017 12:36:36 -0500 Received: from ayla.of.borg ([84.195.106.246]) by andre.telenet-ops.be with bizsmtp id ZtcV1w00R5JzmfG01tcVpu; Tue, 14 Nov 2017 18:36:35 +0100 Received: from ramsan.of.borg ([192.168.97.29] helo=ramsan) by ayla.of.borg with esmtp (Exim 4.86_2) (envelope-from ) id 1eEf8P-0003QQ-1r; Tue, 14 Nov 2017 18:36:29 +0100 Received: from geert by ramsan with local (Exim 4.86_2) (envelope-from ) id 1eEf8O-0007el-QS; Tue, 14 Nov 2017 18:36:28 +0100 From: Geert Uytterhoeven To: John Stultz , Thomas Gleixner , Stephen Boyd , "H . Peter Anvin" Cc: Alexander Steffen , Jarkko Sakkinen , Peter Huewe , Jason Gunthorpe , Arnd Bergmann , linux-kernel@vger.kernel.org, linux-integrity@vger.kernel.org, Geert Uytterhoeven Subject: [PATCH] [RFC] time: Make sure jiffies_to_msecs() preserves non-zero time periods Date: Tue, 14 Nov 2017 18:36:26 +0100 Message-Id: <1510680986-29391-1-git-send-email-geert@linux-m68k.org> X-Mailer: git-send-email 2.7.4 MIME-Version: 1.0 Sender: linux-integrity-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-integrity@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP For the common cases where 1000 is a multiple of HZ, or HZ is a multiple of 1000, jiffies_to_msecs() never returns zero when passed a non-zero time period. However, if HZ > 1000 and not an integer multiple of 1000 (e.g. 2001), jiffies_to_msecs() may return zero for small non-zero time periods. This may break code that relies on receiving back a non-zero value, e.g. drivers/char/tpm/tpm2-cmd.c:tpm2_do_selftest(). jiffies_to_usecs() does not need such a fix, as does not support values of HZ larger than 12287, thus rejecting any problematic huge values of HZ. Signed-off-by: Geert Uytterhoeven --- I noticed this issue due to the following compiler warning with gcc-4.1.2: drivers/char/tpm/tpm2-cmd.c: In function ‘tpm2_do_selftest’: drivers/char/tpm/tpm2-cmd.c:851: warning: ‘rc’ may be used uninitialized in this function With the fix above, this becomes a false positive. Nevertheless, it may be a good idea to preinitialize rc anyway, but I have no idea what's the correct value (else I would have sent a patch to do so ;-). Fixes: 87434f58be31a96d ("tpm: Use dynamic delay to wait for TPM 2.0 self test result") --- kernel/time/time.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/kernel/time/time.c b/kernel/time/time.c index bd4e6c7dd6899d83..69b901a8739aad5e 100644 --- a/kernel/time/time.c +++ b/kernel/time/time.c @@ -314,9 +314,10 @@ unsigned int jiffies_to_msecs(const unsigned long j) return (j + (HZ / MSEC_PER_SEC) - 1)/(HZ / MSEC_PER_SEC); #else # if BITS_PER_LONG == 32 - return (HZ_TO_MSEC_MUL32 * j) >> HZ_TO_MSEC_SHR32; + return (HZ_TO_MSEC_MUL32 * j + (1ULL << HZ_TO_MSEC_SHR32) - 1) >> + HZ_TO_MSEC_SHR32; # else - return (j * HZ_TO_MSEC_NUM) / HZ_TO_MSEC_DEN; + return (j * HZ_TO_MSEC_NUM + HZ_TO_MSEC_DEN - 1) / HZ_TO_MSEC_DEN; # endif #endif }