Received: by 2002:a25:6193:0:0:0:0:0 with SMTP id v141csp777242ybb; Sat, 28 Mar 2020 09:49:45 -0700 (PDT) X-Google-Smtp-Source: ADFU+vtxv8vSgVRCwgfVUngk2gnLY5kr7V1Q4cv2guWZvcTXJzYMr+aMnqXdcwpyZDmFlOsNQrDF X-Received: by 2002:a05:6808:8cb:: with SMTP id k11mr2678981oij.48.1585414185584; Sat, 28 Mar 2020 09:49:45 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1585414185; cv=none; d=google.com; s=arc-20160816; b=OK0YiFwbeoNv0IXRjRXNfK+KVk1bj7giz6R2LfJRyCI+StA4fjF69X663FQI7a/2sF 4kSg3gbWErI0X9aSwZCqOFvH56B8tkmBecRZYRug1LpcnfXau4xsq2mMfb8tBGGX6RUR z/WTxDIXLnvqSrTEZsGZ45HEVaGHs3/ETFCUZ1V/cQmb58oYQga86nR6zLeHQAtJbYOt xw4AsQ31cfi0O6iwPcfnCV1GJJ6nW1VEAazIio/5P4CPB9Cgt/Zic6TOyiYa5ajV8Sw1 FtfBXkvKG5OjiCXHOqeRNO9ZZ/HintG7Mw7jr0jZNgA3PdGNnZmxXZgzhB/8djgO0YFg vCTQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:cc:to:subject:date:from:message-id; bh=Okg70NNznRJg1KjYD9+K11iT7ilopNkd1szsskbJh+Q=; b=k85R/Mh3d3dHoUbREWyYyJhxnfSWFuDWikW47e6ztv21mCyqnuu3mAW6ryV/91fDZx GYnDa0tzu7MaPPy+RdZ1M2qgFBYegTj3KE8x7x5+SR0Bic3nk3Q1kgjKenm37HfRhw9R 0c9ILZgue+4T+XuHWHQ8xmzikSKNB4VaJQ6V1ywOzLJBQyUaCgenhxkOe77pQKLauCnb Q4h53IH5pBZYaHWzNcswsLscVvHryT4UPhiu3PAushHKNrJ8kyW5FB5aiVyCvaPjXi1i 8F40MiVjvodx11ahYl3+WQ4OIylUGJaX1pZucO+ukjJZu3pj4Bqwk7lWy6UBRA8Q3NT6 fg/Q== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id w203si3756462oig.54.2020.03.28.09.49.31; Sat, 28 Mar 2020 09:49:45 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727335AbgC1QnR (ORCPT + 99 others); Sat, 28 Mar 2020 12:43:17 -0400 Received: from mx.sdf.org ([205.166.94.20]:50230 "EHLO mx.sdf.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726382AbgC1QnR (ORCPT ); Sat, 28 Mar 2020 12:43:17 -0400 Received: from sdf.org (IDENT:lkml@sdf.lonestar.org [205.166.94.16]) by mx.sdf.org (8.15.2/8.14.5) with ESMTPS id 02SGhEsd012112 (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256 bits) verified NO); Sat, 28 Mar 2020 16:43:14 GMT Received: (from lkml@localhost) by sdf.org (8.15.2/8.12.8/Submit) id 02SGhE5I022872; Sat, 28 Mar 2020 16:43:14 GMT Message-Id: <202003281643.02SGhE5I022872@sdf.org> From: George Spelvin Date: Mon, 18 Mar 2019 14:50:35 -0400 Subject: [RFC PATCH v1 19/50] net/sched/sch_netem: Simplify get_crandom To: linux-kernel@vger.kernel.org, lkml@sdf.org Cc: Jamal Hadi Salim , Cong Wang , Jiri Pirko , netdev@vger.kernel.org Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org This can be done with a single 32x32-bit multiply, rather than a 64x64 as previously written. One conditional subtract is required to handle the 33rd bit of value - state->last, but that's cheaper than the wider multiply even on 64-bit platforms, and much cheaper on 32-bit. The need for a 33rd bit to hold rho+1 is avoided by using ~rho instead. (Found while auditing prandom_u32() callers.) Signed-off-by: George Spelvin Cc: Jamal Hadi Salim Cc: Cong Wang Cc: Jiri Pirko Cc: netdev@vger.kernel.org --- net/sched/sch_netem.c | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/net/sched/sch_netem.c b/net/sched/sch_netem.c index 7b7503326faf5..fa41601538b21 100644 --- a/net/sched/sch_netem.c +++ b/net/sched/sch_netem.c @@ -180,17 +180,15 @@ static void init_crandom(struct crndstate *state, unsigned long rho) */ static u32 get_crandom(struct crndstate *state) { - u64 value, rho; - unsigned long answer; + u32 value = prandom_u32(), last, rho, answer; - if (!state || state->rho == 0) /* no correlation */ - return prandom_u32(); + if (!state || (rho = state->rho) == 0) /* no correlation */ + return value; + last = state->last; + answer = last + reciprocal_scale(value - last, ~rho); - value = prandom_u32(); - rho = (u64)state->rho + 1; - answer = (value * ((1ull<<32) - rho) + state->last * rho) >> 32; - state->last = answer; - return answer; + /* Handle 33rd bit of difference */ + return state->last = value >= last ? answer : answer - ~rho; } /* loss_4state - 4-state model loss generator -- 2.26.0