On Tue, Sep 01, 2015 at 12:50:16PM +0300, Cyrill Gorcunov wrote: > Previously in commit 8674c044330fad1458bd59b02f9037fb97e8b7af stubs for > virtual terminals have been added, they support writes from kernel side > which simply drops into the void. > > In the patch the code has been moved from kernel/ve/console.c > to drivers/tty/pty.c to reuse a couple of pty helpers. > > Now we support up to MAX_NR_VTTY_CONSOLES virtual consoles inside container. > For /dev/console we reserve the first virtual terminal. > > Some details on the driver itself: > > - The drivers carries per-VE tty instances in @vtty_idr map, once > VE tries to open a terminal we allocate tty map internally and > keep it intact until VE destructed, this allow us to not bind > into device namespaces (ie not rely on tty_class); > > - Unlike buffered IO to unix98 driver once internal port buffer > get full we don't block write operations if there is no reader > assigned yet but zap them. This is done intentionally to behave > closely to native consoles; > > - The kernel choose which VE request terminal using get_exec_env > helper, but for opening master peer from the nodes ve0 it uses > vtty_set_context/vtty_get_context/vtty_drop_context to notify > tty layer which @vtty_idr to use instead of get_exec_env. > > https://jira.sw.ru/browse/PSBM-34533 > https://jira.sw.ru/browse/PSBM-34532 > https://jira.sw.ru/browse/PSBM-34107 > https://jira.sw.ru/browse/PSBM-32686 > https://jira.sw.ru/browse/PSBM-32685 > > v2: > - Rename terminals from vtz to vtty > - Merge code into /drivers/tty/pty.c to reuse some of > pty functionality > - Get rid of two array of indices, use one for master > peers and fetch slaves via @link > - Drop TTY_VT_OPEN and wait() on it > - Add vtty_open_slave helper > > v3: > - Reverse the scheme, the peers opened from inside of > container are the slave peers as it were in pcs6 > - Add vtty_set_context/vtty_drop_context/vtty_get_context > to open needed tty from ve0 context > - In vtty_open_master reuse existing vtty_lookup, vtty_open > helpers > - In ve_vtty_fini zap active tty tracking, such ttys are > sitting here because the node has been opening the console > and didn't release file descriptors yet with tty associated. > The kernel will clean them up once they are closed but the > tacking map pointer should be zapped to escape nil dereference > > v4: > - Use lockdep_assert_held in vtty @map operations to make sure > we're under @tty_mutex > - vtty_install now requests for port memory earlier for vtty_install_peer > simplification > - Drop tty_vhangup call from vtty_close, as been found it doesn't > bring any benefit > - Drop TTY_BUFFER_PAGE and fix typo in vtty_write_room > - Rework tty counting to be the same as in pcs6: drivers > became TTY_DRIVER_TYPE_PTY and @count adjusted accordingly > > v5: > - Treat zero as unused flag in vtty_get_context > - vtty_printk helpers are dropped off > - Don't test for exit state in lookup procedure: the kernel > will do that on its own when slave is opened from inside > of a container and for ioctl call we do such test explicitly > - When pair is to open from the node and the existing peer is > exiting we're allocating new pair early removin old one from > per-VE ttys map, this is done to speedup open from the node > - vtty_match is no longer exported into the rest of the tty code > - When peer is to be closed we use own per-VE spinlock to read > and modify own and peer counters, this is because the general > tty->close routine is called without tty-mutex held and only > one peer is locked thus such modifications are unsafe if do > them locklessly. In current vanilla kernel there is no need > for such lock if Unix ptys are used because master peers are > always opened first and always get closed in constrast to the > our driver where any peer end may be opened sole > > v6: > - Reworked tty counting: no need for extra reference but make > it close to how native Unix98 ptys are working: once master > is opened it takes new TTY_PINNED flags and when it getting > closed with active slave peer we defer tty destruction until > both ends are spare. > > v7: > - Move MAX_NR_VTTY_CONSOLES from header into pty.c > - Drop vtty_zap_tty_map > - Assign @driver_data in vtty_map_set > - Rename vtty_map_del to vtty_map_clear > - Merge map cleaning into vtty_map_free > - Rename @current_veid to @vtty_context_veid > - Rename TTY_PINNED to TTY_PINNED_BY_OTHER > - Assing TTY_PINNED_BY_OTHER early in pair creation > - Wake both ends of a peer in vtty_close > > FIXME: Once this is applied need to drop kernel/ve/coinsole.c > from the source tree, dropping it immediately ruines my queue > series, because there are other patches not yet merged but > changing kernel/ve/console.c code. > > Signed-off-by: Cyrill Gorcunov <gorcu...@virtuozzo.com> > CC: Vladimir Davydov <vdavy...@virtuozzo.com> > CC: Konstantin Khorenko <khore...@virtuozzo.com>
Reviewed-by: Vladimir Davydov <vdavy...@parallels.com> _______________________________________________ Devel mailing list Devel@openvz.org https://lists.openvz.org/mailman/listinfo/devel