Received: by 2002:a05:6a10:af89:0:0:0:0 with SMTP id iu9csp2563130pxb; Mon, 17 Jan 2022 00:49:23 -0800 (PST) X-Google-Smtp-Source: ABdhPJylHB0GrX7suUYL3hR7JX0Pp5ORaEGtu8j4T6EdaYWStjXUSwIehOnospqFSzrf7wA6ido4 X-Received: by 2002:a05:6a00:228c:b0:4c3:40a:74c6 with SMTP id f12-20020a056a00228c00b004c3040a74c6mr11658431pfe.32.1642409363413; Mon, 17 Jan 2022 00:49:23 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1642409363; cv=none; d=google.com; s=arc-20160816; b=Xx9Fvxv6vdnxxIB6JyejjDHNtEnfKwjpWPL43cBo6nyXu9/qvRFb06dtEDYzh4B8Sm 7+5oDlhd7TusLe9f2jVhdwAgwyYVP3GEHc/+7hq5pLL+KNp02zhXA/h8mPz210WPzjAY 4lVUpGICEX7hbLLhs/9jtIdOs+P7qnmhvzhHXWuISnArB6HW3VWF5ibeYESka0oeqlrk Qavnr7RBWOgacx9WAWfJaabNVOJo1cIbzfXmylpnRfI2Il0bkXxtDx6z7sGjdTgAYRZ4 pJGm3pqRnamVDRPA0RLnejVkKrxqJUt0wVBD6Z8/hfIHcDyTNVN6BZesVtG0w01WbRV4 HrFg== 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=2mWiolN9LxOI8mOrZipDNwsEWjPLMQhVHHGrA1WF63w=; b=qAVL3LC38r0eoi19tAenEqu5DbnxNEfu6uknLmOBE0WsGOnH4rgt/DH1OVTClZpbx+ ILRKy5LxrR1XbmwILerKyOA5AyiA/7n5WgttK6uxzO0u1/nNQd+6oOCOBtKjcmemLg8B Gz4EZhMqaXjmDtm8MFY3rObwWN9iw/ZuXG8jgfTvqkizvEUAtdYkJCOg3pSJqo5zhc/c cGKzKKoDP0n5b4UsvJD7mYKaUlU5HdObioG//FXc5krsUeavV7qi06/2LLhTfuIBWhI0 KiamQ9KVHFFRXUgX8gpqCKQPy+J3s/wmQH8Y8aJAtPH4iDzfz/Ro7a91pRQ2FTdmZfy0 /O2g== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@zx2c4.com header.s=20210105 header.b=T2ThxtfO; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 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 vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id i125si14612834pgc.866.2022.01.17.00.49.11; Mon, 17 Jan 2022 00:49:23 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@zx2c4.com header.s=20210105 header.b=T2ThxtfO; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=zx2c4.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233944AbiAPQf7 (ORCPT + 99 others); Sun, 16 Jan 2022 11:35:59 -0500 Received: from ams.source.kernel.org ([145.40.68.75]:34014 "EHLO ams.source.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231292AbiAPQf6 (ORCPT ); Sun, 16 Jan 2022 11:35:58 -0500 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 EFB62B80D84 for ; Sun, 16 Jan 2022 16:35:56 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 8D3C6C36AE7 for ; Sun, 16 Jan 2022 16:35:55 +0000 (UTC) Authentication-Results: smtp.kernel.org; dkim=pass (1024-bit key) header.d=zx2c4.com header.i=@zx2c4.com header.b="T2ThxtfO" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=zx2c4.com; s=20210105; t=1642350955; 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=2mWiolN9LxOI8mOrZipDNwsEWjPLMQhVHHGrA1WF63w=; b=T2ThxtfO4wPcSLZrL3+sQmGxEFlwTlFJUxah7pZXuEyK4f7fgAO2WmVGmmtjDfmtiup0VR oeZ9eQHTueIB0fOSe6K2bbZyi3728CE8wPXy3OU8rf12YWDloroRX2XeXTw0odQXPTLTPx p66+3lL+6JGcWPSNhv7sXnTwasrdpOc= Received: by mail.zx2c4.com (ZX2C4 Mail Server) with ESMTPSA id cd5f6387 (TLSv1.3:AEAD-AES256-GCM-SHA384:256:NO); Sun, 16 Jan 2022 16:35:54 +0000 (UTC) From: "Jason A. Donenfeld" To: linux-kernel@vger.kernel.org Cc: "Jason A. Donenfeld" Subject: [PATCH 2/4] random: cleanup fractional entropy shift constants Date: Sun, 16 Jan 2022 17:35:45 +0100 Message-Id: <20220116163547.154991-2-Jason@zx2c4.com> In-Reply-To: <20220116163547.154991-1-Jason@zx2c4.com> References: <20220113154413.29513-1-Jason@zx2c4.com> <20220116163547.154991-1-Jason@zx2c4.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The entropy estimator is calculated in terms of 1/8 bits, which means there are various constants where things are shifted by 3. Move these into our pool info enum with the other relevant constants. While we're at it, move an English assertion about sizes into a proper BUILD_BUG_ON so that the compiler can ensure this invariant. Signed-off-by: Jason A. Donenfeld --- drivers/char/random.c | 28 +++++++++++++--------------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/drivers/char/random.c b/drivers/char/random.c index de1c14787ae8..7343bff086c5 100644 --- a/drivers/char/random.c +++ b/drivers/char/random.c @@ -358,16 +358,6 @@ /* #define ADD_INTERRUPT_BENCH */ -/* - * To allow fractional bits to be tracked, the entropy_count field is - * denominated in units of 1/8th bits. - * - * 2*(POOL_ENTROPY_SHIFT + poolbitshift) must <= 31, or the multiply in - * credit_entropy_bits() needs to be 64 bits wide. - */ -#define POOL_ENTROPY_SHIFT 3 -#define POOL_ENTROPY_BITS() (input_pool.entropy_count >> POOL_ENTROPY_SHIFT) - /* * If the entropy count falls under this number of bits, then we * should wake up processes which are selecting or polling on write @@ -425,8 +415,13 @@ enum poolinfo { POOL_WORDMASK = POOL_WORDS - 1, POOL_BYTES = POOL_WORDS * sizeof(u32), POOL_BITS = POOL_BYTES * 8, - POOL_BITSHIFT = ilog2(POOL_WORDS) + 5, - POOL_FRACBITS = POOL_WORDS << (POOL_ENTROPY_SHIFT + 5), + POOL_BITSHIFT = ilog2(POOL_BITS), + + /* To allow fractional bits to be tracked, the entropy_count field is + * denominated in units of 1/8th bits. */ + POOL_ENTROPY_SHIFT = 3, +#define POOL_ENTROPY_BITS() (input_pool.entropy_count >> POOL_ENTROPY_SHIFT) + POOL_FRACBITS = POOL_BITS << POOL_ENTROPY_SHIFT, /* x^128 + x^104 + x^76 + x^51 +x^25 + x + 1 */ POOL_TAP1 = 104, @@ -652,6 +647,9 @@ static void credit_entropy_bits(int nbits) int entropy_count, entropy_bits, orig; int nfrac = nbits << POOL_ENTROPY_SHIFT; + /* Ensure that the multiplication can avoid being 64 bits wide. */ + BUILD_BUG_ON(2 * (POOL_ENTROPY_SHIFT + POOL_BITSHIFT) > 31); + if (!nbits) return; @@ -687,13 +685,13 @@ static void credit_entropy_bits(int nbits) /* The +2 corresponds to the /4 in the denominator */ do { - unsigned int anfrac = min(pnfrac, POOL_FRACBITS/2); + unsigned int anfrac = min(pnfrac, POOL_FRACBITS / 2); unsigned int add = - ((POOL_FRACBITS - entropy_count)*anfrac*3) >> s; + ((POOL_FRACBITS - entropy_count) * anfrac * 3) >> s; entropy_count += add; pnfrac -= anfrac; - } while (unlikely(entropy_count < POOL_FRACBITS-2 && pnfrac)); + } while (unlikely(entropy_count < POOL_FRACBITS - 2 && pnfrac)); } if (WARN_ON(entropy_count < 0)) { -- 2.34.1