Can't read and write simultaneously from serial port

Bug #1815021 reported by Strelok
6
This bug affects 1 person
Affects Status Importance Assigned to Milestone
linux-signed-hwe (Ubuntu)
New
Undecided
Unassigned

Bug Description

With linux kernel <=4.15.0-43 I can start reading serial device (TTY) in block mode and write from another process at the same time (simultaneously). After update to 4.15.0-45 I can't.

[Steps to reproduce]
1) Run in terminal:
cat /dev/ttyS0
"cat" must block terminal and wait for data.
2) Run in another terminal:
echo > /dev/ttyS0

Expected:
"cat" continue wait data and not exit.

Actual:
"cat" exit with return code "1" and show error -EAGAIN (-11):
"cat: /dev/ttyS0: Resource temporarily unavailable"

I think it's regression in kernel, due to new ldisc checks in TTY driver. Please see:
git diff Ubuntu-hwe-4.15.0-43.46_16.04.1 Ubuntu-hwe-4.15.0-45.48_16.04.1 -- drivers/tty/tty_ldisc.c
git diff Ubuntu-hwe-4.15.0-43.46_16.04.1 Ubuntu-hwe-4.15.0-45.48_16.04.1 -- drivers/tty/n_tty.c

diff --git a/drivers/tty/tty_ldisc.c b/drivers/tty/tty_ldisc.c
index 0fd18f5..48fe8d9 100644
--- a/drivers/tty/tty_ldisc.c
+++ b/drivers/tty/tty_ldisc.c
@@ -340,6 +340,11 @@ int tty_ldisc_lock(struct tty_struct *tty, unsigned long timeout)
 {
        int ret;

+ /* Kindly asking blocked readers to release the read side */
+ set_bit(TTY_LDISC_CHANGING, &tty->flags);
+ wake_up_interruptible_all(&tty->read_wait);
+ wake_up_interruptible_all(&tty->write_wait);
+
        ret = __tty_ldisc_lock(tty, timeout);
        if (!ret)
                return -EBUSY;

diff --git a/drivers/tty/n_tty.c b/drivers/tty/n_tty.c
index 63c593a..9805ac1 100644
--- a/drivers/tty/n_tty.c
+++ b/drivers/tty/n_tty.c
@@ -2188,7 +2197,7 @@ static ssize_t n_tty_read(struct tty_struct *tty, struct file *file,
                                        break;
                                if (!timeout)
                                        break;
- if (file->f_flags & O_NONBLOCK) {
+ if (tty_io_nonblock(tty, file)) {
                                        retval = -EAGAIN;
                                        break;
                                }
@@ -2342,7 +2351,7 @@ static ssize_t n_tty_write(struct tty_struct *tty, struct file *file,
                }
                if (!nr)
                        break;
- if (file->f_flags & O_NONBLOCK) {
+ if (tty_io_nonblock(tty, file)) {
                        retval = -EAGAIN;
                        break;
                }

ProblemType: Bug
DistroRelease: Ubuntu 16.04
Package: linux-image-4.15.0-45-generic 4.15.0-45.48~16.04.1
ProcVersionSignature: Ubuntu 4.15.0-45.48~16.04.1-generic 4.15.18
Uname: Linux 4.15.0-45-generic x86_64
NonfreeKernelModules: nvidia_uvm nvidia_drm nvidia_modeset nvidia
ApportVersion: 2.20.1-0ubuntu2.18
Architecture: amd64
CurrentDesktop: MATE
Date: Thu Feb 7 11:42:43 2019
InstallationDate: Installed on 2017-08-01 (554 days ago)
InstallationMedia: Ubuntu 16.04.2 LTS "Xenial Xerus" - Release amd64 (20170215.2)
SourcePackage: linux-signed-hwe
UpgradeStatus: No upgrade log present (probably fresh install)

Revision history for this message
Strelok (who-) wrote :
Revision history for this message
Stephane Chazelas (stephane-chazelas) wrote :

```
$ bash -c 'sleep 1 && : < /dev/tty & read var' < /dev/tty
bash: line 0: read: read error: 0: Resource temporarily unavailable
```

seems to be related and is possibly the same bug. See https://unix.stackexchange.com/questions/499422/bash-how-can-i-run-sudo-n-true-in-the-background-without-interfering-with-r/499433?noredirect=1#comment919635_499433

Revision history for this message
Stephane Chazelas (stephane-chazelas) wrote :
Revision history for this message
Strelok (who-) wrote :

Fixed for me in 4.15.0-46.
Thank you for reply.

To post a comment you must log in.
This report contains Public information  
Everyone can see this information.

Other bug subscribers

Remote bug watches

Bug watches keep track of this bug in other bug trackers.