Ein neuer TTY-Layer für FreeBSD

Yamagi

Possessed With Psi Powers
Teammitglied
Lange war er gewünscht worden, doch es dauert noch viel länger, bis einer sich seiner annahm. Ich spreche von der vollständigen Überarbeitung des TTY-Layers, die am Ende eine Reimplementierung wurde. In der Vergangenheit war der TTY-Layer eine Quelle ständigen Ärgers, denn er stammt in seinen Grundzügen noch aus dem 1970ern und wurde nie wirklich modernisiert, stattdessen immer nur erweitert, was zu hochkomplexen, chaotischen Code führte. Die Auswirkungen waren recht umfangreich, es begann damit, dass das Hinzufügen neuer Treiber hochkomplex war und daher nur selten gemacht wurde. Hotplugging ging nicht wirklich, weshalb psm(4) zum Beispiel nicht als Modul geladen werden kann. Vor allem war der alte TTY-Layer aber nicht MPSAFE, sprich er hatte die Änderungen im Rahmen von SMPng nicht mitgemacht. Da buchstäblich das halbe System an ihm hängt, war dies ein großes Problem, welches viel Leistung kostete und zu Symptomen wie ruckelnden Mäusen führte. Auch unvergessen ist der unlösbare Fehler nicht löschbarer ptty, der zu den berüchtigten Zombie-Jails führte.
Dies alles ist nun Geschichte, denn heute Morgen hat Ed Schouten seinen neuen TTY-Layer eingefügt, entwickelt wurde er im letzten halben Jahr, gesponster durch Snow B.V.. Er löst alle bekannten Probleme, fügt eine Reihe neuer Features ein und stellt modernen, wartbaren Code da. Zusammen mit modernen Lockstrukturen, Garbage Collection und einer Reihe Optimierungen sollte er auch alle Performanceprobleme lösen. Teils bringt er zudem neugeschriebene, moderne Treiber mit. Noch werden jedoch nicht alle Treiber des alten layers unterstützt, dies soll in den nächsten Wochen und Monaten folgen. Auch Line Disciplines sind (vorerst) nicht mehr unterstützt.

Der Commit:
Code:
From: Ed Schouten <ed@FreeBSD.org>
Date: Wed, 20 Aug 2008 08:31:58 +0000 (UTC)
To: src-committers@FreeBSD.org, cvs-src@FreeBSD.org, cvs-all@FreeBSD.org
Cc:
Subject: cvs commit: src ObsoleteFiles.inc UPDATING src/bin/sh miscbltin.c
        src/etc login.conf src/etc/defaults devfs.rules
        src/lib/libc/stdlib Makefile.inc Symbol.map grantpt.3 ptsname.3
        ptsname.c src/lib/libc/sys Makefile.inc Symbol.map getrlimit.2 ...

