From: Dmitry Safonov <dima@arista.com>
To: linux-kernel@vger.kernel.org
Cc: "Dmitry Safonov" <0x7f454c46@gmail.com>,
"Dmitry Safonov" <dima@arista.com>,
"Daniel Axtens" <dja@axtens.net>,
"Dmitry Vyukov" <dvyukov@google.com>,
"Mark Rutland" <mark.rutland@arm.com>,
"Michael Neuling" <mikey@neuling.org>,
"Mikulas Patocka" <mpatocka@redhat.com>,
"Nathan March" <nathan@gt.net>, "Pasi Kärkkäinen" <pasik@iki.fi>,
"Peter Hurley" <peter@hurleysoftware.com>,
"Peter Zijlstra" <peterz@infradead.org>,
"Rong, Chen" <rong.a.chen@intel.com>,
"Sergey Senozhatsky" <sergey.senozhatsky.work@gmail.com>,
"Tan Xiaojun" <tanxiaojun@huawei.com>,
"Tetsuo Handa" <penguin-kernel@I-love.SAKURA.ne.jp>,
"Greg Kroah-Hartman" <gregkh@linuxfoundation.org>,
"Jiri Slaby" <jslaby@suse.com>
Subject: [PATCHv5 7/7] tty/ldsem: Decrement wait_readers on timeouted down_read()
Date: Tue, 18 Sep 2018 00:52:58 +0100 [thread overview]
Message-ID: <20180917235258.5719-8-dima@arista.com> (raw)
In-Reply-To: <20180917235258.5719-1-dima@arista.com>
It seems like when ldsem_down_read() fails with timeout, it misses
update for sem->wait_readers. By that reason, when writer finally
releases write end of the semaphore __ldsem_wake_readers() does adjust
sem->count with wrong value:
sem->wait_readers * (LDSEM_ACTIVE_BIAS - LDSEM_WAIT_BIAS)
I.e, if update comes with 1 missed wait_readers decrement, sem->count
will be 0x100000001 which means that there is active reader and it'll
make any further writer to fail in acquiring the semaphore.
It looks like, this is a dead-code, because ldsem_down_read() is never
called with timeout different than MAX_SCHEDULE_TIMEOUT, so it might be
worth to delete timeout parameter and error path fall-back..
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: Jiri Slaby <jslaby@suse.com>
Signed-off-by: Dmitry Safonov <dima@arista.com>
---
drivers/tty/tty_ldsem.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/drivers/tty/tty_ldsem.c b/drivers/tty/tty_ldsem.c
index d4d0dbf4a6d9..717292c1c0df 100644
--- a/drivers/tty/tty_ldsem.c
+++ b/drivers/tty/tty_ldsem.c
@@ -212,6 +212,7 @@ down_read_failed(struct ld_semaphore *sem, long count, long timeout)
raw_spin_lock_irq(&sem->wait_lock);
if (waiter.task) {
atomic_long_add_return(-LDSEM_WAIT_BIAS, &sem->count);
+ sem->wait_readers--;
list_del(&waiter.list);
raw_spin_unlock_irq(&sem->wait_lock);
put_task_struct(waiter.task);
--
2.13.6
next prev parent reply other threads:[~2018-09-17 23:53 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-09-17 23:52 [PATCHv5 0/7] tty: Hold write ldisc sem in tty_reopen() Dmitry Safonov
2018-09-17 23:52 ` [PATCHv5 1/7] tty: Drop tty->count on tty_reopen() failure Dmitry Safonov
2018-09-18 13:41 ` Greg Kroah-Hartman
2018-09-18 14:15 ` Dmitry Safonov
2018-09-17 23:52 ` [PATCHv5 2/7] tty/ldsem: Wake up readers after timed out down_write() Dmitry Safonov
2018-09-18 13:43 ` Greg Kroah-Hartman
2018-09-18 14:12 ` Dmitry Safonov
2018-09-17 23:52 ` [PATCHv5 3/7] tty: Hold tty_ldisc_lock() during tty_reopen() Dmitry Safonov
2018-09-18 13:47 ` Greg Kroah-Hartman
2018-09-18 14:19 ` Dmitry Safonov
2018-09-17 23:52 ` [PATCHv5 4/7] tty: Simplify tty->count math in tty_reopen() Dmitry Safonov
2018-09-17 23:52 ` [PATCHv5 5/7] tty/ldsem: Convert to regular lockdep annotations Dmitry Safonov
2018-09-17 23:52 ` [PATCHv5 6/7] tty/ldsem: Add lockdep asserts for ldisc_sem Dmitry Safonov
2018-09-18 13:49 ` Greg Kroah-Hartman
2018-09-18 14:21 ` Dmitry Safonov
2018-09-17 23:52 ` Dmitry Safonov [this message]
2018-09-19 16:56 ` [PATCHv5 0/7] tty: Hold write ldisc sem in tty_reopen() Mikulas Patocka
2018-09-19 17:35 ` Mikulas Patocka
2018-09-19 17:45 ` Dmitry Safonov
2018-09-19 20:03 ` Mikulas Patocka
2018-09-19 20:21 ` Dmitry Safonov
2018-09-20 14:25 ` Mikulas Patocka
2018-10-15 13:37 ` Pasi Kärkkäinen
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20180917235258.5719-8-dima@arista.com \
--to=dima@arista.com \
--cc=0x7f454c46@gmail.com \
--cc=dja@axtens.net \
--cc=dvyukov@google.com \
--cc=gregkh@linuxfoundation.org \
--cc=jslaby@suse.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mark.rutland@arm.com \
--cc=mikey@neuling.org \
--cc=mpatocka@redhat.com \
--cc=nathan@gt.net \
--cc=pasik@iki.fi \
--cc=penguin-kernel@I-love.SAKURA.ne.jp \
--cc=peter@hurleysoftware.com \
--cc=peterz@infradead.org \
--cc=rong.a.chen@intel.com \
--cc=sergey.senozhatsky.work@gmail.com \
--cc=tanxiaojun@huawei.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).