179 lines
7.6 KiB
Diff
179 lines
7.6 KiB
Diff
From patchwork Wed Dec 22 22:51:26 2021
|
|
Content-Type: text/plain; charset="utf-8"
|
|
MIME-Version: 1.0
|
|
Content-Transfer-Encoding: 7bit
|
|
X-Patchwork-Submitter: Thomas Watson <twatson52@icloud.com>
|
|
X-Patchwork-Id: 1572368
|
|
X-Patchwork-Delegate: marek.vasut@gmail.com
|
|
Return-Path: <u-boot-bounces@lists.denx.de>
|
|
X-Original-To: incoming@patchwork.ozlabs.org
|
|
Delivered-To: patchwork-incoming@bilbo.ozlabs.org
|
|
Authentication-Results: bilbo.ozlabs.org;
|
|
dkim=pass (2048-bit key;
|
|
unprotected) header.d=icloud.com header.i=@icloud.com header.a=rsa-sha256
|
|
header.s=1a1hai header.b=SkTQ1vLj;
|
|
dkim-atps=neutral
|
|
Authentication-Results: ozlabs.org;
|
|
spf=pass (sender SPF authorized) smtp.mailfrom=lists.denx.de
|
|
(client-ip=2a01:238:438b:c500:173d:9f52:ddab:ee01; helo=phobos.denx.de;
|
|
envelope-from=u-boot-bounces@lists.denx.de; receiver=<UNKNOWN>)
|
|
Received: from phobos.denx.de (phobos.denx.de
|
|
[IPv6:2a01:238:438b:c500:173d:9f52:ddab:ee01])
|
|
(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)
|
|
key-exchange X25519 server-signature RSA-PSS (4096 bits))
|
|
(No client certificate requested)
|
|
by bilbo.ozlabs.org (Postfix) with ESMTPS id 4JK8Mc4B31z9s0r
|
|
for <incoming@patchwork.ozlabs.org>; Thu, 23 Dec 2021 10:16:10 +1100 (AEDT)
|
|
Received: from h2850616.stratoserver.net (localhost [IPv6:::1])
|
|
by phobos.denx.de (Postfix) with ESMTP id D051D830C3;
|
|
Thu, 23 Dec 2021 00:15:59 +0100 (CET)
|
|
Authentication-Results: phobos.denx.de;
|
|
dmarc=pass (p=quarantine dis=none) header.from=icloud.com
|
|
Authentication-Results: phobos.denx.de;
|
|
spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de
|
|
Authentication-Results: phobos.denx.de;
|
|
dkim=pass (2048-bit key;
|
|
unprotected) header.d=icloud.com header.i=@icloud.com header.b="SkTQ1vLj";
|
|
dkim-atps=neutral
|
|
Received: by phobos.denx.de (Postfix, from userid 109)
|
|
id 0DA67830F5; Wed, 22 Dec 2021 23:52:26 +0100 (CET)
|
|
X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de
|
|
X-Spam-Level:
|
|
X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,DKIM_SIGNED,
|
|
DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,FREEMAIL_ENVFROM_END_DIGIT,
|
|
FREEMAIL_FROM,RCVD_IN_MSPIKE_H2,SPF_HELO_NONE,SPF_PASS autolearn=ham
|
|
autolearn_force=no version=3.4.2
|
|
Received: from st43p00im-ztbu10073601.me.com (st43p00im-ztbu10073601.me.com
|
|
[17.58.63.184])
|
|
(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits))
|
|
(No client certificate requested)
|
|
by phobos.denx.de (Postfix) with ESMTPS id 1598D830C2
|
|
for <u-boot@lists.denx.de>; Wed, 22 Dec 2021 23:52:23 +0100 (CET)
|
|
Authentication-Results: phobos.denx.de; dmarc=pass (p=quarantine dis=none)
|
|
header.from=icloud.com
|
|
Authentication-Results: phobos.denx.de;
|
|
spf=pass smtp.mailfrom=twatson52@icloud.com
|
|
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=icloud.com;
|
|
s=1a1hai; t=1640213541;
|
|
bh=9Gu/RsbBH8Lwy0caxjtXwguQwc3tOXLqzye8cafMd78=;
|
|
h=From:To:Subject:Date:Message-Id:MIME-Version;
|
|
b=SkTQ1vLjDZUB4S3pQ+QOuMAQs7y78hvdCVG59JmuiBtL/pLL9IskzfDYEEVxmBQ8j
|
|
QIbZXSdaHlAH3tL3ajaqL0+IJp7J/yQ5/wpmmTsRMBdk0xcgSGilBCve35DMoKYFu1
|
|
YSaXYI8GDtaBL5R9EGZAW6SekyeIWfyy03PQpawqJpTlqUNZuLdrr9mGRF/q2fbSHd
|
|
Fr4qzePCKzk3GsUhdfkh8hEDS4lOGVAPa3K2mGEpK6K/+Gv3rCckgYrV5IAJQ8YpdP
|
|
SCmRL3N03P5wkt5WiYasawJW4pcx92J2RXtyikC9fc6p67bGXkUJA+8dOtxlOyBY8E
|
|
8TrKBWY9cvKTw==
|
|
Received: from jacobs-p52.memphis.edu
|
|
(99-122-90-201.lightspeed.mmphtn.sbcglobal.net [99.122.90.201])
|
|
by st43p00im-ztbu10073601.me.com (Postfix) with ESMTPSA id 283205A0974;
|
|
Wed, 22 Dec 2021 22:52:21 +0000 (UTC)
|
|
From: Thomas Watson <twatson52@icloud.com>
|
|
To: u-boot@lists.denx.de
|
|
Cc: Thomas Watson <twatson52@icloud.com>,
|
|
Marek Vasut <marex@denx.de>
|
|
Subject: [PATCH v2] console: usb: kbd: Limit poll frequency to improve
|
|
performance
|
|
Date: Wed, 22 Dec 2021 16:51:26 -0600
|
|
Message-Id: <20211222225124.7154-1-twatson52@icloud.com>
|
|
X-Mailer: git-send-email 2.31.1
|
|
MIME-Version: 1.0
|
|
X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:6.0.425, 18.0.790
|
|
definitions=2021-12-22_02:2021-12-22,
|
|
2021-12-22 signatures=0
|
|
X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 suspectscore=0
|
|
malwarescore=0
|
|
phishscore=0 bulkscore=0 spamscore=0 clxscore=1015 mlxscore=0
|
|
mlxlogscore=934 adultscore=0 classifier=spam adjust=0 reason=mlx
|
|
scancount=1 engine=8.0.1-2009150000 definitions=main-2112220119
|
|
X-Mailman-Approved-At: Thu, 23 Dec 2021 00:15:58 +0100
|
|
X-BeenThere: u-boot@lists.denx.de
|
|
X-Mailman-Version: 2.1.38
|
|
Precedence: list
|
|
List-Id: U-Boot discussion <u-boot.lists.denx.de>
|
|
List-Unsubscribe: <https://lists.denx.de/options/u-boot>,
|
|
<mailto:u-boot-request@lists.denx.de?subject=unsubscribe>
|
|
List-Archive: <https://lists.denx.de/pipermail/u-boot/>
|
|
List-Post: <mailto:u-boot@lists.denx.de>
|
|
List-Help: <mailto:u-boot-request@lists.denx.de?subject=help>
|
|
List-Subscribe: <https://lists.denx.de/listinfo/u-boot>,
|
|
<mailto:u-boot-request@lists.denx.de?subject=subscribe>
|
|
Errors-To: u-boot-bounces@lists.denx.de
|
|
Sender: "U-Boot" <u-boot-bounces@lists.denx.de>
|
|
X-Virus-Scanned: clamav-milter 0.103.2 at phobos.denx.de
|
|
X-Virus-Status: Clean
|
|
|
|
Using the XHCI driver, the function `usb_kbd_poll_for_event` takes
|
|
30-40ms to run. The exact time is dependent on the polling interval the
|
|
keyboard requests in its descriptor, and likely cannot be significantly
|
|
reduced without major rework to the XHCI driver.
|
|
|
|
The U-Boot EFI console service sets a timer to poll the keyboard every 5
|
|
microseconds, and this timer is checked every time a block is read off
|
|
disk. The net effect is that, on my system, loading a ~40MiB kernel and
|
|
initrd takes about 62 seconds with a slower keyboard and 53 seconds
|
|
with a faster one, with the vast majority of the time spent polling the
|
|
keyboard.
|
|
|
|
To solve this problem, this patch adds a 20ms delay between consecutive
|
|
calls to `usb_kbd_poll_for_event`. This is sufficient to reduce the
|
|
total loading time to under half a second for both keyboards, and does
|
|
not impact the perceived keystroke latency.
|
|
|
|
Signed-off-by: Thomas Watson <twatson52@icloud.com>
|
|
---
|
|
This revision wraps the comment at 80 characters and also should not
|
|
have been corrupted by my e-mail client.
|
|
|
|
common/usb_kbd.c | 20 +++++++++++++++-----
|
|
1 file changed, 15 insertions(+), 5 deletions(-)
|
|
|
|
diff --git a/common/usb_kbd.c b/common/usb_kbd.c
|
|
index afad260d3d..5408c821b4 100644
|
|
--- a/common/usb_kbd.c
|
|
+++ b/common/usb_kbd.c
|
|
@@ -118,7 +118,7 @@ struct usb_kbd_pdata {
|
|
extern int __maybe_unused net_busy_flag;
|
|
|
|
/* The period of time between two calls of usb_kbd_testc(). */
|
|
-static unsigned long __maybe_unused kbd_testc_tms;
|
|
+static unsigned long kbd_testc_tms;
|
|
|
|
/* Puts character in the queue and sets up the in and out pointer. */
|
|
static void usb_kbd_put_queue(struct usb_kbd_pdata *data, u8 c)
|
|
@@ -394,21 +394,31 @@ static int usb_kbd_testc(struct stdio_dev *sdev)
|
|
struct usb_device *usb_kbd_dev;
|
|
struct usb_kbd_pdata *data;
|
|
|
|
+ /*
|
|
+ * Polling the keyboard for an event can take dozens of milliseconds.
|
|
+ * Add a delay between polls to avoid blocking activity which polls
|
|
+ * rapidly, like the UEFI console timer.
|
|
+ */
|
|
+ unsigned long poll_delay = CONFIG_SYS_HZ / 50;
|
|
+
|
|
#ifdef CONFIG_CMD_NET
|
|
/*
|
|
* If net_busy_flag is 1, NET transfer is running,
|
|
* then we check key-pressed every second (first check may be
|
|
* less than 1 second) to improve TFTP booting performance.
|
|
*/
|
|
- if (net_busy_flag && (get_timer(kbd_testc_tms) < CONFIG_SYS_HZ))
|
|
- return 0;
|
|
- kbd_testc_tms = get_timer(0);
|
|
+ if (net_busy_flag)
|
|
+ poll_delay = CONFIG_SYS_HZ;
|
|
#endif
|
|
+
|
|
dev = stdio_get_by_name(sdev->name);
|
|
usb_kbd_dev = (struct usb_device *)dev->priv;
|
|
data = usb_kbd_dev->privptr;
|
|
|
|
- usb_kbd_poll_for_event(usb_kbd_dev);
|
|
+ if (get_timer(kbd_testc_tms) >= poll_delay) {
|
|
+ usb_kbd_poll_for_event(usb_kbd_dev);
|
|
+ kbd_testc_tms = get_timer(0);
|
|
+ }
|
|
|
|
return !(data->usb_in_pointer == data->usb_out_pointer);
|
|
}
|