All of lore.kernel.org
 help / color / mirror / Atom feed
From: Nick Piggin <piggin@cyberone.com.au>
To: Andrew Morton <akpm@osdl.org>
Cc: schwidefsky@de.ibm.com, linux-kernel@vger.kernel.org, linux-mm@kvack.org
Subject: Re: blk_congestion_wait racy?
Date: Wed, 10 Mar 2004 16:47:01 +1100	[thread overview]
Message-ID: <404EABD5.4060607@cyberone.com.au> (raw)
In-Reply-To: <20040309213518.44adb33d.akpm@osdl.org>

[-- Attachment #1: Type: text/plain, Size: 835 bytes --]



Andrew Morton wrote:

>Nick Piggin <piggin@cyberone.com.au> wrote:
>
>>But I'm guessing that you have no requests in flight by the time
>> blk_congestion_wait gets called, so nothing ever gets kicked.
>>
>
>That's why blk_congestion_wait() in -mm propagates the schedule_timeout()
>return value.   You can do:
>
>	if (blk_congestion_wait(...))
>		printk("ouch\n");
>
>If your kernel says ouch much, we have a problem.
>
>

Martin, have you tried adding this printk?

Andrew, could you take the following patch (even though it didn't fix
the problem).

I think the smp_mb isn't needed because the rl waitqueue stuff is
serialised by the queue spinlocks.

The addition of the smp_mb and the other change is to try to close the
window for races a bit. Obviously they can still happen, it's a racy
interface and it doesn't matter much.


[-- Attachment #2: blk-congestion-races.patch --]
[-- Type: text/x-patch, Size: 1341 bytes --]

 linux-2.6-npiggin/drivers/block/ll_rw_blk.c |    6 ++++--
 1 files changed, 4 insertions(+), 2 deletions(-)

diff -puN drivers/block/ll_rw_blk.c~blk-congestion-races drivers/block/ll_rw_blk.c
--- linux-2.6/drivers/block/ll_rw_blk.c~blk-congestion-races	2004-03-10 16:38:33.000000000 +1100
+++ linux-2.6-npiggin/drivers/block/ll_rw_blk.c	2004-03-10 16:41:29.000000000 +1100
@@ -110,6 +110,9 @@ static void clear_queue_congested(reques
 
 	bit = (rw == WRITE) ? BDI_write_congested : BDI_read_congested;
 	clear_bit(bit, &q->backing_dev_info.state);
+
+	smp_mb(); /* congestion_wqh is not synchronised. This is still racy,
+		   * but better. It isn't a big deal */
 	if (waitqueue_active(wqh))
 		wake_up(wqh);
 }
@@ -1543,7 +1546,6 @@ static void freed_request(request_queue_
 	if (rl->count[rw] < queue_congestion_off_threshold(q))
 		clear_queue_congested(q, rw);
 	if (rl->count[rw]+1 <= q->nr_requests) {
-		smp_mb();
 		if (waitqueue_active(&rl->wait[rw]))
 			wake_up(&rl->wait[rw]);
 		if (!waitqueue_active(&rl->wait[rw]))
@@ -2036,8 +2038,8 @@ long blk_congestion_wait(int rw, long ti
 	DEFINE_WAIT(wait);
 	wait_queue_head_t *wqh = &congestion_wqh[rw];
 
-	blk_run_queues();
 	prepare_to_wait(wqh, &wait, TASK_UNINTERRUPTIBLE);
+	blk_run_queues();
 	ret = io_schedule_timeout(timeout);
 	finish_wait(wqh, &wait);
 	return ret;

_

  reply	other threads:[~2004-03-10  6:41 UTC|newest]

Thread overview: 25+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2004-03-09 17:54 blk_congestion_wait racy? Martin Schwidefsky
2004-03-09 17:54 ` Martin Schwidefsky
2004-03-10  5:23 ` Nick Piggin
2004-03-10  5:23   ` Nick Piggin
2004-03-10  5:35   ` Andrew Morton
2004-03-10  5:35     ` Andrew Morton
2004-03-10  5:47     ` Nick Piggin [this message]
  -- strict thread matches above, loose matches on Subject: below --
2004-03-11 19:04 Martin Schwidefsky
2004-03-11 19:04 ` Martin Schwidefsky
2004-03-11 23:25 ` Andrew Morton
2004-03-11 23:25   ` Andrew Morton
2004-03-12  2:31 ` Nick Piggin
2004-03-12  2:31   ` Nick Piggin
2004-03-11 18:24 Martin Schwidefsky
2004-03-11 18:24 ` Martin Schwidefsky
2004-03-11 18:55 ` Andrew Morton
2004-03-11 18:55   ` Andrew Morton
2004-03-08 13:38 Martin Schwidefsky
2004-03-08 13:38 ` Martin Schwidefsky
2004-03-08 23:50 ` Nick Piggin
2004-03-08 23:50   ` Nick Piggin
2004-03-08  9:59 Martin Schwidefsky
2004-03-08  9:59 ` Martin Schwidefsky
2004-03-08 12:24 ` Andrew Morton
2004-03-08 12:24   ` Andrew Morton

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=404EABD5.4060607@cyberone.com.au \
    --to=piggin@cyberone.com.au \
    --cc=akpm@osdl.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=schwidefsky@de.ibm.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.