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