summaryrefslogtreecommitdiffstats
path: root/arch/um/drivers
diff options
context:
space:
mode:
authorAnton Ivanov <anton.ivanov@cambridgegreys.com>2018-09-25 03:47:13 -0400
committerRichard Weinberger <richard@nod.at>2018-10-29 17:34:16 -0400
commit917e2fd2c53eb3c4162f5397555cbd394390d4bc (patch)
treeaf60a713b762c7915fa44792ed9ef4f25ff766be /arch/um/drivers
parent59fdf91d90e62cc4e2f665d7de963c0d385afd09 (diff)
um: Make line/tty semantics use true write IRQ
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>
Diffstat (limited to 'arch/um/drivers')
-rw-r--r--arch/um/drivers/line.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/arch/um/drivers/line.c b/arch/um/drivers/line.c
index 8d80b27502e6..7e524efed584 100644
--- a/arch/um/drivers/line.c
+++ b/arch/um/drivers/line.c
@@ -261,7 +261,7 @@ static irqreturn_t line_write_interrupt(int irq, void *data)
261 if (err == 0) { 261 if (err == 0) {
262 spin_unlock(&line->lock); 262 spin_unlock(&line->lock);
263 return IRQ_NONE; 263 return IRQ_NONE;
264 } else if (err < 0) { 264 } else if ((err < 0) && (err != -EAGAIN)) {
265 line->head = line->buffer; 265 line->head = line->buffer;
266 line->tail = line->buffer; 266 line->tail = line->buffer;
267 } 267 }
@@ -284,7 +284,7 @@ int line_setup_irq(int fd, int input, int output, struct line *line, void *data)
284 if (err) 284 if (err)
285 return err; 285 return err;
286 if (output) 286 if (output)
287 err = um_request_irq(driver->write_irq, fd, IRQ_NONE, 287 err = um_request_irq(driver->write_irq, fd, IRQ_WRITE,
288 line_write_interrupt, IRQF_SHARED, 288 line_write_interrupt, IRQF_SHARED,
289 driver->write_irq_name, data); 289 driver->write_irq_name, data);
290 return err; 290 return err;