Received: by 2002:a05:6a10:6d10:0:0:0:0 with SMTP id gq16csp785960pxb; Tue, 12 Apr 2022 13:25:10 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwyo2k6MYwuTUBgBRrPnfXknqAlMaemmKqjW5tFwH6lCsVj8Kj0sbeRuRrFcX6tlCzNyb8K X-Received: by 2002:a17:902:edc5:b0:156:68e4:416 with SMTP id q5-20020a170902edc500b0015668e40416mr38881584plk.87.1649795110564; Tue, 12 Apr 2022 13:25:10 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1649795110; cv=none; d=google.com; s=arc-20160816; b=ioOyuw8uzFp/j5nVAL2wSNbZGYtMSEGf9mArM9eyZ2HrUQNbTuv86G8xBG5jzHuaDL u8ueJmXG6X6ySUR2uAyCtp3JVf30zdokP7G01RTfybunV6PKnNSsDCmOMBEyQ9nEUvj4 5+yrQ5ycLNpEUS4L5j0f/A0gPYCGd7zifaaymgb5hTZesuE6SCBg539qLGoLCc6Xd5L/ x5GkvRGqCevBgkS+CCdNwUnprcArbUk1uwReWad2Xtx6h7FPJvYfTmytWabrEJFff1EG AMZkXGQscIDHUbBDYbL1uhVvxwxDybwV4ntMsMVElZXYdnFSYrVSiXpKrOhN1C8FRbFi KPhg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=rw2km/j4ZuUlnKo2vVYlFVdbO5S6naX3px3dcmvw66g=; b=LIx/yyScsS6zaU9hq7leEEtjHDy+8DWxyQJYKDEgEcYpFmLE4MjviBAbir3xwXz6kz tT0V5fACvYDQYtlhoJjwXnKgqgo60/XMKb8EcfJ4WasBcq+RV1CstTmXgq7oEesH7YMo P7ivv1PggjZC1Onhko1cCamsewI3yIH2bZ9CmN7RbC/dt6FIuAFW3h2StZLiJ4BI7WLO 1nocKn49NSuLT3gzs9i9ribAMcx9qS6E5IiYPyemcP8VDQwnFOdPY6E5jzneVWsOn/6K mIZ5lPJlYX5zZkonMb1rFbi5hUlMxPuf85eiq0kT+x7156EV25XvPyEtrPnACtty0eOW KjwA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@zx2c4.com header.s=20210105 header.b=XhmLqY0q; spf=pass (google.com: domain of linux-crypto-owner@vger.kernel.org designates 2620:137:e000::1:18 as permitted sender) smtp.mailfrom=linux-crypto-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=zx2c4.com Return-Path: Received: from lindbergh.monkeyblade.net (lindbergh.monkeyblade.net. [2620:137:e000::1:18]) by mx.google.com with ESMTPS id i5-20020a170902eb4500b0015872db9713si5168868pli.131.2022.04.12.13.25.10 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 12 Apr 2022 13:25:10 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-crypto-owner@vger.kernel.org designates 2620:137:e000::1:18 as permitted sender) client-ip=2620:137:e000::1:18; Authentication-Results: mx.google.com; dkim=pass header.i=@zx2c4.com header.s=20210105 header.b=XhmLqY0q; spf=pass (google.com: domain of linux-crypto-owner@vger.kernel.org designates 2620:137:e000::1:18 as permitted sender) smtp.mailfrom=linux-crypto-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=zx2c4.com Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id 3124417053; Tue, 12 Apr 2022 13:04:34 -0700 (PDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1358240AbiDLRcZ (ORCPT + 99 others); Tue, 12 Apr 2022 13:32:25 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:37912 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1358130AbiDLRcB (ORCPT ); Tue, 12 Apr 2022 13:32:01 -0400 Received: from ams.source.kernel.org (ams.source.kernel.org [145.40.68.75]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 075982019A; Tue, 12 Apr 2022 10:29:21 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ams.source.kernel.org (Postfix) with ESMTPS id B755FB81F5A; Tue, 12 Apr 2022 17:29:19 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id F3718C385A1; Tue, 12 Apr 2022 17:29:14 +0000 (UTC) Authentication-Results: smtp.kernel.org; dkim=pass (1024-bit key) header.d=zx2c4.com header.i=@zx2c4.com header.b="XhmLqY0q" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=zx2c4.com; s=20210105; t=1649784554; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=rw2km/j4ZuUlnKo2vVYlFVdbO5S6naX3px3dcmvw66g=; b=XhmLqY0qe1pwQJi7+OCT7xDbpPRkfS2VLozQIUzCVzDnx6xqMTN1U51vNgZdshxXndw9xo THtZNbm1HJB3ANhoxI8q3Ckzz4DyI+/TctpbHZRP7Ja6JmgnLAC+P5gjvlm77y2Ovq4t0f soMpVlPIPsMvrH1BhCNp2+NAAVrNAHw= Received: by mail.zx2c4.com (ZX2C4 Mail Server) with ESMTPSA id f34e683e (TLSv1.3:AEAD-AES256-GCM-SHA384:256:NO); Tue, 12 Apr 2022 17:29:14 +0000 (UTC) From: "Jason A. Donenfeld" To: linux-kernel@vger.kernel.org, linux-crypto@vger.kernel.org, tglx@linutronix.de, arnd@arndb.de Cc: "Jason A. Donenfeld" , Theodore Ts'o , Dominik Brodowski , Russell King , Catalin Marinas , Will Deacon , Geert Uytterhoeven , Thomas Bogendoerfer , Paul Walmsley , Palmer Dabbelt , Albert Ou , "David S . Miller" , Richard Weinberger , Anton Ivanov , Johannes Berg , Ingo Molnar , Borislav Petkov , Dave Hansen , "H . Peter Anvin" , Chris Zankel , Max Filippov , John Stultz , Stephen Boyd , Dinh Nguyen , linux-arm-kernel@lists.infradead.org, linux-m68k@lists.linux-m68k.org, linux-mips@vger.kernel.org, linux-riscv@lists.infradead.org, sparclinux@vger.kernel.org, linux-um@lists.infradead.org, x86@kernel.org, linux-xtensa@linux-xtensa.org Subject: [PATCH v3 01/10] timekeeping: add raw clock fallback for random_get_entropy() Date: Tue, 12 Apr 2022 19:27:45 +0200 Message-Id: <20220412172754.149498-2-Jason@zx2c4.com> In-Reply-To: <20220412172754.149498-1-Jason@zx2c4.com> References: <20220412172754.149498-1-Jason@zx2c4.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-2.0 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,RDNS_NONE,SPF_HELO_NONE,T_SCC_BODY_TEXT_LINE autolearn=no autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-crypto@vger.kernel.org The addition of random_get_entropy_fallback() provides access to whichever time source has the highest frequency, which is useful for gathering entropy on platforms without available cycle counters. It's not necessarily as good as being able to quickly access a cycle counter that the CPU has, but it's still something, even when it falls back to being jiffies-based. In the event that a given arch does not define get_cycles(), falling back to the get_cycles() default implementation that returns 0 is really not the best we can do. Instead, at least calling random_get_entropy_fallback() would be preferable, because that always needs to return _something_, even falling back to jiffies eventually. It's not as though random_get_entropy_fallback() is super high precision or guaranteed to be entropic, but basically anything that's not zero all the time is better than returning zero all the time. Cc: Thomas Gleixner Cc: Arnd Bergmann Cc: Theodore Ts'o Signed-off-by: Jason A. Donenfeld --- include/linux/timex.h | 8 ++++++++ kernel/time/timekeeping.c | 10 ++++++++++ 2 files changed, 18 insertions(+) diff --git a/include/linux/timex.h b/include/linux/timex.h index 5745c90c8800..fbbe34226044 100644 --- a/include/linux/timex.h +++ b/include/linux/timex.h @@ -62,6 +62,8 @@ #include #include +extern unsigned long random_get_entropy_fallback(void); + #include #ifndef random_get_entropy @@ -74,8 +76,14 @@ * * By default we use get_cycles() for this purpose, but individual * architectures may override this in their asm/timex.h header file. + * If a given arch does not have get_cycles(), then we fallback to + * using random_get_entropy_fallback(). */ +#ifdef get_cycles #define random_get_entropy() ((unsigned long)get_cycles()) +#else +#define random_get_entropy() random_get_entropy_fallback() +#endif #endif /* diff --git a/kernel/time/timekeeping.c b/kernel/time/timekeeping.c index dcdcb85121e4..7372d60c7c65 100644 --- a/kernel/time/timekeeping.c +++ b/kernel/time/timekeeping.c @@ -17,6 +17,7 @@ #include #include #include +#include #include #include #include @@ -2380,6 +2381,15 @@ static int timekeeping_validate_timex(const struct __kernel_timex *txc) return 0; } +/** + * random_get_entropy_fallback - Returns the raw clock source value, + * used by random.c for platforms with no valid random_get_entropy(). + */ +unsigned long random_get_entropy_fallback(void) +{ + return tk_clock_read(&tk_core.timekeeper.tkr_mono); +} +EXPORT_SYMBOL(random_get_entropy_fallback); /** * do_adjtimex() - Accessor function to NTP __do_adjtimex function -- 2.35.1