ed          2008-08-20 08:31:58 UTC

  FreeBSD src repository

  Modified files:
    .                    ObsoleteFiles.inc UPDATING
    bin/sh               miscbltin.c
    etc                  login.conf
    etc/defaults         devfs.rules
    lib/libc/stdlib      Makefile.inc Symbol.map
    lib/libc/sys         Makefile.inc Symbol.map getrlimit.2
    lib/libutil          login.conf.5 login_class.c
    share/man/man4       Makefile ddb.4 pty.4 termios.4
    sys/amd64/conf       GENERIC                       
    sys/bsm              audit_kevents.h
    sys/compat/freebsd32 freebsd32_syscall.h freebsd32_syscalls.c
                         freebsd32_sysent.c syscalls.master
    sys/compat/linux     linux_ioctl.c linux_stats.c       
    sys/conf             NOTES files options
    sys/dev/dcons        dcons.h dcons_os.c
    sys/dev/nmdm         nmdm.c
    sys/dev/ofw          ofw_console.c
    sys/dev/syscons      schistory.c scmouse.c scterm-sc.c
                         scvesactl.c scvidctl.c syscons.c
                         syscons.h sysmouse.c
    sys/dev/uart         uart_core.c uart_tty.c
    sys/dev/usb          ucom.c ucomvar.h uftdi.c umodem.c
    sys/fs/devfs         devfs_vnops.c
    sys/i386/conf        GENERIC XBOX
    sys/i386/ibcs2       ibcs2_ioctl.c
    sys/ia64/conf        GENERIC SKI
    sys/ia64/ia64        ssc.c
    sys/kern             init_main.c init_sysent.c kern_acct.c
                         kern_conf.c kern_descrip.c kern_exit.c
                         kern_proc.c kern_resource.c subr_prf.c
                         syscalls.c syscalls.master
                         systrace_args.c tty.c tty_compat.c
                         tty_cons.c tty_info.c tty_pts.c tty_pty.c
    sys/modules/nmdm     Makefile
    sys/modules/rc       Makefile
    sys/pc98/cbus        scterm-sck.c
    sys/pc98/conf        GENERIC NOTES
    sys/powerpc/conf     GENERIC      
    sys/sparc64/conf     GENERIC
    sys/sun4v/conf       GENERIC
    sys/sun4v/sun4v      hvcons.c
    sys/sys              conf.h file.h param.h proc.h resource.h
                         resourcevar.h syscall.h syscall.mk
                         sysproto.h termios.h tty.h ttycom.h
                         ttydefaults.h user.h
    usr.bin/fstat        fstat.c
    usr.bin/procstat     procstat.1 procstat_files.c
    usr.sbin/pstat       pstat.8 pstat.c
  Added files:
    lib/libc/stdlib      ptsname.3 ptsname.c
    lib/libc/sys         posix_openpt.2
    share/man/man4       pts.4
    sys/kern             tty_inq.c tty_outq.c tty_ttydisc.c
    sys/sys              ttydevsw.h ttydisc.h ttyqueue.h
  Removed files:
    lib/libc/stdlib      grantpt.3
    sys/kern             tty_conf.c
    sys/sys              linedisc.h
  Log:
  SVN rev 181905 on 2008-08-20 08:31:58Z by ed

  Integrate the new MPSAFE TTY layer to the FreeBSD operating system.

  The last half year I've been working on a replacement TTY layer for the
  FreeBSD kernel. The new TTY layer was designed to improve the following:

  - Improved driver model:

    The old TTY layer has a driver model that is not abstract enough to
    make it friendly to use. A good example is the output path, where the
    device drivers directly access the output buffers. This means that an
    in-kernel PPP implementation must always convert network buffers into
    TTY buffers.

    If a PPP implementation would be built on top of the new TTY layer
    (still needs a hooks layer, though), it would allow the PPP
    implementation to directly hand the data to the TTY driver.

  - Improved hotplugging:

    With the old TTY layer, it isn't entirely safe to destroy TTY's from
    the system. This implementation has a two-step destructing design,  
    where the driver first abandons the TTY. After all threads have left
    the TTY, the TTY layer calls a routine in the driver, which can be  
    used to free resources (unit numbers, etc).

    The pts(4) driver also implements this feature, which means
    posix_openpt() will now return PTY's that are created on the fly.

  - Improved performance:

    One of the major improvements is the per-TTY mutex, which is expected
    to improve scalability when compared to the old Giant locking.       
    Another change is the unbuffered copying to userspace, which is both
    used on TTY device nodes and PTY masters.                           

  Upgrading should be quite straightforward. Unlike previous versions,
  existing kernel configuration files do not need to be changed, except
  when they reference device drivers that are listed in UPDATING.

  Obtained from:          //depot/projects/mpsafetty/...
  Approved by:            philip (ex-mentor)
  Discussed:              on the lists, at BSDCan, at the DevSummit
  Sponsored by:           Snow B.V., the Netherlands               
  dcons(4) fixed by:      kan

  Revision  Changes      Path
  1.155     +3 -0        src/ObsoleteFiles.inc
  1.539     +19 -0       src/UPDATING
  1.36      +4 -1        src/bin/sh/miscbltin.c
  1.6       +2 -1        src/etc/defaults/devfs.rules
  1.52      +1 -0        src/etc/login.conf
  1.55      +6 -6        src/lib/libc/stdlib/Makefile.inc
  1.8       +0 -1        src/lib/libc/stdlib/Symbol.map
  1.4       +0 -225      src/lib/libc/stdlib/grantpt.3 (dead)
  1.1       +160 -0      src/lib/libc/stdlib/ptsname.3 (new)
  1.1       +95 -0       src/lib/libc/stdlib/ptsname.c (new)
  1.137     +2 -2        src/lib/libc/sys/Makefile.inc
  1.18      +1 -0        src/lib/libc/sys/Symbol.map
  1.25      +3 -1        src/lib/libc/sys/getrlimit.2
  1.1       +135 -0      src/lib/libc/sys/posix_openpt.2 (new)
  1.62      +3 -2        src/lib/libutil/login.conf.5
  1.27      +13 -12      src/lib/libutil/login_class.c
  1.426     +1 -0        src/share/man/man4/Makefile
  1.57      +7 -1        src/share/man/man4/ddb.4
  1.1       +181 -0      src/share/man/man4/pts.4 (new)
  1.20      +48 -201     src/share/man/man4/pty.4
  1.34      +20 -4       src/share/man/man4/termios.4
  1.507     +1 -1        src/sys/amd64/conf/GENERIC
  1.14      +1 -0        src/sys/bsm/audit_kevents.h
  1.86      +2 -1        src/sys/compat/freebsd32/freebsd32_syscall.h
  1.77      +1 -0        src/sys/compat/freebsd32/freebsd32_syscalls.c
  1.87      +1 -0        src/sys/compat/freebsd32/freebsd32_sysent.c
  1.102     +1 -0        src/sys/compat/freebsd32/syscalls.master
  1.142     +7 -2        src/sys/compat/linux/linux_ioctl.c
  1.93      +11 -1       src/sys/compat/linux/linux_stats.c
  1.1504    +1 -8        src/sys/conf/NOTES
  1.1331    +5 -3        src/sys/conf/files
  1.636     +1 -1        src/sys/conf/options
  1.7       +1 -1        src/sys/dev/dcons/dcons.h
  1.23      +48 -345     src/sys/dev/dcons/dcons_os.c
  1.41      +158 -252    src/sys/dev/nmdm/nmdm.c
  1.40      +32 -111     src/sys/dev/ofw/ofw_console.c
  1.21      +3 -4        src/sys/dev/syscons/schistory.c
  1.43      +2 -3        src/sys/dev/syscons/scmouse.c
  1.24      +1 -1        src/sys/dev/syscons/scterm-sc.c
  1.26      +4 -8        src/sys/dev/syscons/scvesactl.c           
  1.40      +6 -12       src/sys/dev/syscons/scvidctl.c
  1.461     +156 -171    src/sys/dev/syscons/syscons.c
  1.91      +15 -9       src/sys/dev/syscons/syscons.h
  1.31      +32 -103     src/sys/dev/syscons/sysmouse.c
  1.25      +1 -2        src/sys/dev/uart/uart_core.c  
  1.30      +72 -93      src/sys/dev/uart/uart_tty.c 
  1.67      +131 -203    src/sys/dev/usb/ucom.c
  1.11      +5 -3        src/sys/dev/usb/ucomvar.h
  1.39      +16 -11      src/sys/dev/usb/uftdi.c
  1.72      +2 -2        src/sys/dev/usb/umodem.c
  1.165     +0 -3        src/sys/fs/devfs/devfs_vnops.c
  1.497     +1 -1        src/sys/i386/conf/GENERIC
  1.10      +1 -1        src/sys/i386/conf/XBOX
  1.32      +17 -2       src/sys/i386/ibcs2/ibcs2_ioctl.c
  1.99      +1 -1        src/sys/ia64/conf/GENERIC
  1.26      +1 -1        src/sys/ia64/conf/SKI
  1.31      +40 -100     src/sys/ia64/ia64/ssc.c
  1.294     +1 -1        src/sys/kern/init_main.c
  1.241     +2 -1        src/sys/kern/init_sysent.c
  1.99      +3 -3        src/sys/kern/kern_acct.c
  1.220     +0 -11       src/sys/kern/kern_conf.c
  1.337     +12 -0       src/sys/kern/kern_descrip.c
  1.312     +28 -34      src/sys/kern/kern_exit.c   
  1.266     +30 -27      src/sys/kern/kern_proc.c
  1.190     +25 -0       src/sys/kern/kern_resource.c
  1.131     +14 -10      src/sys/kern/subr_prf.c
  1.225     +2 -1        src/sys/kern/syscalls.c
  1.244     +1 -0        src/sys/kern/syscalls.master
  1.25      +27 -0       src/sys/kern/systrace_args.c
  1.282     +1374 -2852  src/sys/kern/tty.c
  1.40      +32 -23      src/sys/kern/tty_compat.c
  1.25      +0 -205      src/sys/kern/tty_conf.c (dead)
  1.145     +12 -3       src/sys/kern/tty_cons.c       
  1.2       +4 -10       src/sys/kern/tty_info.c
  1.1       +502 -0      src/sys/kern/tty_inq.c (new)
  1.1       +365 -0      src/sys/kern/tty_outq.c (new)
  1.19      +516 -783    src/sys/kern/tty_pts.c
  1.160     +60 -752     src/sys/kern/tty_pty.c
  1.1       +1131 -0     src/sys/kern/tty_ttydisc.c (new)
  1.4       +0 -9        src/sys/modules/nmdm/Makefile
  1.4       +1 -6        src/sys/modules/rc/Makefile
  1.18      +1 -1        src/sys/pc98/cbus/scterm-sck.c
  1.309     +2 -2        src/sys/pc98/conf/GENERIC
  1.93      +1 -1        src/sys/pc98/conf/NOTES
  1.82      +1 -1        src/sys/powerpc/conf/GENERIC
  1.140     +1 -1        src/sys/sparc64/conf/GENERIC
  1.21      +1 -1        src/sys/sun4v/conf/GENERIC
  1.9       +49 -113     src/sys/sun4v/sun4v/hvcons.c  
  1.243     +0 -3        src/sys/sys/conf.h
  1.81      +1 -0        src/sys/sys/file.h
  1.193     +0 -141      src/sys/sys/linedisc.h (dead)
  1.363     +1 -1        src/sys/sys/param.h
  1.518     +4 -5        src/sys/sys/proc.h
  1.33      +2 -1        src/sys/sys/resource.h
  1.54      +2 -0        src/sys/sys/resourcevar.h
  1.222     +3 -2        src/sys/sys/syscall.h
  1.177     +3 -2        src/sys/sys/syscall.mk
  1.226     +6 -1        src/sys/sys/sysproto.h
  1.23      +13 -6       src/sys/sys/termios.h 
  1.104     +5 -18       src/sys/sys/tty.h
  1.28      +2 -1        src/sys/sys/ttycom.h
  1.21      +1 -0        src/sys/sys/ttydefaults.h
  1.1       +158 -0      src/sys/sys/ttydevsw.h (new)
  1.1       +105 -0      src/sys/sys/ttydisc.h (new) 
  1.1       +157 -0      src/sys/sys/ttyqueue.h (new)
  1.77      +1 -0        src/sys/sys/user.h
  1.70      +52 -0       src/usr.bin/fstat/fstat.c
  1.6       +3 -1        src/usr.bin/procstat/procstat.1
  1.7       +5 -0        src/usr.bin/procstat/procstat_files.c
  1.50      +39 -76      src/usr.sbin/pstat/pstat.8           
  1.105     +53 -87      src/usr.sbin/pstat/pstat.c
