1. 27 4月, 2020 1 次提交
  2. 22 4月, 2020 1 次提交
    • E
      vt: vt_ioctl: fix race in VT_RESIZEX · 9002dc1a
      Eric Dumazet 提交于
      fix #26220884
      
      commit 6cd1ed50efd88261298577cd92a14f2768eddeeb upstream
      
      We need to make sure vc_cons[i].d is not NULL after grabbing
      console_lock(), or risk a crash.
      
      general protection fault, probably for non-canonical address 0xdffffc0000000068: 0000 [#1] PREEMPT SMP KASAN
      KASAN: null-ptr-deref in range [0x0000000000000340-0x0000000000000347]
      CPU: 1 PID: 19462 Comm: syz-executor.5 Not tainted 5.5.0-syzkaller #0
      Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011
      RIP: 0010:vt_ioctl+0x1f96/0x26d0 drivers/tty/vt/vt_ioctl.c:883
      Code: 74 41 e8 bd a6 84 fd 48 89 d8 48 c1 e8 03 42 80 3c 28 00 0f 85 e4 04 00 00 48 8b 03 48 8d b8 40 03 00 00 48 89 fa 48 c1 ea 03 <42> 0f b6 14 2a 84 d2 74 09 80 fa 03 0f 8e b1 05 00 00 44 89 b8 40
      RSP: 0018:ffffc900086d7bb0 EFLAGS: 00010202
      RAX: 0000000000000000 RBX: ffffffff8c34ee88 RCX: ffffc9001415c000
      RDX: 0000000000000068 RSI: ffffffff83f0e6e3 RDI: 0000000000000340
      RBP: ffffc900086d7cd0 R08: ffff888054ce0100 R09: fffffbfff16a2f6d
      R10: ffff888054ce0998 R11: ffff888054ce0100 R12: 000000000000001d
      R13: dffffc0000000000 R14: 1ffff920010daf79 R15: 000000000000ff7f
      FS:  00007f7d13c12700(0000) GS:ffff8880ae900000(0000) knlGS:0000000000000000
      CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
      CR2: 00007ffd477e3c38 CR3: 0000000095d0a000 CR4: 00000000001406e0
      DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
      DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
      Call Trace:
       tty_ioctl+0xa37/0x14f0 drivers/tty/tty_io.c:2660
       vfs_ioctl fs/ioctl.c:47 [inline]
       ksys_ioctl+0x123/0x180 fs/ioctl.c:763
       __do_sys_ioctl fs/ioctl.c:772 [inline]
       __se_sys_ioctl fs/ioctl.c:770 [inline]
       __x64_sys_ioctl+0x73/0xb0 fs/ioctl.c:770
       do_syscall_64+0xfa/0x790 arch/x86/entry/common.c:294
       entry_SYSCALL_64_after_hwframe+0x49/0xbe
      RIP: 0033:0x45b399
      Code: ad b6 fb ff c3 66 2e 0f 1f 84 00 00 00 00 00 66 90 48 89 f8 48 89 f7 48 89 d6 48 89 ca 4d 89 c2 4d 89 c8 4c 8b 4c 24 08 0f 05 <48> 3d 01 f0 ff ff 0f 83 7b b6 fb ff c3 66 2e 0f 1f 84 00 00 00 00
      RSP: 002b:00007f7d13c11c78 EFLAGS: 00000246 ORIG_RAX: 0000000000000010
      RAX: ffffffffffffffda RBX: 00007f7d13c126d4 RCX: 000000000045b399
      RDX: 0000000020000080 RSI: 000000000000560a RDI: 0000000000000003
      RBP: 000000000075bf20 R08: 0000000000000000 R09: 0000000000000000
      R10: 0000000000000000 R11: 0000000000000246 R12: 00000000ffffffff
      R13: 0000000000000666 R14: 00000000004c7f04 R15: 000000000075bf2c
      Modules linked in:
      ---[ end trace 80970faf7a67eb77 ]---
      RIP: 0010:vt_ioctl+0x1f96/0x26d0 drivers/tty/vt/vt_ioctl.c:883
      Code: 74 41 e8 bd a6 84 fd 48 89 d8 48 c1 e8 03 42 80 3c 28 00 0f 85 e4 04 00 00 48 8b 03 48 8d b8 40 03 00 00 48 89 fa 48 c1 ea 03 <42> 0f b6 14 2a 84 d2 74 09 80 fa 03 0f 8e b1 05 00 00 44 89 b8 40
      RSP: 0018:ffffc900086d7bb0 EFLAGS: 00010202
      RAX: 0000000000000000 RBX: ffffffff8c34ee88 RCX: ffffc9001415c000
      RDX: 0000000000000068 RSI: ffffffff83f0e6e3 RDI: 0000000000000340
      RBP: ffffc900086d7cd0 R08: ffff888054ce0100 R09: fffffbfff16a2f6d
      R10: ffff888054ce0998 R11: ffff888054ce0100 R12: 000000000000001d
      R13: dffffc0000000000 R14: 1ffff920010daf79 R15: 000000000000ff7f
      FS:  00007f7d13c12700(0000) GS:ffff8880ae900000(0000) knlGS:0000000000000000
      CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
      CR2: 00007ffd477e3c38 CR3: 0000000095d0a000 CR4: 00000000001406e0
      DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
      DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
      
      Fixes: 1da177e4 ("Linux-2.6.12-rc2")
      Signed-off-by: NEric Dumazet <edumazet@google.com>
      Cc: stable <stable@vger.kernel.org>
      Reported-by: Nsyzbot <syzkaller@googlegroups.com>
      Link: https://lore.kernel.org/r/20200210190721.200418-1-edumazet@google.comSigned-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      Reviewed-by: Nluanshi <zhangliguang@linux.alibaba.com>
      Signed-off-by: NXunlei Pang <xlpang@linux.alibaba.com>
      9002dc1a
  3. 02 4月, 2020 4 次提交
    • E
      vt: vt_ioctl: fix VT_DISALLOCATE freeing in-use virtual console · c2d10e03
      Eric Biggers 提交于
      fix #25967152
      
      commit ca4463bf8438b403596edd0ec961ca0d4fbe0220 upstream
      
      The VT_DISALLOCATE ioctl can free a virtual console while tty_release()
      is still running, causing a use-after-free in con_shutdown().  This
      occurs because VT_DISALLOCATE considers a virtual console's
      'struct vc_data' to be unused as soon as the corresponding tty's
      refcount hits 0.  But actually it may be still being closed.
      
      Fix this by making vc_data be reference-counted via the embedded
      'struct tty_port'.  A newly allocated virtual console has refcount 1.
      Opening it for the first time increments the refcount to 2.  Closing it
      for the last time decrements the refcount (in tty_operations::cleanup()
      so that it happens late enough), as does VT_DISALLOCATE.
      
      Reproducer:
      	#include <fcntl.h>
      	#include <linux/vt.h>
      	#include <sys/ioctl.h>
      	#include <unistd.h>
      
      	int main()
      	{
      		if (fork()) {
      			for (;;)
      				close(open("/dev/tty5", O_RDWR));
      		} else {
      			int fd = open("/dev/tty10", O_RDWR);
      
      			for (;;)
      				ioctl(fd, VT_DISALLOCATE, 5);
      		}
      	}
      
      KASAN report:
      	BUG: KASAN: use-after-free in con_shutdown+0x76/0x80 drivers/tty/vt/vt.c:3278
      	Write of size 8 at addr ffff88806a4ec108 by task syz_vt/129
      
      	CPU: 0 PID: 129 Comm: syz_vt Not tainted 5.6.0-rc2 #11
      	Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS ?-20191223_100556-anatol 04/01/2014
      	Call Trace:
      	 [...]
      	 con_shutdown+0x76/0x80 drivers/tty/vt/vt.c:3278
      	 release_tty+0xa8/0x410 drivers/tty/tty_io.c:1514
      	 tty_release_struct+0x34/0x50 drivers/tty/tty_io.c:1629
      	 tty_release+0x984/0xed0 drivers/tty/tty_io.c:1789
      	 [...]
      
      	Allocated by task 129:
      	 [...]
      	 kzalloc include/linux/slab.h:669 [inline]
      	 vc_allocate drivers/tty/vt/vt.c:1085 [inline]
      	 vc_allocate+0x1ac/0x680 drivers/tty/vt/vt.c:1066
      	 con_install+0x4d/0x3f0 drivers/tty/vt/vt.c:3229
      	 tty_driver_install_tty drivers/tty/tty_io.c:1228 [inline]
      	 tty_init_dev+0x94/0x350 drivers/tty/tty_io.c:1341
      	 tty_open_by_driver drivers/tty/tty_io.c:1987 [inline]
      	 tty_open+0x3ca/0xb30 drivers/tty/tty_io.c:2035
      	 [...]
      
      	Freed by task 130:
      	 [...]
      	 kfree+0xbf/0x1e0 mm/slab.c:3757
      	 vt_disallocate drivers/tty/vt/vt_ioctl.c:300 [inline]
      	 vt_ioctl+0x16dc/0x1e30 drivers/tty/vt/vt_ioctl.c:818
      	 tty_ioctl+0x9db/0x11b0 drivers/tty/tty_io.c:2660
      	 [...]
      
      Fixes: 4001d7b7 ("vt: push down the tty lock so we can see what is left to tackle")
      Cc: <stable@vger.kernel.org> # v3.4+
      Reported-by: syzbot+522643ab5729b0421998@syzkaller.appspotmail.com
      Acked-by: NJiri Slaby <jslaby@suse.cz>
      Signed-off-by: NEric Biggers <ebiggers@google.com>
      Link: https://lore.kernel.org/r/20200322034305.210082-2-ebiggers@kernel.orgSigned-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      Signed-off-by: NYihao Wu <wuyihao@linux.alibaba.com>
      Acked-by: NJoseph Qi <joseph.qi@linux.alibaba.com>
      c2d10e03
    • E
      vt: vt_ioctl: fix use-after-free in vt_in_use() · ea64290b
      Eric Biggers 提交于
      fix #25967152
      
      commit 7cf64b18b0b96e751178b8d0505d8466ff5a448f upstream
      
      vt_in_use() dereferences console_driver->ttys[i] without proper locking.
      This is broken because the tty can be closed and freed concurrently.
      
      We could fix this by using 'READ_ONCE(console_driver->ttys[i]) != NULL'
      and skipping the check of tty_struct::count.  But, looking at
      console_driver->ttys[i] isn't really appropriate anyway because even if
      it is NULL the tty can still be in the process of being closed.
      
      Instead, fix it by making vt_in_use() require console_lock() and check
      whether the vt is allocated and has port refcount > 1.  This works since
      following the patch "vt: vt_ioctl: fix VT_DISALLOCATE freeing in-use
      virtual console" the port refcount is incremented while the vt is open.
      
      Reproducer (very unreliable, but it worked for me after a few minutes):
      
      	#include <fcntl.h>
      	#include <linux/vt.h>
      
      	int main()
      	{
      		int fd, nproc;
      		struct vt_stat state;
      		char ttyname[16];
      
      		fd = open("/dev/tty10", O_RDONLY);
      		for (nproc = 1; nproc < 8; nproc *= 2)
      			fork();
      		for (;;) {
      			sprintf(ttyname, "/dev/tty%d", rand() % 8);
      			close(open(ttyname, O_RDONLY));
      			ioctl(fd, VT_GETSTATE, &state);
      		}
      	}
      
      KASAN report:
      
      	BUG: KASAN: use-after-free in vt_in_use drivers/tty/vt/vt_ioctl.c:48 [inline]
      	BUG: KASAN: use-after-free in vt_ioctl+0x1ad3/0x1d70 drivers/tty/vt/vt_ioctl.c:657
      	Read of size 4 at addr ffff888065722468 by task syz-vt2/132
      
      	CPU: 0 PID: 132 Comm: syz-vt2 Not tainted 5.6.0-rc5-00130-g089b6d3654916 #13
      	Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS ?-20191223_100556-anatol 04/01/2014
      	Call Trace:
      	 [...]
      	 vt_in_use drivers/tty/vt/vt_ioctl.c:48 [inline]
      	 vt_ioctl+0x1ad3/0x1d70 drivers/tty/vt/vt_ioctl.c:657
      	 tty_ioctl+0x9db/0x11b0 drivers/tty/tty_io.c:2660
      	 [...]
      
      	Allocated by task 136:
      	 [...]
      	 kzalloc include/linux/slab.h:669 [inline]
      	 alloc_tty_struct+0x96/0x8a0 drivers/tty/tty_io.c:2982
      	 tty_init_dev+0x23/0x350 drivers/tty/tty_io.c:1334
      	 tty_open_by_driver drivers/tty/tty_io.c:1987 [inline]
      	 tty_open+0x3ca/0xb30 drivers/tty/tty_io.c:2035
      	 [...]
      
      	Freed by task 41:
      	 [...]
      	 kfree+0xbf/0x200 mm/slab.c:3757
      	 free_tty_struct+0x8d/0xb0 drivers/tty/tty_io.c:177
      	 release_one_tty+0x22d/0x2f0 drivers/tty/tty_io.c:1468
      	 process_one_work+0x7f1/0x14b0 kernel/workqueue.c:2264
      	 worker_thread+0x8b/0xc80 kernel/workqueue.c:2410
      	 [...]
      
      Fixes: 4001d7b7 ("vt: push down the tty lock so we can see what is left to tackle")
      Cc: <stable@vger.kernel.org> # v3.4+
      Acked-by: NJiri Slaby <jslaby@suse.cz>
      Signed-off-by: NEric Biggers <ebiggers@google.com>
      Link: https://lore.kernel.org/r/20200322034305.210082-3-ebiggers@kernel.orgSigned-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      Signed-off-by: NYihao Wu <wuyihao@linux.alibaba.com>
      Acked-by: NJoseph Qi <joseph.qi@linux.alibaba.com>
      ea64290b
    • J
      vt: ioctl, switch VT_IS_IN_USE and VT_BUSY to inlines · 5e8474ca
      Jiri Slaby 提交于
      fix #25967152
      
      commit e587e8f17433ddb26954f0edf5b2f95c42155ae9 upstream
      
      These two were macros. Switch them to static inlines, so that it's more
      understandable what they are doing.
      Signed-off-by: NJiri Slaby <jslaby@suse.cz>
      Link: https://lore.kernel.org/r/20200219073951.16151-2-jslaby@suse.czSigned-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      Signed-off-by: NYihao Wu <wuyihao@linux.alibaba.com>
      Acked-by: NJoseph Qi <joseph.qi@linux.alibaba.com>
      5e8474ca
    • J
      vt: selection, introduce vc_is_sel · 0b9c1057
      Jiri Slaby 提交于
      fix #25967152
      
      commit dce05aa6eec977f1472abed95ccd71276b9a3864 upstream
      
      Avoid global variables (namely sel_cons) by introducing vc_is_sel. It
      checks whether the parameter is the current selection console. This will
      help putting sel_cons to a struct later.
      Signed-off-by: NJiri Slaby <jslaby@suse.cz>
      Link: https://lore.kernel.org/r/20200219073951.16151-1-jslaby@suse.czSigned-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      Signed-off-by: NYihao Wu <wuyihao@linux.alibaba.com>
      Acked-by: NJoseph Qi <joseph.qi@linux.alibaba.com>
      0b9c1057
  4. 18 3月, 2020 1 次提交
    • J
      vt: selection, close sel_buffer race · 210ea9a5
      Jiri Slaby 提交于
      commit 07e6124a1a46b4b5a9b3cacc0c306b50da87abf5 upstream.
      
      [ Fixes: CVE-2020-8648 ]
      
      syzkaller reported this UAF:
      BUG: KASAN: use-after-free in n_tty_receive_buf_common+0x2481/0x2940 drivers/tty/n_tty.c:1741
      Read of size 1 at addr ffff8880089e40e9 by task syz-executor.1/13184
      
      CPU: 0 PID: 13184 Comm: syz-executor.1 Not tainted 5.4.7 #1
      Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.12.0-1 04/01/2014
      Call Trace:
      ...
       kasan_report+0xe/0x20 mm/kasan/common.c:634
       n_tty_receive_buf_common+0x2481/0x2940 drivers/tty/n_tty.c:1741
       tty_ldisc_receive_buf+0xac/0x190 drivers/tty/tty_buffer.c:461
       paste_selection+0x297/0x400 drivers/tty/vt/selection.c:372
       tioclinux+0x20d/0x4e0 drivers/tty/vt/vt.c:3044
       vt_ioctl+0x1bcf/0x28d0 drivers/tty/vt/vt_ioctl.c:364
       tty_ioctl+0x525/0x15a0 drivers/tty/tty_io.c:2657
       vfs_ioctl fs/ioctl.c:47 [inline]
      
      It is due to a race between parallel paste_selection (TIOCL_PASTESEL)
      and set_selection_user (TIOCL_SETSEL) invocations. One uses sel_buffer,
      while the other frees it and reallocates a new one for another
      selection. Add a mutex to close this race.
      
      The mutex takes care properly of sel_buffer and sel_buffer_lth only. The
      other selection global variables (like sel_start, sel_end, and sel_cons)
      are protected only in set_selection_user. The other functions need quite
      some more work to close the races of the variables there. This is going
      to happen later.
      
      This likely fixes (I am unsure as there is no reproducer provided) bug
      206361 too. It was marked as CVE-2020-8648.
      Signed-off-by: NJiri Slaby <jslaby@suse.cz>
      Reported-by: syzbot+59997e8d5cbdc486e6f6@syzkaller.appspotmail.com
      References: https://bugzilla.kernel.org/show_bug.cgi?id=206361
      Cc: stable <stable@vger.kernel.org>
      Link: https://lore.kernel.org/r/20200210081131.23572-2-jslaby@suse.czSigned-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      Signed-off-by: NShile Zhang <shile.zhang@linux.alibaba.com>
      Acked-by: NCaspar Zhang <caspar@linux.alibaba.com>
      210ea9a5
  5. 13 12月, 2019 10 次提交
    • N
      vcs: prevent write access to vcsu devices · 627f3b9e
      Nicolas Pitre 提交于
      commit 0c9acb1af77a3cb8707e43f45b72c95266903cee upstream.
      
      Commit d21b0be2 ("vt: introduce unicode mode for /dev/vcs") guarded
      against using devices containing attributes as this is not yet
      implemented. It however failed to guard against writes to any devices
      as this is also unimplemented.
      Reported-by: NOr Cohen <orcohen@paloaltonetworks.com>
      Signed-off-by: NNicolas Pitre <npitre@baylibre.com>
      Cc: <stable@vger.kernel.org> # v4.19+
      Cc: Jiri Slaby <jslaby@suse.com>
      Fixes: d21b0be2 ("vt: introduce unicode mode for /dev/vcs")
      Link: https://lore.kernel.org/r/nycvar.YSQ.7.76.1911051030580.30289@knanqh.ubzrSigned-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      627f3b9e
    • D
      tty: vt: keyboard: reject invalid keycodes · 9eadcebe
      Dmitry Torokhov 提交于
      commit b2b2dd71e0859436d4e05b2f61f86140250ed3f8 upstream.
      
      Do not try to handle keycodes that are too big, otherwise we risk doing
      out-of-bounds writes:
      
      BUG: KASAN: global-out-of-bounds in clear_bit include/asm-generic/bitops-instrumented.h:56 [inline]
      BUG: KASAN: global-out-of-bounds in kbd_keycode drivers/tty/vt/keyboard.c:1411 [inline]
      BUG: KASAN: global-out-of-bounds in kbd_event+0xe6b/0x3790 drivers/tty/vt/keyboard.c:1495
      Write of size 8 at addr ffffffff89a1b2d8 by task syz-executor108/1722
      ...
       kbd_keycode drivers/tty/vt/keyboard.c:1411 [inline]
       kbd_event+0xe6b/0x3790 drivers/tty/vt/keyboard.c:1495
       input_to_handler+0x3b6/0x4c0 drivers/input/input.c:118
       input_pass_values.part.0+0x2e3/0x720 drivers/input/input.c:145
       input_pass_values drivers/input/input.c:949 [inline]
       input_set_keycode+0x290/0x320 drivers/input/input.c:954
       evdev_handle_set_keycode_v2+0xc4/0x120 drivers/input/evdev.c:882
       evdev_do_ioctl drivers/input/evdev.c:1150 [inline]
      
      In this case we were dealing with a fuzzed HID device that declared over
      12K buttons, and while HID layer should not be reporting to us such big
      keycodes, we should also be defensive and reject invalid data ourselves as
      well.
      
      Reported-by: syzbot+19340dff067c2d3835c0@syzkaller.appspotmail.com
      Signed-off-by: NDmitry Torokhov <dmitry.torokhov@gmail.com>
      Cc: stable <stable@vger.kernel.org>
      Link: https://lore.kernel.org/r/20191122204220.GA129459@dtor-wsSigned-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      9eadcebe
    • D
      tty: Don't block on IO when ldisc change is pending · 50e9fda8
      Dmitry Safonov 提交于
      [ Upstream commit c96cf923a98d1b094df9f0cf97a83e118817e31b ]
      
      There might be situations where tty_ldisc_lock() has blocked, but there
      is already IO on tty and it prevents line discipline changes.
      It might theoretically turn into dead-lock.
      
      Basically, provide more priority to pending tty_ldisc_lock() than to
      servicing reads/writes over tty.
      
      User-visible issue was reported by Mikulas where on pa-risc with
      Debian 5 reboot took either 80 seconds, 3 minutes or 3:25 after proper
      locking in tty_reopen().
      
      Cc: Jiri Slaby <jslaby@suse.com>
      Reported-by: NMikulas Patocka <mpatocka@redhat.com>
      Signed-off-by: NDmitry Safonov <dima@arista.com>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      Signed-off-by: NSasha Levin <sashal@kernel.org>
      50e9fda8
    • R
      tty: serial: qcom_geni_serial: Fix softlock · 6854d02b
      Ryan Case 提交于
      [ Upstream commit a1fee899e5bed457afc20a6a2ff3915a95cc5942 ]
      
      Transfers were being divided into device FIFO sized (64 byte max)
      operations which would poll for completion within a spin_lock_irqsave /
      spin_unlock_irqrestore block. This both made things slow by waiting for
      the FIFO to completely drain before adding further data and would also
      result in softlocks on large transmissions.
      
      This patch allows larger transfers with continuous FIFO additions as
      space becomes available and removes polling from the interrupt handler.
      Signed-off-by: NRyan Case <ryandcase@chromium.org>
      Reviewed-by: NStephen Boyd <swboyd@chromium.org>
      Reviewed-by: NDouglas Anderson <dianders@chromium.org>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      Signed-off-by: NSasha Levin <sashal@kernel.org>
      6854d02b
    • S
      serial: imx: fix error handling in console_setup · 33b629d4
      Stefan Agner 提交于
      [ Upstream commit 63fd4b94b948c14eeb27a3bbf50ea0f7f0593bad ]
      
      The ipg clock only needs to be unprepared in case preparing
      per clock fails. The ipg clock has already disabled at the point.
      
      Fixes: 1cf93e0d ("serial: imx: remove the uart_console() check")
      Signed-off-by: NStefan Agner <stefan@agner.ch>
      Reviewed-by: NUwe Kleine-König <u.kleine-koenig@pengutronix.de>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      Signed-off-by: NSasha Levin <sashal@kernel.org>
      33b629d4
    • C
      serial: ifx6x60: add missed pm_runtime_disable · c44d21f8
      Chuhong Yuan 提交于
      commit 50b2b571c5f3df721fc81bf9a12c521dfbe019ba upstream.
      
      The driver forgets to call pm_runtime_disable in remove.
      Add the missed calls to fix it.
      Signed-off-by: NChuhong Yuan <hslester96@gmail.com>
      Cc: stable <stable@vger.kernel.org>
      Link: https://lore.kernel.org/r/20191118024833.21587-1-hslester96@gmail.comSigned-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      c44d21f8
    • J
      serial: serial_core: Perform NULL checks for break_ctl ops · bd95aea9
      Jiangfeng Xiao 提交于
      commit 7d73170e1c282576419f8b50a771f1fcd2b81a94 upstream.
      
      Doing fuzz test on sbsa uart device, causes a kernel crash
      due to NULL pointer dereference:
      
      ------------[ cut here ]------------
      Unable to handle kernel paging request at virtual address fffffffffffffffc
      pgd = ffffffe331723000
      [fffffffffffffffc] *pgd=0000002333595003, *pud=0000002333595003, *pmd=00000
      Internal error: Oops: 96000005 [#1] PREEMPT SMP
      Modules linked in: ping(O) jffs2 rtos_snapshot(O) pramdisk(O) hisi_sfc(O)
      Drv_Nandc_K(O) Drv_SysCtl_K(O) Drv_SysClk_K(O) bsp_reg(O) hns3(O)
      hns3_uio_enet(O) hclgevf(O) hclge(O) hnae3(O) mdio_factory(O)
      mdio_registry(O) mdio_dev(O) mdio(O) hns3_info(O) rtos_kbox_panic(O)
      uart_suspend(O) rsm(O) stp llc tunnel4 xt_tcpudp ipt_REJECT nf_reject_ipv4
      iptable_filter ip_tables x_tables sd_mod xhci_plat_hcd xhci_pci xhci_hcd
      usbmon usbhid usb_storage ohci_platform ohci_pci ohci_hcd hid_generic hid
      ehci_platform ehci_pci ehci_hcd vfat fat usbcore usb_common scsi_mod
      yaffs2multi(O) ext4 jbd2 ext2 mbcache ofpart i2c_dev i2c_core uio ubi nand
      nand_ecc nand_ids cfi_cmdset_0002 cfi_cmdset_0001 cfi_probe gen_probe
      cmdlinepart chipreg mtdblock mtd_blkdevs mtd nfsd auth_rpcgss oid_registry
      nfsv3 nfs nfs_acl lockd sunrpc grace autofs4
      CPU: 2 PID: 2385 Comm: tty_fuzz_test Tainted: G           O    4.4.193 #1
      task: ffffffe32b23f110 task.stack: ffffffe32bda4000
      PC is at uart_break_ctl+0x44/0x84
      LR is at uart_break_ctl+0x34/0x84
      pc : [<ffffff8393196098>] lr : [<ffffff8393196088>] pstate: 80000005
      sp : ffffffe32bda7cc0
      x29: ffffffe32bda7cc0 x28: ffffffe32b23f110
      x27: ffffff8393402000 x26: 0000000000000000
      x25: ffffffe32b233f40 x24: ffffffc07a8ec680
      x23: 0000000000005425 x22: 00000000ffffffff
      x21: ffffffe33ed73c98 x20: 0000000000000000
      x19: ffffffe33ed94168 x18: 0000000000000004
      x17: 0000007f92ae9d30 x16: ffffff8392fa6064
      x15: 0000000000000010 x14: 0000000000000000
      x13: 0000000000000000 x12: 0000000000000000
      x11: 0000000000000020 x10: 0000007ffdac1708
      x9 : 0000000000000078 x8 : 000000000000001d
      x7 : 0000000052a64887 x6 : ffffffe32bda7e08
      x5 : ffffffe32b23c000 x4 : 0000005fbc5b0000
      x3 : ffffff83938d5018 x2 : 0000000000000080
      x1 : ffffffe32b23c040 x0 : ffffff83934428f8
      virtual start addr offset is 38ac00000
      module base offset is 2cd4cf1000
      linear region base offset is : 0
      Process tty_fuzz_test (pid: 2385, stack limit = 0xffffffe32bda4000)
      Stack: (0xffffffe32bda7cc0 to 0xffffffe32bda8000)
      7cc0: ffffffe32bda7cf0 ffffff8393177718 ffffffc07a8ec680 ffffff8393196054
      7ce0: 000000001739f2e0 0000007ffdac1978 ffffffe32bda7d20 ffffff8393179a1c
      7d00: 0000000000000000 ffffff8393c0a000 ffffffc07a8ec680 cb88537fdc8ba600
      7d20: ffffffe32bda7df0 ffffff8392fa5a40 ffffff8393c0a000 0000000000005425
      7d40: 0000007ffdac1978 ffffffe32b233f40 ffffff8393178dcc 0000000000000003
      7d60: 000000000000011d 000000000000001d ffffffe32b23f110 000000000000029e
      7d80: ffffffe34fe8d5d0 0000000000000000 ffffffe32bda7e14 cb88537fdc8ba600
      7da0: ffffffe32bda7e30 ffffff8393042cfc ffffff8393c41720 ffffff8393c46410
      7dc0: ffffff839304fa68 ffffffe32b233f40 0000000000005425 0000007ffdac1978
      7de0: 000000000000011d cb88537fdc8ba600 ffffffe32bda7e70 ffffff8392fa60cc
      7e00: 0000000000000000 ffffffe32b233f40 ffffffe32b233f40 0000000000000003
      7e20: 0000000000005425 0000007ffdac1978 ffffffe32bda7e70 ffffff8392fa60b0
      7e40: 0000000000000280 ffffffe32b233f40 ffffffe32b233f40 0000000000000003
      7e60: 0000000000005425 cb88537fdc8ba600 0000000000000000 ffffff8392e02e78
      7e80: 0000000000000280 0000005fbc5b0000 ffffffffffffffff 0000007f92ae9d3c
      7ea0: 0000000060000000 0000000000000015 0000000000000003 0000000000005425
      7ec0: 0000007ffdac1978 0000000000000000 00000000a54c910e 0000007f92b95014
      7ee0: 0000007f92b95090 0000000052a64887 000000000000001d 0000000000000078
      7f00: 0000007ffdac1708 0000000000000020 0000000000000000 0000000000000000
      7f20: 0000000000000000 0000000000000010 000000556acf0090 0000007f92ae9d30
      7f40: 0000000000000004 000000556acdef10 0000000000000000 000000556acdebd0
      7f60: 0000000000000000 0000000000000000 0000000000000000 0000000000000000
      7f80: 0000000000000000 0000000000000000 0000000000000000 0000007ffdac1840
      7fa0: 000000556acdedcc 0000007ffdac1840 0000007f92ae9d3c 0000000060000000
      7fc0: 0000000000000000 0000000000000000 0000000000000003 000000000000001d
      7fe0: 0000000000000000 0000000000000000 0000000000000000 0000000000000000
      Call trace:
      Exception stack(0xffffffe32bda7ab0 to 0xffffffe32bda7bf0)
      7aa0:                                   0000000000001000 0000007fffffffff
      7ac0: ffffffe32bda7cc0 ffffff8393196098 0000000080000005 0000000000000025
      7ae0: ffffffe32b233f40 ffffff83930d777c ffffffe32bda7b30 ffffff83930d777c
      7b00: ffffffe32bda7be0 ffffff83938d5000 ffffffe32bda7be0 ffffffe32bda7c20
      7b20: ffffffe32bda7b60 ffffff83930d777c ffffffe32bda7c10 ffffff83938d5000
      7b40: ffffffe32bda7c10 ffffffe32bda7c50 ffffff8393c0a000 ffffffe32b23f110
      7b60: ffffffe32bda7b70 ffffff8392e09df4 ffffffe32bda7bb0 cb88537fdc8ba600
      7b80: ffffff83934428f8 ffffffe32b23c040 0000000000000080 ffffff83938d5018
      7ba0: 0000005fbc5b0000 ffffffe32b23c000 ffffffe32bda7e08 0000000052a64887
      7bc0: 000000000000001d 0000000000000078 0000007ffdac1708 0000000000000020
      7be0: 0000000000000000 0000000000000000
      [<ffffff8393196098>] uart_break_ctl+0x44/0x84
      [<ffffff8393177718>] send_break+0xa0/0x114
      [<ffffff8393179a1c>] tty_ioctl+0xc50/0xe84
      [<ffffff8392fa5a40>] do_vfs_ioctl+0xc4/0x6e8
      [<ffffff8392fa60cc>] SyS_ioctl+0x68/0x9c
      [<ffffff8392e02e78>] __sys_trace_return+0x0/0x4
      Code: b9410ea0 34000160 f9408aa0 f9402814 (b85fc280)
      ---[ end trace 8606094f1960c5e0 ]---
      Kernel panic - not syncing: Fatal exception
      
      Fix this problem by adding NULL checks prior to calling break_ctl ops.
      Signed-off-by: NJiangfeng Xiao <xiaojiangfeng@huawei.com>
      Cc: stable <stable@vger.kernel.org>
      Link: https://lore.kernel.org/r/1574263133-28259-1-git-send-email-xiaojiangfeng@huawei.comSigned-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      bd95aea9
    • V
      serial: pl011: Fix DMA ->flush_buffer() · 4fca5202
      Vincent Whitchurch 提交于
      commit f6a196477184b99a31d16366a8e826558aa11f6d upstream.
      
      PL011's ->flush_buffer() implementation releases and reacquires the port
      lock.  Due to a race condition here, data can end up being added to the
      circular buffer but neither being discarded nor being sent out.  This
      leads to, for example, tcdrain(2) waiting indefinitely.
      
      Process A                       Process B
      
      uart_flush_buffer()
       - acquire lock
       - circ_clear
       - pl011_flush_buffer()
       -- release lock
       -- dmaengine_terminate_all()
      
                                      uart_write()
                                      - acquire lock
                                      - add chars to circ buffer
                                      - start_tx()
                                      -- start DMA
                                      - release lock
      
       -- acquire lock
       -- turn off DMA
       -- release lock
      
                                      // Data in circ buffer but DMA is off
      
      According to the comment in the code, the releasing of the lock around
      dmaengine_terminate_all() is to avoid a deadlock with the DMA engine
      callback.  However, since the time this code was written, the DMA engine
      API documentation seems to have been clarified to say that
      dmaengine_terminate_all() (in the identically implemented but
      differently named dmaengine_terminate_async() variant) does not wait for
      any running complete callback to be completed and can even be called
      from a complete callback.  So there is no possibility of deadlock if the
      DMA engine driver implements this API correctly.
      
      So we should be able to just remove this release and reacquire of the
      lock to prevent the aforementioned race condition.
      Signed-off-by: NVincent Whitchurch <vincent.whitchurch@axis.com>
      Cc: stable <stable@vger.kernel.org>
      Link: https://lore.kernel.org/r/20191118092547.32135-1-vincent.whitchurch@axis.comSigned-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      4fca5202
    • J
      tty: serial: msm_serial: Fix flow control · 4f729489
      Jeffrey Hugo 提交于
      commit b027ce258369cbfa88401a691c23dad01deb9f9b upstream.
      
      hci_qca interfaces to the wcn3990 via a uart_dm on the msm8998 mtp and
      Lenovo Miix 630 laptop.  As part of initializing the wcn3990, hci_qca
      disables flow, configures the uart baudrate, and then reenables flow - at
      which point an event is expected to be received over the uart from the
      wcn3990.  It is observed that this event comes after the baudrate change
      but before hci_qca re-enables flow. This is unexpected, and is a result of
      msm_reset() being broken.
      
      According to the uart_dm hardware documentation, it is recommended that
      automatic hardware flow control be enabled by setting RX_RDY_CTL.  Auto
      hw flow control will manage RFR based on the configured watermark.  When
      there is space to receive data, the hw will assert RFR.  When the watermark
      is hit, the hw will de-assert RFR.
      
      The hardware documentation indicates that RFR can me manually managed via
      CR when RX_RDY_CTL is not set.  SET_RFR asserts RFR, and RESET_RFR
      de-asserts RFR.
      
      msm_reset() is broken because after resetting the hardware, it
      unconditionally asserts RFR via SET_RFR.  This enables flow regardless of
      the current configuration, and would undo a previous flow disable
      operation.  It should instead de-assert RFR via RESET_RFR to block flow
      until the hardware is reconfigured.  msm_serial should rely on the client
      to specify that flow should be enabled, either via mctrl() or the termios
      structure, and only assert RFR in response to those triggers.
      
      Fixes: 04896a77 ("msm_serial: serial driver for MSM7K onboard serial peripheral.")
      Signed-off-by: NJeffrey Hugo <jeffrey.l.hugo@gmail.com>
      Reviewed-by: NBjorn Andersson <bjorn.andersson@linaro.org>
      Cc: stable <stable@vger.kernel.org>
      Reviewed-by: NAndy Gross <agross@kernel.org>
      Link: https://lore.kernel.org/r/20191021154616.25457-1-jeffrey.l.hugo@gmail.comSigned-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      4f729489
    • P
      tty: serial: fsl_lpuart: use the sg count from dma_map_sg · 8f7600e2
      Peng Fan 提交于
      commit 487ee861de176090b055eba5b252b56a3b9973d6 upstream.
      
      The dmaengine_prep_slave_sg needs to use sg count returned
      by dma_map_sg, not use sport->dma_tx_nents, because the return
      value of dma_map_sg is not always same with "nents".
      
      When enabling iommu for lpuart + edma, iommu framework may concatenate
      two sgs into one.
      
      Fixes: 6250cc30 ("tty: serial: fsl_lpuart: Use scatter/gather DMA for Tx")
      Cc: <stable@vger.kernel.org>
      Signed-off-by: NPeng Fan <peng.fan@nxp.com>
      Link: https://lore.kernel.org/r/1572932977-17866-1-git-send-email-peng.fan@nxp.comSigned-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      8f7600e2
  6. 05 12月, 2019 4 次提交
    • H
      serial: 8250: Fix serial8250 initialization crash · 498ce67e
      He Zhe 提交于
      [ Upstream commit 352c4cf40c4a7d439fa5d30aa2160f54b394da82 ]
      
      The initialization code of interrupt backoff work might reference NULL
      pointer and cause the following crash, if no port was found.
      
      [   10.017727] CPU 0 Unable to handle kernel paging request at virtual address 000001b0, epc == 807088e0, ra == 8070863c
      ---- snip ----
      [   11.704470] [<807088e0>] serial8250_register_8250_port+0x318/0x4ac
      [   11.747251] [<80708d74>] serial8250_probe+0x148/0x1c0
      [   11.789301] [<80728450>] platform_drv_probe+0x40/0x94
      [   11.830515] [<807264f8>] really_probe+0xf8/0x318
      [   11.870876] [<80726b7c>] __driver_attach+0x110/0x12c
      [   11.910960] [<80724374>] bus_for_each_dev+0x78/0xcc
      [   11.951134] [<80725958>] bus_add_driver+0x200/0x234
      [   11.989756] [<807273d8>] driver_register+0x84/0x148
      [   12.029832] [<80d72f84>] serial8250_init+0x138/0x198
      [   12.070447] [<80100e6c>] do_one_initcall+0x5c/0x2a0
      [   12.110104] [<80d3a208>] kernel_init_freeable+0x370/0x484
      [   12.150722] [<80a49420>] kernel_init+0x10/0xf8
      [   12.191517] [<8010756c>] ret_from_kernel_thread+0x14/0x1c
      
      This patch makes sure the initialization code can be reached only if a port
      is found.
      
      Fixes: 6d7f677a2afa ("serial: 8250: Rate limit serial port rx interrupts during input overruns")
      Signed-off-by: NHe Zhe <zhe.he@windriver.com>
      Reviewed-by: NDarwin Dingel <darwin.dingel@alliedtelesis.co.nz>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      Signed-off-by: NSasha Levin <sashal@kernel.org>
      498ce67e
    • A
      serial: max310x: Fix tx_empty() callback · 98b49680
      Alexander Shiyan 提交于
      [ Upstream commit a8da3c7873ea57acb8f9cea58c0af477522965aa ]
      
      Function max310x_tx_empty() accesses the IRQSTS register, which is
      cleared by IC when reading, so if there is an interrupt status, we
      will lose it. This patch implement the transmitter check only by
      the current FIFO level.
      Signed-off-by: NAlexander Shiyan <shc_work@mail.ru>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      Signed-off-by: NSasha Levin <sashal@kernel.org>
      98b49680
    • D
      serial: 8250: Rate limit serial port rx interrupts during input overruns · ab77c2c1
      Darwin Dingel 提交于
      [ Upstream commit 6d7f677a2afa1c82d7fc7af7f9159cbffd5dc010 ]
      
      When a serial port gets faulty or gets flooded with inputs, its interrupt
      handler starts to work double time to get the characters to the workqueue
      for the tty layer to handle them. When this busy time on the serial/tty
      subsystem happens during boot, where it is also busy on the userspace
      trying to initialise, some processes can continuously get preempted
      and will be on hold until the interrupts subside.
      
      The fix is to backoff on processing received characters for a specified
      amount of time when an input overrun is seen (received a new character
      before the previous one is processed). This only stops receive and will
      continue to transmit characters to serial port. After the backoff period
      is done, it receive will be re-enabled. This is optional and will only
      be enabled by setting 'overrun-throttle-ms' in the dts.
      Signed-off-by: NDarwin Dingel <darwin.dingel@alliedtelesis.co.nz>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      Signed-off-by: NSasha Levin <sashal@kernel.org>
      ab77c2c1
    • G
      serial: sh-sci: Fix crash in rx_timer_fn() on PIO fallback · 3e30e75b
      Geert Uytterhoeven 提交于
      [ Upstream commit 2e948218b7c1262a3830823d6620eb227e3d4e3a ]
      
      When falling back to PIO, active_rx must be set to a different value
      than cookie_rx[i], else sci_dma_rx_find_active() will incorrectly find a
      match, leading to a NULL pointer dereference in rx_timer_fn() later.
      
      Use zero instead, which is the same value as after driver
      initialization.
      Signed-off-by: NGeert Uytterhoeven <geert+renesas@glider.be>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      Signed-off-by: NSasha Levin <sashal@kernel.org>
      3e30e75b
  7. 01 12月, 2019 2 次提交
  8. 21 11月, 2019 4 次提交
  9. 10 11月, 2019 1 次提交
  10. 06 11月, 2019 4 次提交
  11. 18 10月, 2019 1 次提交
  12. 21 9月, 2019 2 次提交
  13. 16 8月, 2019 1 次提交
  14. 31 7月, 2019 4 次提交
    • G
      serial: sh-sci: Fix TX DMA buffer flushing and workqueue races · d03aeb8d
      Geert Uytterhoeven 提交于
      [ Upstream commit 8493eab02608b0e82f67b892aa72882e510c31d0 ]
      
      When uart_flush_buffer() is called, the .flush_buffer() callback zeroes
      the tx_dma_len field.  This may race with the work queue function
      handling transmit DMA requests:
      
        1. If the buffer is flushed before the first DMA API call,
           dmaengine_prep_slave_single() may be called with a zero length,
           causing the DMA request to never complete, leading to messages
           like:
      
              rcar-dmac e7300000.dma-controller: Channel Address Error happen
      
           and, with debug enabled:
      
      	sh-sci e6e88000.serial: sci_dma_tx_work_fn: ffff800639b55000: 0...0, cookie 126
      
           and DMA timeouts.
      
        2. If the buffer is flushed after the first DMA API call, but before
           the second, dma_sync_single_for_device() may be called with a zero
           length, causing the transmit data not to be flushed to RAM, and
           leading to stale data being output.
      
      Fix this by:
        1. Letting sci_dma_tx_work_fn() return immediately if the transmit
           buffer is empty,
        2. Extending the critical section to cover all DMA preparational work,
           so tx_dma_len stays consistent for all of it,
        3. Using local copies of circ_buf.head and circ_buf.tail, to make sure
           they match the actual operation above.
      Reported-by: NEugeniu Rosca <erosca@de.adit-jv.com>
      Suggested-by: NYoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
      Signed-off-by: NGeert Uytterhoeven <geert+renesas@glider.be>
      Reviewed-by: NEugeniu Rosca <erosca@de.adit-jv.com>
      Tested-by: NEugeniu Rosca <erosca@de.adit-jv.com>
      Link: https://lore.kernel.org/r/20190624123540.20629-2-geert+renesas@glider.beSigned-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      Signed-off-by: NSasha Levin <sashal@kernel.org>
      d03aeb8d
    • G
      serial: sh-sci: Terminate TX DMA during buffer flushing · 48c73b8e
      Geert Uytterhoeven 提交于
      [ Upstream commit 775b7ffd7d6d5db320d99b0a485c51e04dfcf9f1 ]
      
      While the .flush_buffer() callback clears sci_port.tx_dma_len since
      commit 1cf4a7ef ("serial: sh-sci: Fix race condition causing
      garbage during shutdown"), it does not terminate a transmit DMA
      operation that may be in progress.
      
      Fix this by terminating any pending DMA operations, and resetting the
      corresponding cookie.
      Signed-off-by: NGeert Uytterhoeven <geert+renesas@glider.be>
      Reviewed-by: NEugeniu Rosca <erosca@de.adit-jv.com>
      Tested-by: NEugeniu Rosca <erosca@de.adit-jv.com>
      
      Link: https://lore.kernel.org/r/20190624123540.20629-3-geert+renesas@glider.beSigned-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      Signed-off-by: NSasha Levin <sashal@kernel.org>
      48c73b8e
    • S
      serial: mctrl_gpio: Check if GPIO property exisits before requesting it · 9d45fbee
      Stefan Roese 提交于
      [ Upstream commit d99482673f950817b30caf3fcdfb31179b050ce1 ]
      
      This patch adds a check for the GPIOs property existence, before the
      GPIO is requested. This fixes an issue seen when the 8250 mctrl_gpio
      support is added (2nd patch in this patch series) on x86 platforms using
      ACPI.
      
      Here Mika's comments from 2016-08-09:
      
      "
      I noticed that with v4.8-rc1 serial console of some of our Broxton
      systems does not work properly anymore. I'm able to see output but input
      does not work.
      
      I bisected it down to commit 4ef03d32
      ("tty/serial/8250: use mctrl_gpio helpers").
      
      The reason why it fails is that in ACPI we do not have names for GPIOs
      (except when _DSD is used) so we use the "idx" to index into _CRS GPIO
      resources. Now mctrl_gpio_init_noauto() goes through a list of GPIOs
      calling devm_gpiod_get_index_optional() passing "idx" of 0 for each. The
      UART device in Broxton has following (simplified) ACPI description:
      
          Device (URT4)
          {
              ...
              Name (_CRS, ResourceTemplate () {
                  GpioIo (Exclusive, PullDefault, 0x0000, 0x0000, IoRestrictionOutputOnly,
                          "\\_SB.GPO0", 0x00, ResourceConsumer)
                  {
                      0x003A
                  }
                  GpioIo (Exclusive, PullDefault, 0x0000, 0x0000, IoRestrictionOutputOnly,
                          "\\_SB.GPO0", 0x00, ResourceConsumer)
                  {
                      0x003D
                  }
              })
      
      In this case it finds the first GPIO (0x003A which happens to be RX pin
      for that UART), turns it into GPIO which then breaks input for the UART
      device. This also breaks systems with bluetooth connected to UART (those
      typically have some GPIOs in their _CRS).
      
      Any ideas how to fix this?
      
      We cannot just drop the _CRS index lookup fallback because that would
      break many existing machines out there so maybe we can limit this to
      only DT enabled machines. Or alternatively probe if the property first
      exists before trying to acquire the GPIOs (using
      device_property_present()).
      "
      
      This patch implements the fix suggested by Mika in his statement above.
      Signed-off-by: NStefan Roese <sr@denx.de>
      Reviewed-by: NMika Westerberg <mika.westerberg@linux.intel.com>
      Reviewed-by: NAndy Shevchenko <andriy.shevchenko@linux.intel.com>
      Tested-by: NYegor Yefremov <yegorslists@googlemail.com>
      Cc: Mika Westerberg <mika.westerberg@linux.intel.com>
      Cc: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
      Cc: Yegor Yefremov <yegorslists@googlemail.com>
      Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
      Cc: Giulio Benetti <giulio.benetti@micronovasrl.com>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      Signed-off-by: NSasha Levin <sashal@kernel.org>
      9d45fbee
    • S
      tty: serial_core: Set port active bit in uart_port_activate · ac380eb4
      Serge Semin 提交于
      [ Upstream commit 13b18d35909707571af9539f7731389fbf0feb31 ]
      
      A bug was introduced by commit b3b57646 ("tty: serial_core: convert
      uart_open to use tty_port_open"). It caused a constant warning printed
      into the system log regarding the tty and port counter mismatch:
      
      [   21.644197] ttyS ttySx: tty_port_close_start: tty->count = 1 port count = 2
      
      in case if session hangup was detected so the warning is printed starting
      from the second open-close iteration.
      
      Particularly the problem was discovered in situation when there is a
      serial tty device without hardware back-end being setup. It is considered
      by the tty-serial subsystems as a hardware problem with session hang up.
      In this case uart_startup() will return a positive value with TTY_IO_ERROR
      flag set in corresponding tty_struct instance. The same value will get
      passed to be returned from the activate() callback and then being returned
      from tty_port_open(). But since in this case tty_port_block_til_ready()
      isn't called the TTY_PORT_ACTIVE flag isn't set (while the method had been
      called before tty_port_open conversion was introduced and the rest of the
      subsystem code expected the bit being set in this case), which prevents the
      uart_hangup() method to perform any cleanups including the tty port
      counter setting to zero. So the next attempt to open/close the tty device
      will discover the counters mismatch.
      
      In order to fix the problem we need to manually set the TTY_PORT_ACTIVE
      flag in case if uart_startup() returned a positive value. In this case
      the hang up procedure will perform a full set of cleanup actions including
      the port ref-counter resetting.
      
      Fixes: b3b57646 "tty: serial_core: convert uart_open to use tty_port_open"
      Signed-off-by: NSerge Semin <fancer.lancer@gmail.com>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      Signed-off-by: NSasha Levin <sashal@kernel.org>
      ac380eb4