All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jan Kara <jack@suse.cz>
To: Keith Busch <kbusch@kernel.org>
Cc: Jan Kara <jack@suse.cz>, Yu Kuai <yukuai1@huaweicloud.com>,
	axboe@kernel.dk, osandov@fb.com, linux-block@vger.kernel.org,
	linux-kernel@vger.kernel.org, yukuai3@huawei.com,
	yi.zhang@huawei.com
Subject: Re: [PATCH] sbitmap: fix possible io hung due to lost wakeup
Date: Wed, 7 Sep 2022 18:41:50 +0200	[thread overview]
Message-ID: <20220907164150.tykjl3jsctjddcnq@quack3> (raw)
In-Reply-To: <YxinFEYRCU/QuQ5w@kbusch-mbp.dhcp.thefacebook.com>

On Wed 07-09-22 08:13:40, Keith Busch wrote:
> On Wed, Sep 07, 2022 at 12:23:18PM +0200, Jan Kara wrote:
> > On Tue 06-09-22 15:27:51, Keith Busch wrote:
> > > On Wed, Aug 03, 2022 at 08:15:04PM +0800, Yu Kuai wrote:
> > > >  	wait_cnt = atomic_dec_return(&ws->wait_cnt);
> > > > -	if (wait_cnt <= 0) {
> > > > -		int ret;
> > > > +	/*
> > > > +	 * For concurrent callers of this, callers should call this function
> > > > +	 * again to wakeup a new batch on a different 'ws'.
> > > > +	 */
> > > > +	if (wait_cnt < 0 || !waitqueue_active(&ws->wait))
> > > > +		return true;
> > > 
> > > If wait_cnt is '0', but the waitqueue_active happens to be false due to racing
> > > with add_wait_queue(), this returns true so the caller will retry.
> > 
> > Well, note that sbq_wake_ptr() called to obtain 'ws' did waitqueue_active()
> > check. So !waitqueue_active() should really happen only if waiter was woken
> > up by someone else or so. Not that it would matter much but I wanted to
> > point it out.
> > 
> > > The next atomic_dec will set the current waitstate wait_cnt < 0, which
> > > also forces an early return true. When does the wake up happen, or
> > > wait_cnt and wait_index get updated in that case?
> > 
> > I guess your concern could be rephrased as: Who's going to ever set
> > ws->wait_cnt to value > 0 if we ever exit with wait_cnt == 0 due to
> > !waitqueue_active() condition?
> > 
> > And that is a good question and I think that's a bug in this patch. I think
> > we need something like:
> > 
> > 	...
> > 	/*
> > 	 * For concurrent callers of this, callers should call this function
> > 	 * again to wakeup a new batch on a different 'ws'.
> > 	 */
> > 	if (wait_cnt < 0)
> > 		return true;
> > 	/*
> > 	 * If we decremented queue without waiters, retry to avoid lost
> > 	 * wakeups.
> > 	 */
> > 	if (wait_cnt > 0)
> > 		return !waitqueue_active(&ws->wait);
> 
> I'm not sure about this part. We've already decremented, so the freed bit is
> accounted for against the batch. Returning true here may double-count the freed
> bit, right?

Yes, we may wake up waiters unnecessarily frequently. But that's a
performance issue at worst and only if it happens frequently. So I don't
think it matters in practice (famous last words ;).

								Honza
-- 
Jan Kara <jack@suse.com>
SUSE Labs, CR

  reply	other threads:[~2022-09-07 16:42 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-08-03 12:15 [PATCH] sbitmap: fix possible io hung due to lost wakeup Yu Kuai
2022-08-13  5:58 ` Yu Kuai
2022-08-23 13:37 ` Jens Axboe
2022-09-06 21:27 ` Keith Busch
2022-09-07  1:12   ` Yu Kuai
2022-09-07 10:23   ` Jan Kara
2022-09-07 14:13     ` Keith Busch
2022-09-07 16:41       ` Jan Kara [this message]
2022-09-07 18:20         ` Keith Busch
2022-09-08  9:33           ` Jan Kara
2022-09-08  9:45             ` Yu Kuai

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=20220907164150.tykjl3jsctjddcnq@quack3 \
    --to=jack@suse.cz \
    --cc=axboe@kernel.dk \
    --cc=kbusch@kernel.org \
    --cc=linux-block@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=osandov@fb.com \
    --cc=yi.zhang@huawei.com \
    --cc=yukuai1@huaweicloud.com \
    --cc=yukuai3@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 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.