From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752755AbdBFCP2 (ORCPT ); Sun, 5 Feb 2017 21:15:28 -0500 Received: from mail-pg0-f65.google.com ([74.125.83.65]:35825 "EHLO mail-pg0-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752036AbdBFCP1 (ORCPT ); Sun, 5 Feb 2017 21:15:27 -0500 Date: Mon, 6 Feb 2017 10:14:56 +0800 From: Wang YanQing To: gregkh@linuxfoundation.org Cc: jslaby@suse.com, peter@hurleysoftware.com, linux-kernel@vger.kernel.org Subject: [PATCH] tty: pty: don't flush line discipline of another side in pty_flush_buffer Message-ID: <20170206021456.GA4096@udknight> Mail-Followup-To: Wang YanQing , gregkh@linuxfoundation.org, jslaby@suse.com, peter@hurleysoftware.com, linux-kernel@vger.kernel.org MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.7.1 (2016-10-04) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Don't flush line discipline of another side, because user could already see the data in line discipline through poll, TIOCINQ or FIONREAD. Current behavior break the expection of userspace application in below situations. Example1: Thread A Thread B -------- -------- n_tty_poll return POLLIN CTRL-C trigger pty_flush_buffer tty_buffer_flush n_tty_flush_buffer TIOCINQ or FIONREAD return zero number of bytes Example2: Thread A Thread B -------- -------- TIOCINQ or FIONREAD return valid number of bytes CTRL-C trigger pty_flush_buffer tty_buffer_flush n_tty_flush_buffer n_tty_read still block due to no data I meet this problem(Example1) in konsole, current behavior cause konsole to hangup forever. It has high possibility to trigger the trouble I meet to execute below commands a few times in konsole with kernel has commit 1d1d14da12e79a6c05fbe1a975401f0f56c93316 ("pty: Fix buffer flush deadlock") which bring this behavior: 1:cat BigFile 2:CTRL-C Signed-off-by: Wang YanQing --- drivers/tty/pty.c | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/drivers/tty/pty.c b/drivers/tty/pty.c index a23fa5e..2b90738 100644 --- a/drivers/tty/pty.c +++ b/drivers/tty/pty.c @@ -216,16 +216,11 @@ static int pty_signal(struct tty_struct *tty, int sig) static void pty_flush_buffer(struct tty_struct *tty) { struct tty_struct *to = tty->link; - struct tty_ldisc *ld; if (!to) return; - ld = tty_ldisc_ref(to); - tty_buffer_flush(to, ld); - if (ld) - tty_ldisc_deref(ld); - + tty_buffer_flush(to, NULL); if (to->packet) { spin_lock_irq(&tty->ctrl_lock); tty->ctrl_status |= TIOCPKT_FLUSHWRITE; -- 1.8.5.6.2.g3d8a54e.dirty