Received: by 2002:a6b:fb09:0:0:0:0:0 with SMTP id h9csp6048606iog; Thu, 23 Jun 2022 10:14:37 -0700 (PDT) X-Google-Smtp-Source: AGRyM1sgbCgvqrJe3hLNEEFn3A6qY6vFfUS+ENS5m0f6be4Mn8brmFBUgGdDVkmtoJuI3FkT4F0Y X-Received: by 2002:aa7:c750:0:b0:435:6113:efcd with SMTP id c16-20020aa7c750000000b004356113efcdmr12274249eds.327.1656004477387; Thu, 23 Jun 2022 10:14:37 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1656004477; cv=none; d=google.com; s=arc-20160816; b=Yva5LoLd1Q59qLCNQn6a0WpEHGsCISiRZoEWkzvavo0EXxuXmQXUoEe+r5XMQmfm8+ SD5H6azUdLnLudQI/JCziFiXp7PWYBqNPdstpleFBZYiklLC7xOrpf1ze9c1z6GZiXNZ woe5wl4XBUwXVw0ly/R+dHLthT3I9e7UPRiMeV8JZhi6FrerDvam2owkzb2FCLcDVK/M gHgwSSqCXArtBIaF1kjyWvyTGICOtyaBiUZhOkj8ogwxQAuR3MYC3tvDE+28Dg9KmG6t //sMXrx7bwImNDcbAHwlCvrLWLy9jHRaJx/G/cr7NBpGAnBSHoT+a/JrtO+2DH3wOoKD KlzA== 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 :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=PM9jiB8XCyJ9ANxV9Kdp/vE0EJ5qNzeK1sJSiyi6v5I=; b=V6LpC9EM+NG45zXi90Ogr+ku/qKkOcEKHis42rCD6CrupdpGq3almYw5KczBMCnTm5 he9PAL+gB8JkG4jWyUFGnRInYRtRpbKZqrwym+B/x3lRqYZlnigP68pZnFsfgpJiNdpA fRzX5KpDOKKoFVRmqZbQGwW5MhBf4yAJ0phjWPQ5TtZOhR+Kwyzd/I3Xr0IzgNNxRV2I D7PkbtUu+EZLI/KKHiBaupGKE4CcrUbPji1N1yi4SX+p3cviS0Q3I2s5kiqastt8Bo1G aaIcHtLvw7wcIsCbZTrGUpW/vymJRy8l4vwOEvETNMkx3QbPHdcDAskJxfW8RBrMW6WC aKcg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=MTk4r+QG; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id n25-20020aa7c459000000b00435802a2e93si100807edr.504.2022.06.23.10.14.12; Thu, 23 Jun 2022 10:14:37 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=MTk4r+QG; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231592AbiFWREL (ORCPT + 99 others); Thu, 23 Jun 2022 13:04:11 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:42978 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233495AbiFWRCs (ORCPT ); Thu, 23 Jun 2022 13:02:48 -0400 Received: from ams.source.kernel.org (ams.source.kernel.org [145.40.68.75]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id BB5E8506E7; Thu, 23 Jun 2022 09:54:34 -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 E041FB8248E; Thu, 23 Jun 2022 16:54:24 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 316C0C341C4; Thu, 23 Jun 2022 16:54:23 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1656003263; bh=854oDeh/tNVAGfymnqJaLZx2XdNTfSOYc0rSP8/irNU=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=MTk4r+QGCij/gvGKZGE880qpDyjlN1MTzdXtco7JXNPb9p/xAKKp0tQLhzyRmtpol Ep8xjiV0VcMo60SXHl5JCTpdIMa3BX3q+S262+ZgE3i/w2cu9z9zimWskw18taJC6m VE8mqxiWw8YXC9hKovpdTuj9f9l2tlR/cAvoARlM= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Thomas Gleixner , "Jason A. Donenfeld" , Arnd Bergmann , Theodore Tso Subject: [PATCH 4.9 183/264] timekeeping: Add raw clock fallback for random_get_entropy() Date: Thu, 23 Jun 2022 18:42:56 +0200 Message-Id: <20220623164349.246703518@linuxfoundation.org> X-Mailer: git-send-email 2.36.1 In-Reply-To: <20220623164344.053938039@linuxfoundation.org> References: <20220623164344.053938039@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-7.7 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_HI, SPF_HELO_NONE,SPF_PASS,T_SCC_BODY_TEXT_LINE autolearn=ham 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-kernel@vger.kernel.org From: "Jason A. Donenfeld" commit 1366992e16bddd5e2d9a561687f367f9f802e2e4 upstream. 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. Finally, since random_get_entropy_fallback() is used during extremely early boot when randomizing freelists in mm_init(), it can be called before timekeeping has been initialized. In that case there really is nothing we can do; jiffies hasn't even started ticking yet. So just give up and return 0. Suggested-by: Thomas Gleixner Signed-off-by: Jason A. Donenfeld Reviewed-by: Thomas Gleixner Cc: Arnd Bergmann Cc: Theodore Ts'o Signed-off-by: Jason A. Donenfeld Signed-off-by: Greg Kroah-Hartman --- include/linux/timex.h | 8 ++++++++ kernel/time/timekeeping.c | 16 ++++++++++++++++ 2 files changed, 24 insertions(+) --- a/include/linux/timex.h +++ b/include/linux/timex.h @@ -62,6 +62,8 @@ #include #include +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 /* --- a/kernel/time/timekeeping.c +++ b/kernel/time/timekeeping.c @@ -19,6 +19,7 @@ #include #include #include +#include #include #include #include @@ -2270,6 +2271,21 @@ ktime_t ktime_get_update_offsets_now(uns } /** + * 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) +{ + struct tk_read_base *tkr = &tk_core.timekeeper.tkr_mono; + struct clocksource *clock = READ_ONCE(tkr->clock); + + if (unlikely(timekeeping_suspended || !clock)) + return 0; + return clock->read(clock); +} +EXPORT_SYMBOL_GPL(random_get_entropy_fallback); + +/** * do_adjtimex() - Accessor function to NTP __do_adjtimex function */ int do_adjtimex(struct timex *txc)