|
@@ -623,6 +623,15 @@ static int hvc_chars_in_buffer(struct tty_struct *tty)
|
|
|
#define MAX_TIMEOUT (2000)
|
|
|
static u32 timeout = MIN_TIMEOUT;
|
|
|
|
|
|
+/*
|
|
|
+ * Maximum number of bytes to get from the console driver if hvc_poll is
|
|
|
+ * called from driver (and can't sleep). Any more than this and we break
|
|
|
+ * and start polling with khvcd. This value was derived from from an OpenBMC
|
|
|
+ * console with the OPAL driver that results in about 0.25ms interrupts off
|
|
|
+ * latency.
|
|
|
+ */
|
|
|
+#define HVC_ATOMIC_READ_MAX 128
|
|
|
+
|
|
|
#define HVC_POLL_READ 0x00000001
|
|
|
#define HVC_POLL_WRITE 0x00000002
|
|
|
|
|
@@ -669,8 +678,8 @@ static int __hvc_poll(struct hvc_struct *hp, bool may_sleep)
|
|
|
if (!hp->irq_requested)
|
|
|
poll_mask |= HVC_POLL_READ;
|
|
|
|
|
|
+ read_again:
|
|
|
/* Read data if any */
|
|
|
-
|
|
|
count = tty_buffer_request_room(&hp->port, N_INBUF);
|
|
|
|
|
|
/* If flip is full, just reschedule a later read */
|
|
@@ -717,7 +726,18 @@ static int __hvc_poll(struct hvc_struct *hp, bool may_sleep)
|
|
|
#endif /* CONFIG_MAGIC_SYSRQ */
|
|
|
tty_insert_flip_char(&hp->port, buf[i], 0);
|
|
|
}
|
|
|
- read_total = n;
|
|
|
+ read_total += n;
|
|
|
+
|
|
|
+ if (may_sleep) {
|
|
|
+ /* Keep going until the flip is full */
|
|
|
+ spin_unlock_irqrestore(&hp->lock, flags);
|
|
|
+ cond_resched();
|
|
|
+ spin_lock_irqsave(&hp->lock, flags);
|
|
|
+ goto read_again;
|
|
|
+ } else if (read_total < HVC_ATOMIC_READ_MAX) {
|
|
|
+ /* Break and defer if it's a large read in atomic */
|
|
|
+ goto read_again;
|
|
|
+ }
|
|
|
|
|
|
/*
|
|
|
* Latency break, schedule another poll immediately.
|