tty_ldisc.c (fe56097b23b1303b894eefd91582e4a64247d03f) | tty_ldisc.c (89c8d91e31f267703e365593f6bfebb9f6d2ad01) |
---|---|
1#include <linux/types.h> 2#include <linux/errno.h> 3#include <linux/kmod.h> 4#include <linux/sched.h> 5#include <linux/interrupt.h> 6#include <linux/tty.h> 7#include <linux/tty_driver.h> 8#include <linux/file.h> --- 399 unchanged lines hidden (view full) --- 408 * any harm. 409 * 410 * Locking: takes termios_mutex 411 */ 412 413static void tty_set_termios_ldisc(struct tty_struct *tty, int num) 414{ 415 mutex_lock(&tty->termios_mutex); | 1#include <linux/types.h> 2#include <linux/errno.h> 3#include <linux/kmod.h> 4#include <linux/sched.h> 5#include <linux/interrupt.h> 6#include <linux/tty.h> 7#include <linux/tty_driver.h> 8#include <linux/file.h> --- 399 unchanged lines hidden (view full) --- 408 * any harm. 409 * 410 * Locking: takes termios_mutex 411 */ 412 413static void tty_set_termios_ldisc(struct tty_struct *tty, int num) 414{ 415 mutex_lock(&tty->termios_mutex); |
416 tty->termios->c_line = num; | 416 tty->termios.c_line = num; |
417 mutex_unlock(&tty->termios_mutex); 418} 419 420/** 421 * tty_ldisc_open - open a line discipline 422 * @tty: tty we are opening the ldisc on 423 * @ld: discipline to open 424 * --- 138 unchanged lines hidden (view full) --- 563 struct tty_ldisc *o_ldisc, *new_ldisc; 564 int work, o_work = 0; 565 struct tty_struct *o_tty; 566 567 new_ldisc = tty_ldisc_get(ldisc); 568 if (IS_ERR(new_ldisc)) 569 return PTR_ERR(new_ldisc); 570 | 417 mutex_unlock(&tty->termios_mutex); 418} 419 420/** 421 * tty_ldisc_open - open a line discipline 422 * @tty: tty we are opening the ldisc on 423 * @ld: discipline to open 424 * --- 138 unchanged lines hidden (view full) --- 563 struct tty_ldisc *o_ldisc, *new_ldisc; 564 int work, o_work = 0; 565 struct tty_struct *o_tty; 566 567 new_ldisc = tty_ldisc_get(ldisc); 568 if (IS_ERR(new_ldisc)) 569 return PTR_ERR(new_ldisc); 570 |
571 tty_lock(); | 571 tty_lock(tty); |
572 /* 573 * We need to look at the tty locking here for pty/tty pairs 574 * when both sides try to change in parallel. 575 */ 576 577 o_tty = tty->link; /* o_tty is the pty side or NULL */ 578 579 580 /* 581 * Check the no-op case 582 */ 583 584 if (tty->ldisc->ops->num == ldisc) { | 572 /* 573 * We need to look at the tty locking here for pty/tty pairs 574 * when both sides try to change in parallel. 575 */ 576 577 o_tty = tty->link; /* o_tty is the pty side or NULL */ 578 579 580 /* 581 * Check the no-op case 582 */ 583 584 if (tty->ldisc->ops->num == ldisc) { |
585 tty_unlock(); | 585 tty_unlock(tty); |
586 tty_ldisc_put(new_ldisc); 587 return 0; 588 } 589 | 586 tty_ldisc_put(new_ldisc); 587 return 0; 588 } 589 |
590 tty_unlock(); | 590 tty_unlock(tty); |
591 /* 592 * Problem: What do we do if this blocks ? 593 * We could deadlock here 594 */ 595 596 tty_wait_until_sent(tty, 0); 597 | 591 /* 592 * Problem: What do we do if this blocks ? 593 * We could deadlock here 594 */ 595 596 tty_wait_until_sent(tty, 0); 597 |
598 tty_lock(); | 598 tty_lock(tty); |
599 mutex_lock(&tty->ldisc_mutex); 600 601 /* 602 * We could be midstream of another ldisc change which has 603 * dropped the lock during processing. If so we need to wait. 604 */ 605 606 while (test_bit(TTY_LDISC_CHANGING, &tty->flags)) { 607 mutex_unlock(&tty->ldisc_mutex); | 599 mutex_lock(&tty->ldisc_mutex); 600 601 /* 602 * We could be midstream of another ldisc change which has 603 * dropped the lock during processing. If so we need to wait. 604 */ 605 606 while (test_bit(TTY_LDISC_CHANGING, &tty->flags)) { 607 mutex_unlock(&tty->ldisc_mutex); |
608 tty_unlock(); | 608 tty_unlock(tty); |
609 wait_event(tty_ldisc_wait, 610 test_bit(TTY_LDISC_CHANGING, &tty->flags) == 0); | 609 wait_event(tty_ldisc_wait, 610 test_bit(TTY_LDISC_CHANGING, &tty->flags) == 0); |
611 tty_lock(); | 611 tty_lock(tty); |
612 mutex_lock(&tty->ldisc_mutex); 613 } 614 615 set_bit(TTY_LDISC_CHANGING, &tty->flags); 616 617 /* 618 * No more input please, we are switching. The new ldisc 619 * will update this value in the ldisc open function 620 */ 621 622 tty->receive_room = 0; 623 624 o_ldisc = tty->ldisc; 625 | 612 mutex_lock(&tty->ldisc_mutex); 613 } 614 615 set_bit(TTY_LDISC_CHANGING, &tty->flags); 616 617 /* 618 * No more input please, we are switching. The new ldisc 619 * will update this value in the ldisc open function 620 */ 621 622 tty->receive_room = 0; 623 624 o_ldisc = tty->ldisc; 625 |
626 tty_unlock(); | 626 tty_unlock(tty); |
627 /* 628 * Make sure we don't change while someone holds a 629 * reference to the line discipline. The TTY_LDISC bit 630 * prevents anyone taking a reference once it is clear. 631 * We need the lock to avoid racing reference takers. 632 * 633 * We must clear the TTY_LDISC bit here to avoid a livelock 634 * with a userspace app continually trying to use the tty in --- 10 unchanged lines hidden (view full) --- 645 */ 646 647 mutex_unlock(&tty->ldisc_mutex); 648 649 tty_ldisc_flush_works(tty); 650 651 retval = tty_ldisc_wait_idle(tty, 5 * HZ); 652 | 627 /* 628 * Make sure we don't change while someone holds a 629 * reference to the line discipline. The TTY_LDISC bit 630 * prevents anyone taking a reference once it is clear. 631 * We need the lock to avoid racing reference takers. 632 * 633 * We must clear the TTY_LDISC bit here to avoid a livelock 634 * with a userspace app continually trying to use the tty in --- 10 unchanged lines hidden (view full) --- 645 */ 646 647 mutex_unlock(&tty->ldisc_mutex); 648 649 tty_ldisc_flush_works(tty); 650 651 retval = tty_ldisc_wait_idle(tty, 5 * HZ); 652 |
653 tty_lock(); | 653 tty_lock(tty); |
654 mutex_lock(&tty->ldisc_mutex); 655 656 /* handle wait idle failure locked */ 657 if (retval) { 658 tty_ldisc_put(new_ldisc); 659 goto enable; 660 } 661 662 if (test_bit(TTY_HUPPING, &tty->flags)) { 663 /* We were raced by the hangup method. It will have stomped 664 the ldisc data and closed the ldisc down */ 665 clear_bit(TTY_LDISC_CHANGING, &tty->flags); 666 mutex_unlock(&tty->ldisc_mutex); 667 tty_ldisc_put(new_ldisc); | 654 mutex_lock(&tty->ldisc_mutex); 655 656 /* handle wait idle failure locked */ 657 if (retval) { 658 tty_ldisc_put(new_ldisc); 659 goto enable; 660 } 661 662 if (test_bit(TTY_HUPPING, &tty->flags)) { 663 /* We were raced by the hangup method. It will have stomped 664 the ldisc data and closed the ldisc down */ 665 clear_bit(TTY_LDISC_CHANGING, &tty->flags); 666 mutex_unlock(&tty->ldisc_mutex); 667 tty_ldisc_put(new_ldisc); |
668 tty_unlock(); | 668 tty_unlock(tty); |
669 return -EIO; 670 } 671 672 /* Shutdown the current discipline. */ 673 tty_ldisc_close(tty, o_ldisc); 674 675 /* Now set up the new line discipline. */ 676 tty_ldisc_assign(tty, new_ldisc); --- 26 unchanged lines hidden (view full) --- 703 704 /* Restart the work queue in case no characters kick it off. Safe if 705 already running */ 706 if (work) 707 schedule_work(&tty->buf.work); 708 if (o_work) 709 schedule_work(&o_tty->buf.work); 710 mutex_unlock(&tty->ldisc_mutex); | 669 return -EIO; 670 } 671 672 /* Shutdown the current discipline. */ 673 tty_ldisc_close(tty, o_ldisc); 674 675 /* Now set up the new line discipline. */ 676 tty_ldisc_assign(tty, new_ldisc); --- 26 unchanged lines hidden (view full) --- 703 704 /* Restart the work queue in case no characters kick it off. Safe if 705 already running */ 706 if (work) 707 schedule_work(&tty->buf.work); 708 if (o_work) 709 schedule_work(&o_tty->buf.work); 710 mutex_unlock(&tty->ldisc_mutex); |
711 tty_unlock(); | 711 tty_unlock(tty); |
712 return retval; 713} 714 715/** 716 * tty_reset_termios - reset terminal state 717 * @tty: tty to reset 718 * 719 * Restore a terminal to the driver default state. 720 */ 721 722static void tty_reset_termios(struct tty_struct *tty) 723{ 724 mutex_lock(&tty->termios_mutex); | 712 return retval; 713} 714 715/** 716 * tty_reset_termios - reset terminal state 717 * @tty: tty to reset 718 * 719 * Restore a terminal to the driver default state. 720 */ 721 722static void tty_reset_termios(struct tty_struct *tty) 723{ 724 mutex_lock(&tty->termios_mutex); |
725 *tty->termios = tty->driver->init_termios; 726 tty->termios->c_ispeed = tty_termios_input_baud_rate(tty->termios); 727 tty->termios->c_ospeed = tty_termios_baud_rate(tty->termios); | 725 tty->termios = tty->driver->init_termios; 726 tty->termios.c_ispeed = tty_termios_input_baud_rate(&tty->termios); 727 tty->termios.c_ospeed = tty_termios_baud_rate(&tty->termios); |
728 mutex_unlock(&tty->termios_mutex); 729} 730 731 732/** 733 * tty_ldisc_reinit - reinitialise the tty ldisc 734 * @tty: tty to reinit 735 * @ldisc: line discipline to reinitialize --- 75 unchanged lines hidden (view full) --- 811 mutex_lock(&tty->ldisc_mutex); 812 813 /* 814 * this is like tty_ldisc_halt, but we need to give up 815 * the BTM before calling cancel_work_sync, which may 816 * need to wait for another function taking the BTM 817 */ 818 clear_bit(TTY_LDISC, &tty->flags); | 728 mutex_unlock(&tty->termios_mutex); 729} 730 731 732/** 733 * tty_ldisc_reinit - reinitialise the tty ldisc 734 * @tty: tty to reinit 735 * @ldisc: line discipline to reinitialize --- 75 unchanged lines hidden (view full) --- 811 mutex_lock(&tty->ldisc_mutex); 812 813 /* 814 * this is like tty_ldisc_halt, but we need to give up 815 * the BTM before calling cancel_work_sync, which may 816 * need to wait for another function taking the BTM 817 */ 818 clear_bit(TTY_LDISC, &tty->flags); |
819 tty_unlock(); | 819 tty_unlock(tty); |
820 cancel_work_sync(&tty->buf.work); 821 mutex_unlock(&tty->ldisc_mutex); 822retry: | 820 cancel_work_sync(&tty->buf.work); 821 mutex_unlock(&tty->ldisc_mutex); 822retry: |
823 tty_lock(); | 823 tty_lock(tty); |
824 mutex_lock(&tty->ldisc_mutex); 825 826 /* At this point we have a closed ldisc and we want to 827 reopen it. We could defer this to the next open but 828 it means auditing a lot of other paths so this is 829 a FIXME */ 830 if (tty->ldisc) { /* Not yet closed */ 831 if (atomic_read(&tty->ldisc->users) != 1) { 832 char cur_n[TASK_COMM_LEN], tty_n[64]; 833 long timeout = 3 * HZ; | 824 mutex_lock(&tty->ldisc_mutex); 825 826 /* At this point we have a closed ldisc and we want to 827 reopen it. We could defer this to the next open but 828 it means auditing a lot of other paths so this is 829 a FIXME */ 830 if (tty->ldisc) { /* Not yet closed */ 831 if (atomic_read(&tty->ldisc->users) != 1) { 832 char cur_n[TASK_COMM_LEN], tty_n[64]; 833 long timeout = 3 * HZ; |
834 tty_unlock(); | 834 tty_unlock(tty); |
835 836 while (tty_ldisc_wait_idle(tty, timeout) == -EBUSY) { 837 timeout = MAX_SCHEDULE_TIMEOUT; 838 printk_ratelimited(KERN_WARNING 839 "%s: waiting (%s) for %s took too long, but we keep waiting...\n", 840 __func__, get_task_comm(cur_n, current), 841 tty_name(tty, tty_n)); 842 } 843 mutex_unlock(&tty->ldisc_mutex); 844 goto retry; 845 } 846 847 if (reset == 0) { 848 | 835 836 while (tty_ldisc_wait_idle(tty, timeout) == -EBUSY) { 837 timeout = MAX_SCHEDULE_TIMEOUT; 838 printk_ratelimited(KERN_WARNING 839 "%s: waiting (%s) for %s took too long, but we keep waiting...\n", 840 __func__, get_task_comm(cur_n, current), 841 tty_name(tty, tty_n)); 842 } 843 mutex_unlock(&tty->ldisc_mutex); 844 goto retry; 845 } 846 847 if (reset == 0) { 848 |
849 if (!tty_ldisc_reinit(tty, tty->termios->c_line)) | 849 if (!tty_ldisc_reinit(tty, tty->termios.c_line)) |
850 err = tty_ldisc_open(tty, tty->ldisc); 851 else 852 err = 1; 853 } 854 /* If the re-open fails or we reset then go to N_TTY. The 855 N_TTY open cannot fail */ 856 if (reset || err) { 857 BUG_ON(tty_ldisc_reinit(tty, N_TTY)); --- 31 unchanged lines hidden (view full) --- 889 tty_ldisc_close(tty, ld); 890 return retval; 891 } 892 tty_ldisc_enable(o_tty); 893 } 894 tty_ldisc_enable(tty); 895 return 0; 896} | 850 err = tty_ldisc_open(tty, tty->ldisc); 851 else 852 err = 1; 853 } 854 /* If the re-open fails or we reset then go to N_TTY. The 855 N_TTY open cannot fail */ 856 if (reset || err) { 857 BUG_ON(tty_ldisc_reinit(tty, N_TTY)); --- 31 unchanged lines hidden (view full) --- 889 tty_ldisc_close(tty, ld); 890 return retval; 891 } 892 tty_ldisc_enable(o_tty); 893 } 894 tty_ldisc_enable(tty); 895 return 0; 896} |
897 898static void tty_ldisc_kill(struct tty_struct *tty) 899{ 900 mutex_lock(&tty->ldisc_mutex); 901 /* 902 * Now kill off the ldisc 903 */ 904 tty_ldisc_close(tty, tty->ldisc); 905 tty_ldisc_put(tty->ldisc); 906 /* Force an oops if we mess this up */ 907 tty->ldisc = NULL; 908 909 /* Ensure the next open requests the N_TTY ldisc */ 910 tty_set_termios_ldisc(tty, N_TTY); 911 mutex_unlock(&tty->ldisc_mutex); 912} 913 |
|
897/** 898 * tty_ldisc_release - release line discipline 899 * @tty: tty being shut down 900 * @o_tty: pair tty for pty/tty pairs 901 * 902 * Called during the final close of a tty/pty pair in order to shut down 903 * the line discpline layer. On exit the ldisc assigned is N_TTY and the 904 * ldisc has not been opened. 905 */ 906 907void tty_ldisc_release(struct tty_struct *tty, struct tty_struct *o_tty) 908{ 909 /* 910 * Prevent flush_to_ldisc() from rescheduling the work for later. Then 911 * kill any delayed work. As this is the final close it does not 912 * race with the set_ldisc code path. 913 */ 914 | 914/** 915 * tty_ldisc_release - release line discipline 916 * @tty: tty being shut down 917 * @o_tty: pair tty for pty/tty pairs 918 * 919 * Called during the final close of a tty/pty pair in order to shut down 920 * the line discpline layer. On exit the ldisc assigned is N_TTY and the 921 * ldisc has not been opened. 922 */ 923 924void tty_ldisc_release(struct tty_struct *tty, struct tty_struct *o_tty) 925{ 926 /* 927 * Prevent flush_to_ldisc() from rescheduling the work for later. Then 928 * kill any delayed work. As this is the final close it does not 929 * race with the set_ldisc code path. 930 */ 931 |
915 tty_unlock(); | 932 tty_lock_pair(tty, o_tty); |
916 tty_ldisc_halt(tty); 917 tty_ldisc_flush_works(tty); | 933 tty_ldisc_halt(tty); 934 tty_ldisc_flush_works(tty); |
918 tty_lock(); | 935 if (o_tty) { 936 tty_ldisc_halt(o_tty); 937 tty_ldisc_flush_works(o_tty); 938 } |
919 | 939 |
920 mutex_lock(&tty->ldisc_mutex); 921 /* 922 * Now kill off the ldisc 923 */ 924 tty_ldisc_close(tty, tty->ldisc); 925 tty_ldisc_put(tty->ldisc); 926 /* Force an oops if we mess this up */ 927 tty->ldisc = NULL; 928 929 /* Ensure the next open requests the N_TTY ldisc */ 930 tty_set_termios_ldisc(tty, N_TTY); 931 mutex_unlock(&tty->ldisc_mutex); 932 | |
933 /* This will need doing differently if we need to lock */ | 940 /* This will need doing differently if we need to lock */ |
941 tty_ldisc_kill(tty); 942 |
|
934 if (o_tty) | 943 if (o_tty) |
935 tty_ldisc_release(o_tty, NULL); | 944 tty_ldisc_kill(o_tty); |
936 | 945 |
946 tty_unlock_pair(tty, o_tty); |
|
937 /* And the memory resources remaining (buffers, termios) will be 938 disposed of when the kref hits zero */ 939} 940 941/** 942 * tty_ldisc_init - ldisc setup for new tty 943 * @tty: tty being allocated 944 * --- 30 unchanged lines hidden --- | 947 /* And the memory resources remaining (buffers, termios) will be 948 disposed of when the kref hits zero */ 949} 950 951/** 952 * tty_ldisc_init - ldisc setup for new tty 953 * @tty: tty being allocated 954 * --- 30 unchanged lines hidden --- |