Received: by 2002:a05:6358:16cc:b0:ea:6187:17c9 with SMTP id r12csp10684378rwl; Thu, 12 Jan 2023 00:53:13 -0800 (PST) X-Google-Smtp-Source: AMrXdXsdbhD4N37Xwzygtdq5ONNlX5wyb1j0fWqMIdsyKmURy6OxOk5jGMseiLNI0zqCenDWdejT X-Received: by 2002:a05:6a20:429f:b0:ad:bd55:6dcf with SMTP id o31-20020a056a20429f00b000adbd556dcfmr109230561pzj.28.1673513592884; Thu, 12 Jan 2023 00:53:12 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1673513592; cv=none; d=google.com; s=arc-20160816; b=HLPk+y9LuUWU+P/0POll6JyfLNpsy6b3GV1npVLRCt6Cdnzhx3ZHZ1OhF/X9KxWZdv rdMLXsimAjfG618oPKc4iNlJaGmom1MA5ilOfWXKTKwzm35p3bR/IrDodsdfzdSitKli Y7mVeNDa9m27wWjbRKJoov07JdEoD3B8RNXUEg8Hy6py4RAwxgEEaarKDCcmfUAM9Tdh DUA4XkcjIto0KC4BVFXcbaJEot4x//QFEkIL8iHoDojRBnIa7lfng68e0DiKaQG71Aif N7lEPv9XnDARJoaxLW3z4IIKemWq+dv/9X+GkW3Umd3+0i4QY5z/ZKG1XUXgkD+nLQee MZXw== 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=KGpW1bkaWov1/hYiPkhyLT3Togx/r/YStXQu/ZxIOCA=; b=uMu5nRrHOF99YbO/5Qee9F/ngn3iOUzzQ5sS79VNjXvyhNmKJA12yAJtJ8catzKp1j NUUvKMyMn+Kt8ndni6T9IgCwbBTRcn0IjT68OX3AJUPuNivi8HjTpn0ANle//JNKrZYv bRNHl75KRYFVZi1fv4GV8fBQ+O0ieZIAJ3oIs8XYTx2MJwgI1neQKyDLrVxasmX/wnKK WGRE8Ozc6DdcvQsNltk1htbPJULe/5HGce/twhcnVS5aITCCtUYUSKUfXL9dkk/R5CDx wJPeJciB98AUbYhrJIeyFbUWqWxk+7vmBF1TUHaSmjY2qlEiewyXS3RQzW0ekfw/7MIV uYNg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=WmZOmhiO; 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=kernel.org Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id 13-20020a170902c24d00b00188fead22f3si16577619plg.104.2023.01.12.00.53.06; Thu, 12 Jan 2023 00:53:12 -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; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=WmZOmhiO; 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=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S239673AbjALIDL (ORCPT + 50 others); Thu, 12 Jan 2023 03:03:11 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:43434 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S239504AbjALICN (ORCPT ); Thu, 12 Jan 2023 03:02:13 -0500 Received: from ams.source.kernel.org (ams.source.kernel.org [IPv6:2604:1380:4601:e00::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 73324FD2B; Thu, 12 Jan 2023 00:01:55 -0800 (PST) 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 30C34B81D8E; Thu, 12 Jan 2023 08:01:54 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id A3816C433F1; Thu, 12 Jan 2023 08:01:51 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1673510512; bh=DnqvmF2aWahKM6zVZyQwE90cv9Dp02hz9VBXVjL20Pw=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=WmZOmhiOag8SJaiXECdA5eTpqRdvsNxnA0S9wm2lTUl+bSLoeURIvZSq0Gw8ZoAqy BrmiTm60/hX1krQwEqx9s5cLZ3WVEXBxCyqnd3/OAp6hfIyjsI962ku3CbAqNL55h6 g6YCVMqKMk09OtKPiFC6cexTY2Crd5h7WvMoG9tPAJi80xArnkziPYkNSvUYutUBCM csJ+mPL6ghZm+ORVNHdLO5zuLlz7DfTZo38NNSf4M1t8gGz1Hb++yFjy+VicrbNR5q /yhBKZ2YXmOq6tkhxb2R16gxAicQyznAAWog7d4D6LP8wu+3AX3QCLmJpStvl4X3yq B7XPEhA20mhrQ== From: "Jiri Slaby (SUSE)" To: gregkh@linuxfoundation.org Cc: Kees Cook , linux-serial@vger.kernel.org, linux-kernel@vger.kernel.org, "Jiri Slaby (SUSE)" Subject: [PATCH 09/11] tty: vt: separate array juggling to juggle_array() Date: Thu, 12 Jan 2023 09:01:34 +0100 Message-Id: <20230112080136.4929-9-jirislaby@kernel.org> X-Mailer: git-send-email 2.39.0 In-Reply-To: <20230112080136.4929-1-jirislaby@kernel.org> References: <20230112080136.4929-1-jirislaby@kernel.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-7.1 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 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 The algorithm used for scrolling is the array juggling. It has complexity O(N) and space complexity O(1). I.e. quite fast w/o requirements for temporary storage. Move the algorithm to a separate function so it is obvious what it is. It is almost generic (except the array type), so if anyone else wants array rotation, feel free to make it generic and move it to include/. And rename all the variables from i, j, k, sz, d, and so on to something saner. Signed-off-by: Jiri Slaby (SUSE) --- drivers/tty/vt/vt.c | 52 ++++++++++++++++++++++++--------------------- 1 file changed, 28 insertions(+), 24 deletions(-) diff --git a/drivers/tty/vt/vt.c b/drivers/tty/vt/vt.c index 74db07b32abe..7cda18b7ee3d 100644 --- a/drivers/tty/vt/vt.c +++ b/drivers/tty/vt/vt.c @@ -398,40 +398,44 @@ static void vc_uniscr_clear_lines(struct vc_data *vc, unsigned int y, memset32(vc->vc_uni_lines[y++], ' ', vc->vc_cols); } +/* juggling array rotation algorithm (complexity O(N), size complexity O(1)) */ +static void juggle_array(u32 **array, unsigned int size, unsigned int nr) +{ + unsigned int gcd_idx; + + for (gcd_idx = 0; gcd_idx < gcd(nr, size); gcd_idx++) { + u32 *gcd_idx_val = array[gcd_idx]; + unsigned int dst_idx = gcd_idx; + + while (1) { + unsigned int src_idx = (dst_idx + nr) % size; + if (src_idx == gcd_idx) + break; + + array[dst_idx] = array[src_idx]; + dst_idx = src_idx; + } + + array[dst_idx] = gcd_idx_val; + } +} + static void vc_uniscr_scroll(struct vc_data *vc, unsigned int t, unsigned int b, enum con_scroll dir, unsigned int nr) { u32 **uni_lines = vc->vc_uni_lines; - unsigned int i, j, k, sz, d, clear; + unsigned int size = b - t; if (!uni_lines) return; - sz = b - t; - clear = b - nr; - d = nr; - if (dir == SM_DOWN) { - clear = t; - d = sz - nr; - } - - for (i = 0; i < gcd(d, sz); i++) { - u32 *tmp = uni_lines[t + i]; - j = i; - while (1) { - k = j + d; - if (k >= sz) - k -= sz; - if (k == i) - break; - uni_lines[t + j] = uni_lines[t + k]; - j = k; - } - uni_lines[t + j] = tmp; + juggle_array(&uni_lines[top], size, size - nr); + vc_uniscr_clear_lines(vc, t, nr); + } else { + juggle_array(&uni_lines[top], size, nr); + vc_uniscr_clear_lines(vc, b - nr, nr); } - - vc_uniscr_clear_lines(vc, clear, nr); } static void vc_uniscr_copy_area(u32 **dst_lines, -- 2.39.0