Received: by 2002:a6b:500f:0:0:0:0:0 with SMTP id e15csp4628551iob; Sun, 8 May 2022 19:48:59 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzQ9/D4sNVMM6FE2AdJwJq1ZG92oqsPR8TzxDcmXD/O88DY/vhC/cI+bvwTP9c5tvCgmZRx X-Received: by 2002:a17:902:d896:b0:15e:fb07:ba92 with SMTP id b22-20020a170902d89600b0015efb07ba92mr8407426plz.148.1652064539237; Sun, 08 May 2022 19:48:59 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1652064539; cv=none; d=google.com; s=arc-20160816; b=njJMx+0r8Im4GOYDvbKJ/7TBIT9TBT5ZSREM6jdZsFsnaT57ngYipWrYwYUMLFiqDB fr6+Zj6QFFo2Mnbrl8xGkP2WKFCdHkI+skVnAb3TNjBCQ3077WK2XvMig14UjjFP4NQr H7WYcn+VX5kvG5RpWeozmHi0qRTnylR589bPSgk2lWsZL9IM9iQ7RcK0W2q3qbTA7SPj Hznh7Nq77z0e4JqXMdVwgZczvY0tFlJCeCDrYgld10MBlAT7+Nk3Mb8vyFngx+U/grKR bysiscwa2VCpmowV9Bp5qM+5UpPqhDE/xeK2vOgMbGOMTljus61u6k+g4RcOtfUAoF4a oUcg== 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=mACRmOl58U9SO4gJQqVdbRM/DbDb3TktaxEm7VJe80w=; b=qjEG0TS9fdbSW/QYmFx/kaZYG98CfBbSyKaZyFPTex8zHLLRH2s0NdjVMdlI737nb+ l1jnzOAZZ7OW/QaLvsg5eu32RFOEOWgClawBPopuITRMhlntzAqcEALaObvB9KQnlZjQ luw1+dHukaHSDAjdVfACLwUXvua4s/FYtShOGlUYkTRfRT79jgOH1BSKqf//3nexuH0C uDFC2zOKNshlT/HHNVl3nrGue2JxnWKszH+jQKA6GVTAfn0J0NVVHL/peNl/vr5j8Hwf qOFC8svoaoaoAixibbT1L4Tdq3uBNBerBEuZBdaFv+T+3iuzoHIN8zIusV0xDQ4mgHqg 84CA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@zx2c4.com header.s=20210105 header.b=FTkZe9z0; spf=softfail (google.com: domain of transitioning linux-kernel-owner@vger.kernel.org does not designate 23.128.96.19 as permitted sender) smtp.mailfrom=linux-kernel-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. [23.128.96.19]) by mx.google.com with ESMTPS id n10-20020a63a50a000000b003c63bf66bd0si11480061pgf.862.2022.05.08.19.48.58 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 08 May 2022 19:48:59 -0700 (PDT) Received-SPF: softfail (google.com: domain of transitioning linux-kernel-owner@vger.kernel.org does not designate 23.128.96.19 as permitted sender) client-ip=23.128.96.19; Authentication-Results: mx.google.com; dkim=pass header.i=@zx2c4.com header.s=20210105 header.b=FTkZe9z0; spf=softfail (google.com: domain of transitioning linux-kernel-owner@vger.kernel.org does not designate 23.128.96.19 as permitted sender) smtp.mailfrom=linux-kernel-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 6F1FB7EA2C; Sun, 8 May 2022 19:48:49 -0700 (PDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230434AbiEHTIf (ORCPT + 99 others); Sun, 8 May 2022 15:08:35 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:34724 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S238035AbiEHRk1 (ORCPT ); Sun, 8 May 2022 13:40:27 -0400 Received: from ams.source.kernel.org (ams.source.kernel.org [IPv6:2604:1380:4601:e00::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 2D262E023 for ; Sun, 8 May 2022 10:36:36 -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 D7F71B80E42 for ; Sun, 8 May 2022 17:36:34 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id ED89AC385AC; Sun, 8 May 2022 17:36:32 +0000 (UTC) Authentication-Results: smtp.kernel.org; dkim=pass (1024-bit key) header.d=zx2c4.com header.i=@zx2c4.com header.b="FTkZe9z0" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=zx2c4.com; s=20210105; t=1652031391; 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=mACRmOl58U9SO4gJQqVdbRM/DbDb3TktaxEm7VJe80w=; b=FTkZe9z0ZKjdh/5f0w3LGQngFA8AbInq0NIWgDVJ1iOnBFWU78Pj13GWf9/uMx3dVkm/8/ lliDsL/U5rNtXapxsZQd8OUvQEju40dj5pzwLHccEFWzFbGrPS53REvej4G5xDmtCwaPh/ Q/KwGFkMjUFKX/JcVYgD2qXn8B+6+f4= Received: by mail.zx2c4.com (ZX2C4 Mail Server) with ESMTPSA id 3cfeec18 (TLSv1.3:AEAD-AES256-GCM-SHA384:256:NO); Sun, 8 May 2022 17:36:31 +0000 (UTC) From: "Jason A. Donenfeld" To: linux-kernel@vger.kernel.org Cc: "Jason A. Donenfeld" , Dominik Brodowski , Joe Perches Subject: [PATCH v2] random: use symbolic constants for crng_init states Date: Sun, 8 May 2022 19:36:10 +0200 Message-Id: <20220508173610.151998-1-Jason@zx2c4.com> In-Reply-To: References: 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-kernel@vger.kernel.org crng_init represents a state machine, with three states, and various rules for transitions. For the longest time, we've been managing these with "0", "1", and "2", and expecting people to figure it out. To make the code more obvious, replace these with proper enum values representing the transition, and then redocument what each of these states mean. Cc: Dominik Brodowski Cc: Joe Perches Signed-off-by: Jason A. Donenfeld --- drivers/char/random.c | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/drivers/char/random.c b/drivers/char/random.c index 2af7a755d632..8af29507ae0d 100644 --- a/drivers/char/random.c +++ b/drivers/char/random.c @@ -72,16 +72,16 @@ *********************************************************************/ /* - * crng_init = 0 --> Uninitialized - * 1 --> Initialized - * 2 --> Initialized from input_pool - * * crng_init is protected by base_crng->lock, and only increases - * its value (from 0->1->2). + * its value (from empty->early->ready). */ -static int crng_init = 0; -#define crng_ready() (likely(crng_init > 1)) -/* Various types of waiters for crng_init->2 transition. */ +static enum { + CRNG_EMPTY = 0, /* Little to no entropy collected */ + CRNG_EARLY = 1, /* At least POOL_EARLY_BITS collected */ + CRNG_READY = 2 /* Fully initialized with POOL_READY_BITS collected */ +} crng_init = CRNG_EMPTY; +#define crng_ready() (likely(crng_init >= CRNG_READY)) +/* Various types of waiters for crng_init->CRNG_READY transition. */ static DECLARE_WAIT_QUEUE_HEAD(crng_init_wait); static struct fasync_struct *fasync; static DEFINE_SPINLOCK(random_ready_chain_lock); @@ -284,7 +284,7 @@ static void crng_reseed(void) WRITE_ONCE(base_crng.generation, next_gen); WRITE_ONCE(base_crng.birth, jiffies); if (!crng_ready()) { - crng_init = 2; + crng_init = CRNG_READY; finalize_init = true; } spin_unlock_irqrestore(&base_crng.lock, flags); @@ -378,7 +378,7 @@ static void crng_make_state(u32 chacha_state[CHACHA_STATE_WORDS], * For the fast path, we check whether we're ready, unlocked first, and * then re-check once locked later. In the case where we're really not * ready, we do fast key erasure with the base_crng directly, extracting - * when crng_init==0. + * when crng_init==CRNG_EMPTY. */ if (!crng_ready()) { bool ready; @@ -386,7 +386,7 @@ static void crng_make_state(u32 chacha_state[CHACHA_STATE_WORDS], spin_lock_irqsave(&base_crng.lock, flags); ready = crng_ready(); if (!ready) { - if (crng_init == 0) + if (crng_init == CRNG_EMPTY) extract_entropy(base_crng.key, sizeof(base_crng.key)); crng_fast_key_erasure(base_crng.key, chacha_state, random_data, random_data_len); @@ -740,8 +740,8 @@ EXPORT_SYMBOL(get_random_bytes_arch); enum { POOL_BITS = BLAKE2S_HASH_SIZE * 8, - POOL_INIT_BITS = POOL_BITS, /* No point in settling for less. */ - POOL_FAST_INIT_BITS = POOL_INIT_BITS / 2 + POOL_READY_BITS = POOL_BITS, /* When crng_init->CRNG_READY */ + POOL_EARLY_BITS = POOL_READY_BITS / 2 /* When crng_init->CRNG_EARLY */ }; static struct { @@ -836,13 +836,13 @@ static void credit_init_bits(size_t nbits) init_bits = min_t(unsigned int, POOL_BITS, orig + add); } while (cmpxchg(&input_pool.init_bits, orig, init_bits) != orig); - if (!crng_ready() && init_bits >= POOL_INIT_BITS) + if (!crng_ready() && init_bits >= POOL_READY_BITS) crng_reseed(); - else if (unlikely(crng_init == 0 && init_bits >= POOL_FAST_INIT_BITS)) { + else if (unlikely(crng_init == CRNG_EMPTY && init_bits >= POOL_EARLY_BITS)) { spin_lock_irqsave(&base_crng.lock, flags); - if (crng_init == 0) { + if (crng_init == CRNG_EMPTY) { extract_entropy(base_crng.key, sizeof(base_crng.key)); - crng_init = 1; + crng_init = CRNG_EARLY; } spin_unlock_irqrestore(&base_crng.lock, flags); } @@ -1595,7 +1595,7 @@ const struct file_operations urandom_fops = { * * - write_wakeup_threshold - the amount of entropy in the input pool * below which write polls to /dev/random will unblock, requesting - * more entropy, tied to the POOL_INIT_BITS constant. It is writable + * more entropy, tied to the POOL_READY_BITS constant. It is writable * to avoid breaking old userspaces, but writing to it does not * change any behavior of the RNG. * @@ -1610,7 +1610,7 @@ const struct file_operations urandom_fops = { #include static int sysctl_random_min_urandom_seed = CRNG_RESEED_INTERVAL / HZ; -static int sysctl_random_write_wakeup_bits = POOL_INIT_BITS; +static int sysctl_random_write_wakeup_bits = POOL_READY_BITS; static int sysctl_poolsize = POOL_BITS; static u8 sysctl_bootid[UUID_SIZE]; -- 2.35.1