Received: by 2002:a05:6a10:1a4d:0:0:0:0 with SMTP id nk13csp5523961pxb; Mon, 14 Feb 2022 00:44:42 -0800 (PST) X-Google-Smtp-Source: ABdhPJwKwUrHosD4FTBNVyFUWmKXgu/7ZyN3v7AGE3hoysic81DJLM37H/TpIHeTTJxs3NngbJo2 X-Received: by 2002:a17:906:2cc4:: with SMTP id r4mr10528998ejr.393.1644828282614; Mon, 14 Feb 2022 00:44:42 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1644828282; cv=none; d=google.com; s=arc-20160816; b=fkwp99FKUcufZJlgGhEvzU8yup3j3QLGGKd0VtBVkXqSMu/dbvQSkxRV0COqI213jY 3HTrVb/fNal+ind8IAoaRQuNZz47EEAyixMW4sfplrKErpVa3j1UH/r8MZTMRsYjf67P WgwHEn5WawytgWDt8hTiM9O1RSDEDJyIT7yPlV+d65cJ1/sqO4BJzo1IhulJF83Z6El4 xPi3Ohmzn6f9mLPC9eO5EZt4G1dNgU+0nHNttmMUto2xCJQveuLVdHcdv0jFDMveNyr6 Jl7JHg5KICk2ZBRzzgmzIAat0kyesOwOQsiJQVUBVmJsChNln6P+s649MfkDhYxrQCJf vKiw== 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; bh=YNB4aa33S5eDalpBdp9YyCSow3HphwNedSE1VEdHpQA=; b=A4rZBpnomccV+Wr/0pFqObouYvt6LIdCjXkvMcoQ8t8Hk33hbXsHVhFmOV7PUVB2ca nXWszLbKle3ZqzG83SqmVLH34E7UuarAkASn2Kjll0SDluNvVCHL+4a9MsbQiz+M4tsD KQQkRIKQFTEO7h7TDqOAZgugNTWh2jX2RwzGMMetdLrZr6LeQ92Bx21rh3SuI9nhzjNh DLwWu/9ykw1xQ5goGWI16hZRh25W4LWGRDi7u+VrVzMZEL3EjtD/UMFSBwvF9usflleu CaRhDeRNI5vVh5jDZyw0iUkDytXpHOson3GC/Ew5FokNGZwKWnRjZ2lCB75YhyT+6Ti8 99Vw== ARC-Authentication-Results: i=1; mx.google.com; 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 Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id dt16si868513ejc.480.2022.02.14.00.44.20; Mon, 14 Feb 2022 00:44:42 -0800 (PST) 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; 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 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S238277AbiBMUuY (ORCPT + 99 others); Sun, 13 Feb 2022 15:50:24 -0500 Received: from mxb-00190b01.gslb.pphosted.com ([23.128.96.19]:55664 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230399AbiBMUuX (ORCPT ); Sun, 13 Feb 2022 15:50:23 -0500 Received: from isilmar-4.linta.de (isilmar-4.linta.de [136.243.71.142]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id CCC1453707; Sun, 13 Feb 2022 12:50:16 -0800 (PST) X-isilmar-external: YES X-isilmar-external: YES X-isilmar-external: YES X-isilmar-external: YES Received: from owl.dominikbrodowski.net (owl.brodo.linta [10.2.0.111]) by isilmar-4.linta.de (Postfix) with ESMTPSA id 3D420200C43; Sun, 13 Feb 2022 20:50:15 +0000 (UTC) Received: by owl.dominikbrodowski.net (Postfix, from userid 1000) id CBC488087D; Sun, 13 Feb 2022 21:48:08 +0100 (CET) From: Dominik Brodowski To: Herbert Xu Cc: linux-kernel@vger.kernel.org, linux-crypto@vger.kernel.org, "Jason A . Donenfeld" Subject: [PATCH 1/4] hw_random: do not bother to order list of devices by quality Date: Sun, 13 Feb 2022 21:46:28 +0100 Message-Id: <20220213204631.354247-2-linux@dominikbrodowski.net> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20220213204631.354247-1-linux@dominikbrodowski.net> References: <20220213204631.354247-1-linux@dominikbrodowski.net> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,SPF_HELO_NONE, SPF_NONE,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 There is no real reason why this list needs to be kept ordered by the driver-provided quality value -- a value which is set only by a handful of hw_random devices anyway. Cc: Herbert Xu Cc: Jason A. Donenfeld Signed-off-by: Dominik Brodowski --- drivers/char/hw_random/core.c | 36 ++++++++++++++++------------------- 1 file changed, 16 insertions(+), 20 deletions(-) diff --git a/drivers/char/hw_random/core.c b/drivers/char/hw_random/core.c index f327f7493585..6f09f4e5af20 100644 --- a/drivers/char/hw_random/core.c +++ b/drivers/char/hw_random/core.c @@ -31,7 +31,7 @@ static struct hwrng *current_rng; /* the current rng has been explicitly chosen by user via sysfs */ static int cur_rng_set_by_user; static struct task_struct *hwrng_fill; -/* list of registered rngs, sorted decending by quality */ +/* list of registered rngs */ static LIST_HEAD(rng_list); /* Protects rng_list and current_rng */ static DEFINE_MUTEX(rng_mutex); @@ -297,24 +297,28 @@ static struct miscdevice rng_miscdev = { static int enable_best_rng(void) { + struct hwrng *rng, *new_rng = NULL; int ret = -ENODEV; BUG_ON(!mutex_is_locked(&rng_mutex)); - /* rng_list is sorted by quality, use the best (=first) one */ - if (!list_empty(&rng_list)) { - struct hwrng *new_rng; - - new_rng = list_entry(rng_list.next, struct hwrng, list); - ret = ((new_rng == current_rng) ? 0 : set_current_rng(new_rng)); - if (!ret) - cur_rng_set_by_user = 0; - } else { + /* no rng to use? */ + if (list_empty(&rng_list)) { drop_current_rng(); cur_rng_set_by_user = 0; - ret = 0; + return 0; } + /* use the rng which offers the best quality */ + list_for_each_entry(rng, &rng_list, list) { + if (!new_rng || rng->quality > new_rng->quality) + new_rng = rng; + } + + ret = ((new_rng == current_rng) ? 0 : set_current_rng(new_rng)); + if (!ret) + cur_rng_set_by_user = 0; + return ret; } @@ -475,7 +479,6 @@ int hwrng_register(struct hwrng *rng) { int err = -EINVAL; struct hwrng *tmp; - struct list_head *rng_list_ptr; bool is_new_current = false; if (!rng->name || (!rng->data_read && !rng->read)) @@ -489,18 +492,11 @@ int hwrng_register(struct hwrng *rng) if (strcmp(tmp->name, rng->name) == 0) goto out_unlock; } + list_add_tail(&rng->list, &rng_list); init_completion(&rng->cleanup_done); complete(&rng->cleanup_done); - /* rng_list is sorted by decreasing quality */ - list_for_each(rng_list_ptr, &rng_list) { - tmp = list_entry(rng_list_ptr, struct hwrng, list); - if (tmp->quality < rng->quality) - break; - } - list_add_tail(&rng->list, rng_list_ptr); - if (!current_rng || (!cur_rng_set_by_user && rng->quality > current_rng->quality)) { /* -- 2.35.1