Fix long-standing regression in ser_gigaset ISDN driver
Subsystems (2)
cover Fix long-standing regression in ser_gigaset ISDN driver
This series fixes a serious regression in the Gigaset M101 driver introduced in kernel release 3.10 and removes some unneeded code.
Please also queue up patch 1 of the series for inclusion in the stable/longterm releases 3.10 and later.
Tilman Schmidt (2):
isdn/gigaset: reset tty->receive_room when attaching ser_gigaset isdn/gigaset: drop unused ldisc methods
drivers/isdn/gigaset/ser-gigaset.c | 35 ++++++++++------------------------- 1 files changed, 10 insertions(+), 25 deletions(-)
PATCH 1/2 isdn/gigaset: reset tty->receive_room when attaching ser_gigaset
Commit 79901317ce80 ("n_tty: Don't flush buffer when closing ldisc"), first merged in kernel release 3.10, caused the following regression in the Gigaset M101 driver:
Before that commit, when closing the N_TTY line discipline in preparation to switching to N_GIGASET_M101, receive_room would be reset to a non-zero value by the call to n_tty_flush_buffer() in n_tty's close method. With the removal of that call, receive_room might be left at zero, blocking data reception on the serial line.
The present patch fixes that regression by setting receive_room to an appropriate value in the ldisc open method.
--- drivers/isdn/gigaset/ser-gigaset.c | 11 ++++++++++- 1 files changed, 10 insertions(+), 1 deletions(-)
drivers/isdn/gigaset/ser-gigaset.c +10 -1
@@ -524,9 +524,18 @@ gigaset_tty_open(struct tty_struct *tty) cs->hw.ser->tty = tty;atomic_set (&cs->hw.ser->refcnt,1 );init_completion (&cs->hw.ser->dead_cmp); - tty->disc_data = cs; +/* Set the amount of data we're willing to receive per call +* from the hardware driver to half of the input buffer size +* to leave some reserve. +* Note: We don't do flow control towards the hardware driver. +* If more data is received than will fit into the input buffer, +* it will be dropped and an error will be logged. This should +* never happen as the device is slow and the buffer size ample. +*/ + tty->receive_room =RBUFSIZE /2 ; +/* OK.. Initialization of the datastructures and the HW is done.. Now * startup system and notify the LL that we are ready to run */
Signature · 1 line
1.7.1
Re: [PATCH 1/2] isdn/gigaset: reset tty->receive_room when attaching ser_gigaset
Quoted 9 lines · Tilman Schmidt
Commit
79901317ce80("n_tty: Don't flush buffer when closing ldisc"), first merged in kernel release 3.10, caused the following regression in the Gigaset M101 driver:Before that commit, when closing the
N_TTYline discipline in preparation to switching toN_GIGASET_M101,receive_roomwould be reset to a non-zero value by the call ton_tty_flush_buffer()in n_tty's close method. With the removal of that call,receive_roommight be left at zero, blocking data reception on the serial line.
That commit didn't cause the problem; it was a bug all along.
For example, if the tty had first been hooked up to some other line discipline which consumed most of tty->receive_room, _then_ switched to N_GIGASET_M101 line discipline, the same problem would have occurred.
Non-flow controlling line disciplines _must_ set tty->receive_room on line discipline open because they are declaring that every input they can accept that much data.
Regards,
Peter Hurley
Quoted 34 lines
The present patch fixes that regression by setting
receive_roomto an appropriate value in the ldisc open method.Fixes 79901317ce80 ("n_tty: Don't flush buffer when closing ldisc")Signed-off-by Tilman Schmidt <[email protected]>--- drivers/isdn/gigaset/ser-gigaset.c | 11 ++++++++++- 1 files changed, 10 insertions(+), 1 deletions(-)drivers/isdn/gigaset/ser-gigaset.c +10
-1@@ -524,9 +524,18 @@ gigaset_tty_open(struct tty_struct *tty) cs->hw.ser->tty = tty;atomic_set (&cs->hw.ser->refcnt,1 );init_completion (&cs->hw.ser->dead_cmp); - tty->disc_data = cs; +/* Set the amount of data we're willing to receive per call +* from the hardware driver to half of the input buffer size +* to leave some reserve. +* Note: We don't do flow control towards the hardware driver. +* If more data is received than will fit into the input buffer, +* it will be dropped and an error will be logged. This should +* never happen as the device is slow and the buffer size ample. +*/ + tty->receive_room =RBUFSIZE /2 ; +/* OK.. Initialization of the datastructures and the HW is done.. Now * startup system and notify the LL that we are ready to run */
Re: [PATCH 1/2] isdn/gigaset: reset tty->receive_room when attaching ser_gigaset
Am 14.07.2015 um 01:14 schrieb Peter Hurley:
Quoted 5 lines · Tilman Schmidt
Quoted 4 lines
Commit
79901317ce80("n_tty: Don't flush buffer when closing ldisc"), first merged in kernel release 3.10, caused the following regression in the Gigaset M101 driver:
Quoted 7 lines
Quoted 5 lines
Before that commit, when closing the
N_TTYline discipline in preparation to switching toN_GIGASET_M101,receive_roomwould be reset to a non-zero value by the call ton_tty_flush_buffer()in n_tty's close method. With the removal of that call,receive_roommight be left at zero, blocking data reception on the serial line.That commit didn't cause the problem; it was a bug all along.
Sure. That's why it is correctly fixed in the Gigaset driver. But before that commit the bug was never actually triggered. So that commit defines the point in the commit history from which the fix is needed, and therefore needs to be mentioned in order to decide which stable releases will need the fix.
Quoted 3 lines
Non-flow controlling line disciplines _must_ set
tty->receive_roomon line discipline open because they are declaring that every input they can accept that much data.
I have submitted a corresponding fix to the line discipline documentation separately.
Thanks,
Tilman
Paul Bolle
AppliedRe: [PATCH 1/2] isdn/gigaset: reset tty->receive_room when attaching ser_gigaset
Quoted 8 lines · Tilman Schmidt
Am 14.07.2015 um 01:14 schrieb Peter Hurley:
Quoted 1 line
That commit didn't cause the problem; it was a bug all along.
Sure. That's why it is correctly fixed in the Gigaset driver. But before that commit the bug was never actually triggered. So that commit defines the point in the commit history from which the fix is needed, and therefore needs to be mentioned in order to decide which stable releases will need the fix.
Yes, this seems a classic example of a bugfix that reveals another bug. So the Fixes: tag, which does sound a bit awkward, really is appropriate.
For ser-gigaset about the only line discipline change that will be triggered, in practice, is from N_TTY to N_GIGASET_M101. Until commit 79901317ce80 ("n_tty: Don't flush buffer when closing ldisc") that change would set receive_room to N_TTY_BUF_SIZE (ie, 4096). This patch will set receive_room for ser-gigaset to RBUFSIZE/2 (ie, again 4096). So we're back at the pre v3.10 behavior.
I'm really thankful that Tilman managed to bisect this and subsequently saw how it could be properly fixed. I hope to forward this patch in a few weeks so that it might finally be fixed in v4.3.
Applied.
Paul Bolle
Re: [PATCH 1/2] isdn/gigaset: reset tty->receive_room when attaching ser_gigaset
In reply to Tilman SchmidtHello.
Quoted 24 lines · Tilman Schmidt
Commit
79901317ce80("n_tty: Don't flush buffer when closing ldisc"), first merged in kernel release 3.10, caused the following regression in the Gigaset M101 driver:Before that commit, when closing the
N_TTYline discipline in preparation to switching toN_GIGASET_M101,receive_roomwould be reset to a non-zero value by the call ton_tty_flush_buffer()in n_tty's close method. With the removal of that call,receive_roommight be left at zero, blocking data reception on the serial line.The present patch fixes that regression by setting
receive_roomto an appropriate value in the ldisc open method.Fixes 79901317ce80 ("n_tty: Don't flush buffer when closing ldisc")Signed-off-by Tilman Schmidt <[email protected]>--- drivers/isdn/gigaset/ser-gigaset.c | 11 ++++++++++- 1 files changed, 10 insertions(+), 1 deletions(-)drivers/isdn/gigaset/ser-gigaset.c +0
-0
drivers/isdn/gigaset/ser-gigaset.c gigaset_tty_open(struct tty_struct *tty) · line 527
Quoted 4 lines
drivers/isdn/gigaset/ser-gigaset.c +0
-1@@ -524,9 +524,18 @@ gigaset_tty_open(struct tty_struct *tty) cs->hw.ser->tty = tty;atomic_set (&cs->hw.ser->refcnt,1 );init_completion (&cs->hw.ser->dead_cmp); -
Unrelated change?
drivers/isdn/gigaset/ser-gigaset.c gigaset_tty_open(struct tty_struct *tty) · line 537
Quoted 11 lines
drivers/isdn/gigaset/ser-gigaset.c +9
-0tty->disc_data = cs; +/* Set the amount of data we're willing to receive per call +* from the hardware driver to half of the input buffer size +* to leave some reserve. +* Note: We don't do flow control towards the hardware driver. +* If more data is received than will fit into the input buffer, +* it will be dropped and an error will be logged. This should +* never happen as the device is slow and the buffer size ample. +*/ + tty->receive_room =RBUFSIZE /2 ;
The general kernel coding style is to surround operators with spaces.
[...]
MBR, Sergei
PATCH 2/2 isdn/gigaset: drop unused ldisc methods
In reply to Tilman SchmidtThe line discipline read and write methods are optional so the dummy methods in ser_gigaset are unnecessary and can be removed.
--- drivers/isdn/gigaset/ser-gigaset.c | 24 ------------------------ 1 files changed, 0 insertions(+), 24 deletions(-)
drivers/isdn/gigaset/ser-gigaset.c +0 -24
@@ -607,28 +607,6 @@ static int gigaset_tty_hangup(struct tty_struct *tty) }/* -* Read on the tty. -* Unused, received data goes only to the Gigaset driver. -*/ -static ssize_t -gigaset_tty_read (struct tty_struct *tty,struct file *file, -unsigned char __user *buf,size_t count) -{ -return -EAGAIN ; -} - -/* -* Write on the tty. -* Unused, transmit data comes only from the Gigaset driver. -*/ -static ssize_t -gigaset_tty_write (struct tty_struct *tty,struct file *file, -const unsigned char *buf,size_t count) -{ -return -EAGAIN ; -} - -/* * Ioctl on the tty. * Called in process context only. * May be re-entered by multiple ioctl calling threads.
@@ -761,8 +739,6 @@ static struct tty_ldisc_ops gigaset_ldisc = { .open = gigaset_tty_open, .close = gigaset_tty_close, .hangup = gigaset_tty_hangup, - .read = gigaset_tty_read, - .write = gigaset_tty_write, .ioctl = gigaset_tty_ioctl, .receive_buf = gigaset_tty_receive, .write_wakeup = gigaset_tty_wakeup,
Signature · 1 line
1.7.1
Paul Bolle
AppliedRe: [PATCH 2/2] isdn/gigaset: drop unused ldisc methods
Quoted 4 lines · Tilman Schmidt
The line discipline read and write methods are optional so the dummy methods in
ser_gigasetare unnecessary and can be removed.Signed-off-by Tilman Schmidt <[email protected]>
Applied.
I hope to forward this in a few weeks so that it might be in time for v4.3.
Thanks,
Paul Bolle
David Miller
maintainerFrom: Tilman Schmidt <[email protected]>
Date: Tue, 14 Jul 2015 00:37:13 +0200 (CEST)
Quoted 5 lines
This series fixes a serious regression in the Gigaset M101 driver introduced in kernel release 3.10 and removes some unneeded code.
Please also queue up patch 1 of the series for inclusion in the stable/longterm releases 3.10 and later.
Series applied and patch #1 queued up for -stable, thanks.