kvm,8250: Fix "too much work for irq4" problems

This patch fixes the "too much work for irq4" problems caused by the fact that
we never set the UART_IIR_NO_INT flag in the emulation layer. This makes the
interrupt handler in the guest kernel process as much as possible which
triggers a warning.

Signed-off-by: Pekka Enberg <penberg@kernel.org>
This commit is contained in:
Pekka Enberg
2015-06-01 16:39:41 +01:00
committed by Will Deacon
parent e62c18de54
commit 133bedc1b8
+13
View File
@@ -23,6 +23,8 @@ struct serial8250_device {
uint8_t mcr;
uint8_t lsr;
uint8_t scr;
uint8_t counter;
};
static struct serial8250_device devices[] = {
@@ -37,11 +39,15 @@ static struct serial8250_device devices[] = {
[1] = {
.iobase = 0x2f8,
.irq = 3,
.iir = UART_IIR_NO_INT,
},
/* ttyS2 */
[2] = {
.iobase = 0x3e8,
.irq = 4,
.iir = UART_IIR_NO_INT,
},
};
@@ -158,6 +164,11 @@ static bool serial8250_out(struct kvm *self, uint16_t port, void *data, int size
}
fflush(stdout);
if (dev->counter++ > 10) {
dev->iir = UART_IIR_NO_INT;
dev->counter = 0;
}
break;
}
case UART_IER:
@@ -200,6 +211,8 @@ static bool serial8250_in(struct kvm *self, uint16_t port, void *data, int size,
switch (offset) {
case UART_TX:
if (dev->lsr & UART_LSR_DR) {
dev->iir = UART_IIR_NO_INT;
dev->lsr &= ~UART_LSR_DR;
ioport__write8(data, dev->thr);
}