Commit c19cbc5c authored by Cyrill Gorcunov's avatar Cyrill Gorcunov Committed by Pavel Emelyanov

tty: Don't flush tty data on checkpoint stage

In case if we're dumping the peer which another
end belongs not to us but some other application
the attempts to flush data may lead to endless
SIGTTOU storm:

 | 1158  ioctl(53, TCFLSH, 0x2)            = ? ERESTARTSYS (To be restarted if SA_RESTART is set)
 | 1158  --- SIGTTOU {si_signo=SIGTTOU, si_code=SI_KERNEL, si_value={int=5, ptr=0x5}} ---
 | 1158  --- stopped by SIGTTOU ---
 | 1158  ioctl(53, TCFLSH, 0x2)            = ? ERESTARTSYS (To be restarted if SA_RESTART is set)
 | 1158  --- SIGTTOU {si_signo=SIGTTOU, si_code=SI_KERNEL, si_value={int=5, ptr=0x5}} ---
 | 1158  --- stopped by SIGTTOU ---

so simply don't flush data, the initial attempt to use
TCIOFLUSH was rather "hey, we don't have a way to
say the kernel to freeze tty link for a while, lets
try to workaround this limitation" but without proper
kernel help this won't work anyway as Andrey has discovered.
Reported-by: 's avatarAndrey Vagin <avagin@openvz.org>
Signed-off-by: 's avatarCyrill Gorcunov <gorcunov@openvz.org>
Acked-by: 's avatarAndrew Vagin <avagin@parallels.com>
Signed-off-by: 's avatarPavel Emelyanov <xemul@parallels.com>
parent 281f0c7d
...@@ -1158,8 +1158,17 @@ static int dump_one_pty(int lfd, u32 id, const struct fd_parms *p) ...@@ -1158,8 +1158,17 @@ static int dump_one_pty(int lfd, u32 id, const struct fd_parms *p)
* we don't check for errors here since it makes * we don't check for errors here since it makes
* no sense anyway, the buffered data is not handled * no sense anyway, the buffered data is not handled
* properly yet. * properly yet.
*
* Note as well that if we have only one peer here
* the external end might be sending the data to us
* again and again while kernel buffer is not full,
* this might lead to endless SIGTTOU signal delivery
* to the dumpee, ruining checkpoint procedure.
*
* So simply do not flush the line while we dump
* parameters tty never was being a guaranteed delivery
* transport anyway.
*/ */
ioctl(lfd, TCFLSH, TCIOFLUSH);
if (!tty_test_and_set(e.tty_info_id, tty_bitmap)) if (!tty_test_and_set(e.tty_info_id, tty_bitmap))
ret = dump_pty_info(lfd, e.tty_info_id, p, major, index); ret = dump_pty_info(lfd, e.tty_info_id, p, major, index);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment