|
@@ -47,8 +47,6 @@
|
|
#define HVC_MAJOR 229
|
|
#define HVC_MAJOR 229
|
|
#define HVC_MINOR 0
|
|
#define HVC_MINOR 0
|
|
|
|
|
|
-#define TIMEOUT (10)
|
|
|
|
-
|
|
|
|
/*
|
|
/*
|
|
* Wait this long per iteration while trying to push buffered data to the
|
|
* Wait this long per iteration while trying to push buffered data to the
|
|
* hypervisor before allowing the tty to complete a close operation.
|
|
* hypervisor before allowing the tty to complete a close operation.
|
|
@@ -550,6 +548,18 @@ static int hvc_chars_in_buffer(struct tty_struct *tty)
|
|
return hp->n_outbuf;
|
|
return hp->n_outbuf;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+/*
|
|
|
|
+ * timeout will vary between the MIN and MAX values defined here. By default
|
|
|
|
+ * and during console activity we will use a default MIN_TIMEOUT of 10. When
|
|
|
|
+ * the console is idle, we increase the timeout value on each pass through
|
|
|
|
+ * msleep until we reach the max. This may be noticeable as a brief (average
|
|
|
|
+ * one second) delay on the console before the console responds to input when
|
|
|
|
+ * there has been no input for some time.
|
|
|
|
+ */
|
|
|
|
+#define MIN_TIMEOUT (10)
|
|
|
|
+#define MAX_TIMEOUT (2000)
|
|
|
|
+static u32 timeout = MIN_TIMEOUT;
|
|
|
|
+
|
|
#define HVC_POLL_READ 0x00000001
|
|
#define HVC_POLL_READ 0x00000001
|
|
#define HVC_POLL_WRITE 0x00000002
|
|
#define HVC_POLL_WRITE 0x00000002
|
|
|
|
|
|
@@ -642,9 +652,14 @@ static int hvc_poll(struct hvc_struct *hp)
|
|
bail:
|
|
bail:
|
|
spin_unlock_irqrestore(&hp->lock, flags);
|
|
spin_unlock_irqrestore(&hp->lock, flags);
|
|
|
|
|
|
- if (read_total)
|
|
|
|
|
|
+ if (read_total) {
|
|
|
|
+ /* Activity is occurring, so reset the polling backoff value to
|
|
|
|
+ a minimum for performance. */
|
|
|
|
+ timeout = MIN_TIMEOUT;
|
|
|
|
+
|
|
tty_flip_buffer_push(tty);
|
|
tty_flip_buffer_push(tty);
|
|
-
|
|
|
|
|
|
+ }
|
|
|
|
+
|
|
return poll_mask;
|
|
return poll_mask;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -688,8 +703,12 @@ int khvcd(void *unused)
|
|
if (!hvc_kicked) {
|
|
if (!hvc_kicked) {
|
|
if (poll_mask == 0)
|
|
if (poll_mask == 0)
|
|
schedule();
|
|
schedule();
|
|
- else
|
|
|
|
- msleep_interruptible(TIMEOUT);
|
|
|
|
|
|
+ else {
|
|
|
|
+ if (timeout < MAX_TIMEOUT)
|
|
|
|
+ timeout += (timeout >> 6) + 1;
|
|
|
|
+
|
|
|
|
+ msleep_interruptible(timeout);
|
|
|
|
+ }
|
|
}
|
|
}
|
|
__set_current_state(TASK_RUNNING);
|
|
__set_current_state(TASK_RUNNING);
|
|
} while (!kthread_should_stop());
|
|
} while (!kthread_should_stop());
|