diff options
author | Milton Miller <miltonm@bga.com> | 2005-07-07 20:56:18 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2005-07-07 21:23:38 -0400 |
commit | 8b67f8c177a642b35b7a05f530c12ef2834ef182 (patch) | |
tree | f1e0b3fc48737ccb8f88dd50f16721dec9ff97d8 /drivers/char | |
parent | 6f24808eeb54eed5994128a863cd25c40f36cfac (diff) |
[PATCH] hvc_console: Dont always kick the poll thread in interrupt
Have the hvc console code try to pull characters immediately when receiving an
interrupt, and kick the poll thread only if the immediate poll indicates it
needed a call back to do more work.
Signed-off-by: Milton Miller <miltonm@bga.com>
Signed-off-by: Anton Blanchard <anton@samba.org>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'drivers/char')
-rw-r--r-- | drivers/char/hvc_console.c | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/drivers/char/hvc_console.c b/drivers/char/hvc_console.c index 4b776f4eb467..46508a737064 100644 --- a/drivers/char/hvc_console.c +++ b/drivers/char/hvc_console.c | |||
@@ -254,13 +254,17 @@ static void hvc_kick(void) | |||
254 | wake_up_process(hvc_task); | 254 | wake_up_process(hvc_task); |
255 | } | 255 | } |
256 | 256 | ||
257 | static int hvc_poll(struct hvc_struct *hp); | ||
258 | |||
257 | /* | 259 | /* |
258 | * NOTE: This API isn't used if the console adapter doesn't support interrupts. | 260 | * NOTE: This API isn't used if the console adapter doesn't support interrupts. |
259 | * In this case the console is poll driven. | 261 | * In this case the console is poll driven. |
260 | */ | 262 | */ |
261 | static irqreturn_t hvc_handle_interrupt(int irq, void *dev_instance, struct pt_regs *regs) | 263 | static irqreturn_t hvc_handle_interrupt(int irq, void *dev_instance, struct pt_regs *regs) |
262 | { | 264 | { |
263 | hvc_kick(); | 265 | /* if hvc_poll request a repoll, then kick the hvcd thread */ |
266 | if (hvc_poll(dev_instance)) | ||
267 | hvc_kick(); | ||
264 | return IRQ_HANDLED; | 268 | return IRQ_HANDLED; |
265 | } | 269 | } |
266 | 270 | ||
@@ -598,8 +602,8 @@ static int hvc_poll(struct hvc_struct *hp) | |||
598 | 602 | ||
599 | /* | 603 | /* |
600 | * Account for the total amount read in one loop, and if above | 604 | * Account for the total amount read in one loop, and if above |
601 | * 64 bytes, we do a quick schedule loop to let the tty grok the | 605 | * 64 bytes, we do a quick schedule loop to let the tty grok |
602 | * data and eventually throttle us. | 606 | * the data and eventually throttle us. |
603 | */ | 607 | */ |
604 | read_total += n; | 608 | read_total += n; |
605 | if (read_total >= 64) { | 609 | if (read_total >= 64) { |