|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
From 48fed5c55b5183e6d44702dfdccd3b5325d8689c Mon Sep 17 00:00:00 2001
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
From: David Herrmann <dh.herrmann@gmail.com>
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
Date: Fri, 3 Oct 2014 15:54:21 +0200
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
Subject: [PATCH] pty: optimize read loop
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
As it turns out, I can actually send data to the pty faster than the
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
terminal can read. Therefore, make sure we read as much data as possible
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
but bail out early enough to not cause starvation.
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
Kernel TTY buffers are 4k, so reduce the overall buffer size, but read
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
more than once if possible (up to 8 times sounds reasonable).
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
---
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
src/shared/pty.c | 8 ++++----
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
1 file changed, 4 insertions(+), 4 deletions(-)
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
diff --git a/src/shared/pty.c b/src/shared/pty.c
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
index adcb32d0be..52a426c0e1 100644
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
--- a/src/shared/pty.c
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+++ b/src/shared/pty.c
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
@@ -67,7 +67,7 @@
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
#include "ring.h"
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
#include "util.h"
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
-#define PTY_BUFSIZE 16384
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+#define PTY_BUFSIZE 4096
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
enum {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
PTY_ROLE_UNKNOWN,
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
@@ -305,11 +305,11 @@ static int pty_dispatch_read(Pty *pty) {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
/*
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
* We're edge-triggered, means we need to read the whole queue. This,
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
* however, might cause us to stall if the writer is faster than we
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- * are. Therefore, we read twice and if the second read still returned
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- * data, we reschedule.
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ * are. Therefore, try reading as much as 8 times (32KiB) and only
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ * bail out then.
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
*/
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- for (i = 0; i < 2; ++i) {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ for (i = 0; i < 8; ++i) {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
len = read(pty->fd, pty->in_buf, sizeof(pty->in_buf) - 1);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
if (len < 0) {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
if (errno == EINTR)
|