_______________________________________________
cvs-src@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/cvs-src
To unsubscribe, send any mail to "cvs-src-unsubscribe@freebsd.org"

Robert Watson schrieb:
Many congratulations on a commit that was a long time in coming! We all
really appreciate your picking this up and not only dealing with the
long-standing problem of a lack of MPSAFE tty support, but also in adding
new features such as revised pty code, etc!

Now to exercise it a bit and keep you busy on bizarre tty behavior quirks
for months :-).

Robert N M Watson
Computer Laboratory
University of Cambridge
 
Hm,, weiß jemand, ob es jetzt standardmäßig höhere Auflösungen gibt, oder ob man immernoch SC_PIXEL_WIDTH einbauen muss?
Und kann man dann auch pfeil-nach-links drücken ohne dass der sound stockt :D ?
 
Find ich super, dass endlich was neues da kommt. Das stocken und knispeln der Musik ist/war echt nervig.

Wie weit reicht denn die TTY Implementierung? Ist die schon für die Kernelausgaben verantwortlich oder erst nach dem Kernel? Hängt das mit den Terminals unter X zusammen (rxvt etc.)?

Ich hätte gern 1680x1050 schon bei den Kernel messages :P
 
Ihr verwechselt das. Der TTY-Layer ist simpel gesagt ein Framework, dass kernelinterne Datenstrukturen verwaltet und abstrahiert, sodass die Eingabe und Ausgabe erfolgen kann. Diese macht aber der Layer nicht selbst, stattdessen sind für das, was man am Ende sieht, Treiber verwantwortlich, die in den Layer eingeklingt werden. Stellt es euch wie das VFS vor. Dies selbst macht auch praktisch nichts, es schreibte keine Daten Festplatte, es ließ selbst keine aus, es stellt lediglich eine Zwischenschicht zwischen dem eigentlichen Dateisystem und den höheren Kernelebenen da.
Der neue TTY-Layer ist aus zwei Dingen so wichtig. Einmal erlaubt er eine deutlich schnellere, nicht blockierende Verarbeitung der (Nutzer)eingaben. Bisher war das Problem, dass der TTY-Layer sehr ineffizient war und dazu noch GIANT nutzte. Jeder Zugriff auf ihn tat weh, was gerade die Dinge stark schmerzhaft machte, die den TTY-Layer exzessiv nutzten. Das sind weniger Tastaureingaben oder die Ausgabe auf dem Monitor, sondern Teile des Netgraph-Framework, Serielle Verbindungen aller Art, wie die kaum mehr genutzten PLIP und SLIP, einige PPP-Implementierungen, Teile von USB und so weiter.
Was ihr hier eher ansprecht, ist die Treiberseite. Bis jetzt litten die Treiber darunter, dass sie sehr komplex sein mussten, ja unnötig komplex. Außerdem mussten alle TTY-Treiber den GIANT nutzen. Mit dem neuen Layer wäre es nun theoretisch möglich, einen Konsolentreiber zu schreiben, der anders als der aktuelle Syscons hohe Auflösungen wirklich sinnvoll unterstützt und nicht nur die Hälfte aller Grafikkarten unter FreeBSD/i386 halb. Auch könnte man jetzt einen Treiber bauen, der beim Crash während X.org läuft, in die Konsole zurückwechselt. Das Ruckeln des Sounds ist auch so eine Sache. Es kam daher, dass mehrere Giants parallel um das System kämpften, wenn die TTY-Treiber erstmal giantfrei sind, dürfte es Geschichte sein. Auch das gute, alte Mausruckeln ist nun endlich lösbar. Bis jetzt musste jede Eingabe der Muas zweimal durch den TTY-Layer, was zu viermal GIANT parallel führte: Maustreiber wie ums(4) oder psm(4) -> TTY-Layer -> moused -> TTY-Layer -> sysmoused. Ohne moused ging es oftmals besser, da man sich zweimal GIANT sparte. Noch sieht man davon freilich nicht viel, denn die Treiber werden erst im Laufe der nächsten Wochen und Monate angepasst. Man wird sicher auch erst versuchen die nun defekten Treiber wie digi(4) zu reparieren, bevor man andere funktionierende portiert. Auch erlaubt der neue TTY-Layer endlich seit Jahren giantfreie Treiber auch als solche zu nutzen, wie mem(4).
Die Terminals unter X sind auch daran beteiligt. Sie nutzen sogenannte Pseudo-TTYs zur Kommunikation mitz dem Kernel, bis jetzt eine einzige Katastrophe. Im neuen Layer deutlich sauberer implementiert, inklusive Grabage Collection, welche nicht benötigte PTTY in jedem Fall aus dem System entfernen kann. Bisher blieben sie unter Umständen bis zu allen Ewigkeiten im System, was bei sehr langen laufzeiten Probleme machen konnte und u.a. auch zu den Zombie-Jails führte. X.org selbst läuft übrigens auch in abgeschalteten TTY, was wiederrum den TTY-Layer involviert.
 
Oder die Notwendigkeit, wie man's sieht.

Aber es führt eben kein Weg daran vorbei GIANT rauszuschmeißen. Je mehr das System auf SMP-Betrieb getrimmt wird desto mehr schadet es.
 
Zurück
Oben