All of lore.kernel.org
 help / color / mirror / Atom feed
From: Oliver Neukum <oneukum@suse.com>
To: Johan Hovold <johan@kernel.org>
Cc: linux-usb@vger.kernel.org
Subject: Re: [PATCH] gpss: core: no waiters left behind on deregister
Date: Mon, 01 Jul 2019 12:00:38 +0200	[thread overview]
Message-ID: <1561975238.10014.10.camel@suse.com> (raw)
In-Reply-To: <20190626114139.GC508@localhost>

Am Mittwoch, den 26.06.2019, 13:41 +0200 schrieb Johan Hovold:
> On Wed, Jun 26, 2019 at 01:04:07PM +0200, Oliver Neukum wrote:
> > Am Dienstag, den 25.06.2019, 09:04 +0200 schrieb Johan Hovold:
> > > On Mon, Jun 24, 2019 at 10:33:23AM +0200, Oliver Neukum wrote:
> > > > If you deregister a device you need to wake up all waiters
> > > > as there will be no further wakeups.
> > > > 
> > > > Signed-off-by: Oliver Neukum <oneukum@suse.com>
> > > > ---
> > > >  drivers/gnss/core.c | 2 +-
> > > >  1 file changed, 1 insertion(+), 1 deletion(-)
> > > > 
> > > > diff --git a/drivers/gnss/core.c b/drivers/gnss/core.c
> > > > index e6f94501cb28..0d13bd2cefd5 100644
> > > > --- a/drivers/gnss/core.c
> > > > +++ b/drivers/gnss/core.c
> > > > @@ -303,7 +303,7 @@ void gnss_deregister_device(struct gnss_device *gdev)
> > > >  	down_write(&gdev->rwsem);
> > > >  	gdev->disconnected = true;
> > > >  	if (gdev->count) {
> > > > -		wake_up_interruptible(&gdev->read_queue);
> > > > +		wake_up_interruptible_all(&gdev->read_queue);
> > > 
> > > GNSS core doesn't have any exclusive waiters, so no need to use use the
> > > exclusive wake-up (all) interface.
> > 
> > Well, yes, but that is the problem. In gnss_read() you drop the lock:
> > That means that an arbitrary number of tasks can get here.
> > 
> >                 ret = wait_event_interruptible(gdev->read_queue,
> >                                 gdev->disconnected ||
> >                                 !kfifo_is_empty(&gdev->read_fifo));
> > 
> > Meaning that an arbitrary number can be sleeping here.
> 
> I understand wait you're getting at, but I think your mistaken regarding
> exclusive wait. Note that wait_event_interruptible() uses nonexclusive
> wait.
> 
> > Yet in gnss_deregister_device() you use a simple wake_up:
> > 
> > void gnss_deregister_device(struct gnss_device *gdev)
> > 
> > {
> > 
> >         down_write(&gdev->rwsem);
> >         gdev->disconnected = true;
> >         if (gdev->count) {
> >                 wake_up_interruptible(&gdev->read_queue);
> > 
> > 
> > wake_up_interruptible() will wake up one waiting task. But after that
> > the device is gone. There will be no further events. The other tasks
> > will sleep forever.
> 
> No, wake_up_interruptible() will wake up all nonexclusive waiters,
> which is all we care about here.

You are right and tracing this is hard.

	Regards & Sorry
		Oliver


  reply	other threads:[~2019-07-01 10:14 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-06-24  8:33 [PATCH] gpss: core: no waiters left behind on deregister Oliver Neukum
2019-06-25  7:04 ` Johan Hovold
2019-06-26 11:04   ` Oliver Neukum
2019-06-26 11:41     ` Johan Hovold
2019-07-01 10:00       ` Oliver Neukum [this message]
2019-06-25 10:47 ` Sergei Shtylyov

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=1561975238.10014.10.camel@suse.com \
    --to=oneukum@suse.com \
    --cc=johan@kernel.org \
    --cc=linux-usb@vger.kernel.org \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.