diff options
Diffstat (limited to 'drivers/char/hvc_console.c')
| -rw-r--r-- | drivers/char/hvc_console.c | 49 |
1 files changed, 34 insertions, 15 deletions
diff --git a/drivers/char/hvc_console.c b/drivers/char/hvc_console.c index a0a88aa23f5b..0f9ed7b46a6d 100644 --- a/drivers/char/hvc_console.c +++ b/drivers/char/hvc_console.c | |||
| @@ -47,8 +47,6 @@ | |||
| 47 | #define HVC_MAJOR 229 | 47 | #define HVC_MAJOR 229 |
| 48 | #define HVC_MINOR 0 | 48 | #define HVC_MINOR 0 |
| 49 | 49 | ||
| 50 | #define TIMEOUT (10) | ||
| 51 | |||
| 52 | /* | 50 | /* |
| 53 | * Wait this long per iteration while trying to push buffered data to the | 51 | * Wait this long per iteration while trying to push buffered data to the |
| 54 | * hypervisor before allowing the tty to complete a close operation. | 52 | * hypervisor before allowing the tty to complete a close operation. |
| @@ -104,12 +102,12 @@ static DEFINE_SPINLOCK(hvc_structs_lock); | |||
| 104 | /* | 102 | /* |
| 105 | * This value is used to assign a tty->index value to a hvc_struct based | 103 | * This value is used to assign a tty->index value to a hvc_struct based |
| 106 | * upon order of exposure via hvc_probe(), when we can not match it to | 104 | * upon order of exposure via hvc_probe(), when we can not match it to |
| 107 | * a console canidate registered with hvc_instantiate(). | 105 | * a console candidate registered with hvc_instantiate(). |
| 108 | */ | 106 | */ |
| 109 | static int last_hvc = -1; | 107 | static int last_hvc = -1; |
| 110 | 108 | ||
| 111 | /* | 109 | /* |
| 112 | * Do not call this function with either the hvc_strucst_lock or the hvc_struct | 110 | * Do not call this function with either the hvc_structs_lock or the hvc_struct |
| 113 | * lock held. If successful, this function increments the kobject reference | 111 | * lock held. If successful, this function increments the kobject reference |
| 114 | * count against the target hvc_struct so it should be released when finished. | 112 | * count against the target hvc_struct so it should be released when finished. |
| 115 | */ | 113 | */ |
| @@ -162,7 +160,7 @@ void hvc_console_print(struct console *co, const char *b, unsigned count) | |||
| 162 | if (index >= MAX_NR_HVC_CONSOLES) | 160 | if (index >= MAX_NR_HVC_CONSOLES) |
| 163 | return; | 161 | return; |
| 164 | 162 | ||
| 165 | /* This console adapter was removed so it is not useable. */ | 163 | /* This console adapter was removed so it is not usable. */ |
| 166 | if (vtermnos[index] < 0) | 164 | if (vtermnos[index] < 0) |
| 167 | return; | 165 | return; |
| 168 | 166 | ||
| @@ -220,7 +218,7 @@ struct console hvc_con_driver = { | |||
| 220 | }; | 218 | }; |
| 221 | 219 | ||
| 222 | /* | 220 | /* |
| 223 | * Early console initialization. Preceeds driver initialization. | 221 | * Early console initialization. Precedes driver initialization. |
| 224 | * | 222 | * |
| 225 | * (1) we are first, and the user specified another driver | 223 | * (1) we are first, and the user specified another driver |
| 226 | * -- index will remain -1 | 224 | * -- index will remain -1 |
| @@ -257,7 +255,7 @@ int hvc_instantiate(uint32_t vtermno, int index, struct hv_ops *ops) | |||
| 257 | if (vtermnos[index] != -1) | 255 | if (vtermnos[index] != -1) |
| 258 | return -1; | 256 | return -1; |
| 259 | 257 | ||
| 260 | /* make sure no no tty has been registerd in this index */ | 258 | /* make sure no no tty has been registered in this index */ |
| 261 | hp = hvc_get_by_index(index); | 259 | hp = hvc_get_by_index(index); |
| 262 | if (hp) { | 260 | if (hp) { |
| 263 | kobject_put(&hp->kobj); | 261 | kobject_put(&hp->kobj); |
| @@ -267,7 +265,7 @@ int hvc_instantiate(uint32_t vtermno, int index, struct hv_ops *ops) | |||
| 267 | vtermnos[index] = vtermno; | 265 | vtermnos[index] = vtermno; |
| 268 | cons_ops[index] = ops; | 266 | cons_ops[index] = ops; |
| 269 | 267 | ||
| 270 | /* reserve all indices upto and including this index */ | 268 | /* reserve all indices up to and including this index */ |
| 271 | if (last_hvc < index) | 269 | if (last_hvc < index) |
| 272 | last_hvc = index; | 270 | last_hvc = index; |
| 273 | 271 | ||
| @@ -528,7 +526,7 @@ static int hvc_write(struct tty_struct *tty, const unsigned char *buf, int count | |||
| 528 | 526 | ||
| 529 | /* | 527 | /* |
| 530 | * This is actually a contract between the driver and the tty layer outlining | 528 | * This is actually a contract between the driver and the tty layer outlining |
| 531 | * how much write room the driver can guarentee will be sent OR BUFFERED. This | 529 | * how much write room the driver can guarantee will be sent OR BUFFERED. This |
| 532 | * driver MUST honor the return value. | 530 | * driver MUST honor the return value. |
| 533 | */ | 531 | */ |
| 534 | static int hvc_write_room(struct tty_struct *tty) | 532 | static int hvc_write_room(struct tty_struct *tty) |
| @@ -550,6 +548,18 @@ static int hvc_chars_in_buffer(struct tty_struct *tty) | |||
| 550 | return hp->n_outbuf; | 548 | return hp->n_outbuf; |
| 551 | } | 549 | } |
| 552 | 550 | ||
| 551 | /* | ||
| 552 | * timeout will vary between the MIN and MAX values defined here. By default | ||
| 553 | * and during console activity we will use a default MIN_TIMEOUT of 10. When | ||
| 554 | * the console is idle, we increase the timeout value on each pass through | ||
| 555 | * msleep until we reach the max. This may be noticeable as a brief (average | ||
| 556 | * one second) delay on the console before the console responds to input when | ||
| 557 | * there has been no input for some time. | ||
| 558 | */ | ||
| 559 | #define MIN_TIMEOUT (10) | ||
| 560 | #define MAX_TIMEOUT (2000) | ||
| 561 | static u32 timeout = MIN_TIMEOUT; | ||
| 562 | |||
| 553 | #define HVC_POLL_READ 0x00000001 | 563 | #define HVC_POLL_READ 0x00000001 |
| 554 | #define HVC_POLL_WRITE 0x00000002 | 564 | #define HVC_POLL_WRITE 0x00000002 |
| 555 | 565 | ||
| @@ -642,9 +652,14 @@ static int hvc_poll(struct hvc_struct *hp) | |||
| 642 | bail: | 652 | bail: |
| 643 | spin_unlock_irqrestore(&hp->lock, flags); | 653 | spin_unlock_irqrestore(&hp->lock, flags); |
| 644 | 654 | ||
| 645 | if (read_total) | 655 | if (read_total) { |
| 656 | /* Activity is occurring, so reset the polling backoff value to | ||
| 657 | a minimum for performance. */ | ||
| 658 | timeout = MIN_TIMEOUT; | ||
| 659 | |||
| 646 | tty_flip_buffer_push(tty); | 660 | tty_flip_buffer_push(tty); |
| 647 | 661 | } | |
| 662 | |||
| 648 | return poll_mask; | 663 | return poll_mask; |
| 649 | } | 664 | } |
| 650 | 665 | ||
| @@ -688,8 +703,12 @@ int khvcd(void *unused) | |||
| 688 | if (!hvc_kicked) { | 703 | if (!hvc_kicked) { |
| 689 | if (poll_mask == 0) | 704 | if (poll_mask == 0) |
| 690 | schedule(); | 705 | schedule(); |
| 691 | else | 706 | else { |
| 692 | msleep_interruptible(TIMEOUT); | 707 | if (timeout < MAX_TIMEOUT) |
| 708 | timeout += (timeout >> 6) + 1; | ||
| 709 | |||
| 710 | msleep_interruptible(timeout); | ||
| 711 | } | ||
| 693 | } | 712 | } |
| 694 | __set_current_state(TASK_RUNNING); | 713 | __set_current_state(TASK_RUNNING); |
| 695 | } while (!kthread_should_stop()); | 714 | } while (!kthread_should_stop()); |
| @@ -794,7 +813,7 @@ int __devexit hvc_remove(struct hvc_struct *hp) | |||
| 794 | 813 | ||
| 795 | /* | 814 | /* |
| 796 | * We 'put' the instance that was grabbed when the kobject instance | 815 | * We 'put' the instance that was grabbed when the kobject instance |
| 797 | * was intialized using kobject_init(). Let the last holder of this | 816 | * was initialized using kobject_init(). Let the last holder of this |
| 798 | * kobject cause it to be removed, which will probably be the tty_hangup | 817 | * kobject cause it to be removed, which will probably be the tty_hangup |
| 799 | * below. | 818 | * below. |
| 800 | */ | 819 | */ |
| @@ -850,7 +869,7 @@ int __init hvc_init(void) | |||
| 850 | } | 869 | } |
| 851 | module_init(hvc_init); | 870 | module_init(hvc_init); |
| 852 | 871 | ||
| 853 | /* This isn't particularily necessary due to this being a console driver | 872 | /* This isn't particularly necessary due to this being a console driver |
| 854 | * but it is nice to be thorough. | 873 | * but it is nice to be thorough. |
| 855 | */ | 874 | */ |
| 856 | static void __exit hvc_exit(void) | 875 | static void __exit hvc_exit(void) |
