mirror of
https://github.com/clearlinux/kvmtool.git
synced 2026-09-04 20:51:28 +00:00
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:
committed by
Will Deacon
parent
e62c18de54
commit
133bedc1b8
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user