um: Make line/tty semantics use true write IRQ
authorAnton Ivanov <anton.ivanov@cambridgegreys.com>
Tue, 25 Sep 2018 07:47:13 +0000 (08:47 +0100)
committerRichard Weinberger <richard@nod.at>
Mon, 29 Oct 2018 21:34:16 +0000 (22:34 +0100)
This fixes a long standing bug where large amounts of output
could freeze the tty (most commonly seen on stdio console).
While the bug has always been there it became more pronounced
after moving to the new interrupt controller.

The line semantics are now changed to have true IRQ write
semantics which should further improve the tty/line subsystem
stability and performance

Signed-off-by: Anton Ivanov <anton.ivanov@cambridgegreys.com>
Signed-off-by: Richard Weinberger <richard@nod.at>
arch/um/drivers/line.c

index 8d80b27502e6ae4feb235d01801a67be5ca8cce4..7e524efed58484c394beefd2d6d3651ee0eeb5fa 100644 (file)
@@ -261,7 +261,7 @@ static irqreturn_t line_write_interrupt(int irq, void *data)
        if (err == 0) {
                spin_unlock(&line->lock);
                return IRQ_NONE;
-       } else if (err < 0) {
+       } else if ((err < 0) && (err != -EAGAIN)) {
                line->head = line->buffer;
                line->tail = line->buffer;
        }
@@ -284,7 +284,7 @@ int line_setup_irq(int fd, int input, int output, struct line *line, void *data)
        if (err)
                return err;
        if (output)
-               err = um_request_irq(driver->write_irq, fd, IRQ_NONE,
+               err = um_request_irq(driver->write_irq, fd, IRQ_WRITE,
                                     line_write_interrupt, IRQF_SHARED,
                                     driver->write_irq_name, data);
        return err;