Re: [PATCH] per process request limits (was Re: IO scheduler, queue depth, nr_requests)

Andrew Morton
2004-02-20T02:33:02Z

Nick Piggin <piggin@cyberone.com.au> wrote:
>
>
>
> Andrew Morton wrote:
>
> >Nick Piggin <piggin@cyberone.com.au> wrote:
> >
> >>Even with this patch, it might still be a good idea to allow
> >>pdflush to disregard the limits...
> >>
> >
> >Has it been confirmed that pdflush is blocking in get_request_wait()? I
> >guess that can happen very occasionally because we don't bother with any
> >locking around there but if it's happening a lot then something is bust.
> >
> >
>
> Miquel's analysis is pretty plausible, but I'm not sure if
> he's confirmed it or not, Miquel? Even if it isn't happening
> a lot, and something isn't bust it might be a good idea to
> do this.

Seems OK from a quick check. pdflush will block in get_request_wait()
occasionally, but not at all often. Perhaps we could move the
write_congested test into the mpage_writepages() inner loop but it hardly
seems worth the risk.

Maybe things are different on Miquel's clockwork controller.

drivers/block/ll_rw_blk.c | 2 ++
fs/fs-writeback.c | 2 ++
2 files changed, 4 insertions(+)

diff -puN drivers/block/ll_rw_blk.c~pdflush-blockage-check drivers/block/ll_rw_blk.c
--- 25/drivers/block/ll_rw_blk.c~pdflush-blockage-check 2004-02-19 18:16:33.000000000 -0800
+++ 25-akpm/drivers/block/ll_rw_blk.c 2004-02-19 18:16:33.000000000 -0800
@@ -1651,6 +1651,8 @@ static struct request *get_request_wait(
if (!rq) {
struct io_context *ioc;

+ WARN_ON(current_is_pdflush());
+
io_schedule();

/*
diff -puN fs/fs-writeback.c~pdflush-blockage-check fs/fs-writeback.c
--- 25/fs/fs-writeback.c~pdflush-blockage-check 2004-02-19 18:22:25.000000000 -0800
+++ 25-akpm/fs/fs-writeback.c 2004-02-19 18:22:43.000000000 -0800
@@ -279,6 +279,8 @@ sync_sb_inodes(struct super_block *sb, s
}

if (wbc->nonblocking && bdi_write_congested(bdi)) {
+ if (current_is_pdflush())
+ printk("saved pdflush\n");
wbc->encountered_congestion = 1;
if (sb != blockdev_superblock)
break; /* Skip a congested fs */

_