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 ---