Received: by 2002:a6b:fb09:0:0:0:0:0 with SMTP id h9csp6158570iog; Thu, 23 Jun 2022 12:34:32 -0700 (PDT) X-Google-Smtp-Source: AGRyM1tGQ+nnjavBjjekTZkpzmy/ZZ6t6YkZIWt0TaKvxrao+EuZsK4zS/M3UIuok+wcVrBADEh+ X-Received: by 2002:a17:90a:c718:b0:1eb:af0e:36fd with SMTP id o24-20020a17090ac71800b001ebaf0e36fdmr5716983pjt.99.1656012872251; Thu, 23 Jun 2022 12:34:32 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1656012872; cv=none; d=google.com; s=arc-20160816; b=ZcGUd/vNRFQX39ew/+gs3v8HLGWUhF7WGj6a9djXaa8AM2YqP1gFeEOiwDZdQ/kL5Z 8pe2pkeWLiFAlPqZOP/ybglGaRj2MKjMY6nqfDb/9O3VKfUkjAahQkhSbLImkpL965HU LJjl/aNZ7W+f4SE55l2UY9trnS7bEjtX63PehmjCutRe5fDByHnJTgp3O+IEl/w+IuA3 ajER+AaC9ntbdeRGt5rf0rTloMZRqv23fyBGWaJVeNV/mzChzFGhDLWgEkHg+WQl7DC2 BJBh+eD1TVQ4MFd7PlJFX+DkeF7zYV+O7bhy84xHX33HvFK6QfmzbjU8XJI7ySfJrgio BzaQ== 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=0lY4JkSOFR5ZQ5Bv37SWCrhwWWZ9M19dew7LVIXYgT8=; b=ySP+ozRY1VApGsX5/HmI0SRBFcNIXuisJSru+5O1i7NcEk/PdYd3z16KT3BpHh3pJE 3EoHPyWiWroViEUQhHInmlsRgJEpfBxB9iBv17iUPKik4Z9HCA0JDvSQnp7tb37XwARL AP3q+A3s10tFu1sSFL13tl18b6AmvVaQLzOpPuSIhZFt/AmFVj5I9E1SYOrCMN1ufUD/ tQQoi1y5ma5aHniSxGHyXlRM9UTLf1DkEpXdRw+AKWtkqsPsk/MFH8IPSAcuhEcxBCFy NJFkfnypOW0ktQRHDw+1ZAXWkq3Qk30gMpifbLEvx8vUWz87Hh6vWktD6hQlLD6zq9GT SW/Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=SHdqEHh7; 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 mu11-20020a17090b388b00b001ecd30c59c3si374997pjb.85.2022.06.23.12.34.18; Thu, 23 Jun 2022 12:34:32 -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=SHdqEHh7; 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 S229843AbiFWRGG (ORCPT + 99 others); Thu, 23 Jun 2022 13:06:06 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:54686 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231381AbiFWREE (ORCPT ); Thu, 23 Jun 2022 13:04:04 -0400 Received: from sin.source.kernel.org (sin.source.kernel.org [IPv6:2604:1380:40e1:4800::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 72CD9515BE; Thu, 23 Jun 2022 09:55:26 -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 sin.source.kernel.org (Postfix) with ESMTPS id DB1A8CE24F9; Thu, 23 Jun 2022 16:55:16 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id C4C5EC3411B; Thu, 23 Jun 2022 16:55:14 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1656003315; bh=V6dFDewaS8WoSf1+YUj9GNXzHan9k2X6UV0TwN8v4fQ=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=SHdqEHh7T4NQ6M9IglhQtPLUpk4x0zKQf9MeFz1UnpNIhrIKXzRKh9Lv67xL2itsK FNHM8mtMXmcu09jpXmBwTeePClRgh9liL1Y8GOXAV1k39wEK+d1XO8KinVANRNk3BG /KWSxof/61l0nWpYVeZTEvr6jxv4lO5DTREVa5Ks= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, "Jason A. Donenfeld" Subject: [PATCH 4.9 198/264] random: help compiler out with fast_mix() by using simpler arguments Date: Thu, 23 Jun 2022 18:43:11 +0200 Message-Id: <20220623164349.673626206@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 791332b3cbb080510954a4c152ce02af8832eac9 upstream. Now that fast_mix() has more than one caller, gcc no longer inlines it. That's fine. But it also doesn't handle the compound literal argument we pass it very efficiently, nor does it handle the loop as well as it could. So just expand the code to spell out this function so that it generates the same code as it did before. Performance-wise, this now behaves as it did before the last commit. The difference in actual code size on x86 is 45 bytes, which is less than a cache line. Signed-off-by: Jason A. Donenfeld Signed-off-by: Greg Kroah-Hartman --- drivers/char/random.c | 44 +++++++++++++++++++++++--------------------- 1 file changed, 23 insertions(+), 21 deletions(-) --- a/drivers/char/random.c +++ b/drivers/char/random.c @@ -1027,25 +1027,30 @@ static DEFINE_PER_CPU(struct fast_pool, * and therefore this has no security on its own. s represents the * four-word SipHash state, while v represents a two-word input. */ -static void fast_mix(unsigned long s[4], const unsigned long v[2]) +static void fast_mix(unsigned long s[4], unsigned long v1, unsigned long v2) { - size_t i; - - for (i = 0; i < 2; ++i) { - s[3] ^= v[i]; #ifdef CONFIG_64BIT - s[0] += s[1]; s[1] = rol64(s[1], 13); s[1] ^= s[0]; s[0] = rol64(s[0], 32); - s[2] += s[3]; s[3] = rol64(s[3], 16); s[3] ^= s[2]; - s[0] += s[3]; s[3] = rol64(s[3], 21); s[3] ^= s[0]; - s[2] += s[1]; s[1] = rol64(s[1], 17); s[1] ^= s[2]; s[2] = rol64(s[2], 32); +#define PERM() do { \ + s[0] += s[1]; s[1] = rol64(s[1], 13); s[1] ^= s[0]; s[0] = rol64(s[0], 32); \ + s[2] += s[3]; s[3] = rol64(s[3], 16); s[3] ^= s[2]; \ + s[0] += s[3]; s[3] = rol64(s[3], 21); s[3] ^= s[0]; \ + s[2] += s[1]; s[1] = rol64(s[1], 17); s[1] ^= s[2]; s[2] = rol64(s[2], 32); \ +} while (0) #else - s[0] += s[1]; s[1] = rol32(s[1], 5); s[1] ^= s[0]; s[0] = rol32(s[0], 16); - s[2] += s[3]; s[3] = rol32(s[3], 8); s[3] ^= s[2]; - s[0] += s[3]; s[3] = rol32(s[3], 7); s[3] ^= s[0]; - s[2] += s[1]; s[1] = rol32(s[1], 13); s[1] ^= s[2]; s[2] = rol32(s[2], 16); +#define PERM() do { \ + s[0] += s[1]; s[1] = rol32(s[1], 5); s[1] ^= s[0]; s[0] = rol32(s[0], 16); \ + s[2] += s[3]; s[3] = rol32(s[3], 8); s[3] ^= s[2]; \ + s[0] += s[3]; s[3] = rol32(s[3], 7); s[3] ^= s[0]; \ + s[2] += s[1]; s[1] = rol32(s[1], 13); s[1] ^= s[2]; s[2] = rol32(s[2], 16); \ +} while (0) #endif - s[0] ^= v[i]; - } + + s[3] ^= v1; + PERM(); + s[0] ^= v1; + s[3] ^= v2; + PERM(); + s[0] ^= v2; } #ifdef CONFIG_SMP @@ -1115,10 +1120,8 @@ void add_interrupt_randomness(int irq) struct pt_regs *regs = get_irq_regs(); unsigned int new_count; - fast_mix(fast_pool->pool, (unsigned long[2]){ - entropy, - (regs ? instruction_pointer(regs) : _RET_IP_) ^ swab(irq) - }); + fast_mix(fast_pool->pool, entropy, + (regs ? instruction_pointer(regs) : _RET_IP_) ^ swab(irq)); new_count = ++fast_pool->count; if (new_count & MIX_INFLIGHT) @@ -1158,8 +1161,7 @@ static void add_timer_randomness(struct * sometime after, so mix into the fast pool. */ if (in_irq()) { - fast_mix(this_cpu_ptr(&irq_randomness)->pool, - (unsigned long[2]){ entropy, num }); + fast_mix(this_cpu_ptr(&irq_randomness)->pool, entropy, num); } else { spin_lock_irqsave(&input_pool.lock, flags); _mix_pool_bytes(&entropy, sizeof(entropy));