From: Jens Axboe <axboe@suse.de>
To: Neil Brown <neilb@cse.unsw.edu.au>
Cc: Andrew Morton <akpm@osdl.org>,
phil@dier.us, linux-kernel@vger.kernel.org
Subject: Re: oops with dual xeon 2.8ghz 4gb ram +smp, software raid, lvm, and xfs
Date: Thu, 25 Nov 2004 07:57:32 +0100 [thread overview]
Message-ID: <20041125065728.GA10233@suse.de> (raw)
In-Reply-To: <16805.9199.955186.236115@cse.unsw.edu.au>
On Thu, Nov 25 2004, Neil Brown wrote:
> On Wednesday November 24, akpm@osdl.org wrote:
> > Neil Brown <neilb@cse.unsw.edu.au> wrote:
> > >
> > > Would the following (untested-but-seems-to-compile -
> > > explanation-of-concept) patch be at all reasonable to avoid stack
> > > depth problems with stacked block devices, or is adding stuff to
> > > task_struct frowned upon?
> >
> > It's always a tradeoff - we've put things in task_struct before to get
> > around sticky situations. Certainly, removing potentially unbounded stack
> > utilisation is a worthwhile thing to do.
> >
> > The patch bends my brain a bit.
>
> Recursion is like that (... like recursion, that is :-).
Pardon my ignorance, but where is the bug that called for something like
this? I can't say I love the idea of adding a bio list structure to the
tasklist, it feels pretty hacky. generic_make_request() doesn't really
use that much stack, if you just kill the BDEVNAME_SIZE struct.
===== drivers/block/ll_rw_blk.c 1.280 vs edited =====
--- 1.280/drivers/block/ll_rw_blk.c 2004-11-15 11:21:40 +01:00
+++ edited/drivers/block/ll_rw_blk.c 2004-11-25 07:56:10 +01:00
@@ -67,6 +67,11 @@
EXPORT_SYMBOL(blk_max_low_pfn);
EXPORT_SYMBOL(blk_max_pfn);
+struct b_name {
+ char b[BDEVNAME_SIZE];
+};
+static DEFINE_PER_CPU(struct b_name, b_cpu_name);
+
/* Amount of time in which a process may batch requests */
#define BLK_BATCH_TIME (HZ/50UL)
@@ -2622,19 +2627,21 @@
if (maxsector < nr_sectors ||
maxsector - nr_sectors < sector) {
- char b[BDEVNAME_SIZE];
+ struct b_name *bn = &get_cpu_var(b_cpu_name);
+
/* This may well happen - the kernel calls
* bread() without checking the size of the
* device, e.g., when mounting a device. */
printk(KERN_INFO
"attempt to access beyond end of device\n");
printk(KERN_INFO "%s: rw=%ld, want=%Lu, limit=%Lu\n",
- bdevname(bio->bi_bdev, b),
+ bdevname(bio->bi_bdev, bn->b),
bio->bi_rw,
(unsigned long long) sector + nr_sectors,
(long long) maxsector);
set_bit(BIO_EOF, &bio->bi_flags);
+ put_cpu_var(bn);
goto end_io;
}
}
> > Shouldn't the queueing happen in
> > submit_bio()?
>
> Both md and dm call generic_make_request rather than submit_bio to
> start IO on slaves, so it wouldn't work in submit_bio. If dm and md
> were changes to use submit_bio, then the counts (page-in, page-out)
> would be quite different...
generic_make_request() has always been where the unstacking has
happened, so yeah submit_bio() would not work.
> >
> > Is bi_next free in there? If anyone tries to do synchronous I/O things
> > will get stuck.
>
> It is my understanding the bi_next is free. It is available for use
> by ->make_request_fn and below. __make_request uses it for chaining
> bio's together into a request. raid5 uses it for other things.
That's correct, bi_next is only used for request chaining. So it's
available for free use by the stacking drivers up until they call
make_request on a bio.
> If a ->make_request_fn did synchronous IO things would definitely get
> unstuck. But I don't think they should and doubt if they do (md
> certainly doesn't).
There's nothing guaranteeing that a make_request would not do sync io.
--
Jens Axboe
next prev parent reply other threads:[~2004-11-25 6:58 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
2004-11-22 19:06 oops with dual xeon 2.8ghz 4gb ram +smp, software raid, lvm, and xfs Phil Dier
2004-11-23 0:17 ` Andrew Morton
2004-11-23 15:37 ` Phil Dier
2004-11-23 17:02 ` Jakob Oestergaard
2004-11-23 18:29 ` Phil Dier
2004-11-23 22:39 ` Christoph Hellwig
2004-11-23 22:56 ` Jakob Oestergaard
2004-11-23 23:12 ` Christoph Hellwig
2004-11-30 17:37 ` Phil Dier
2004-11-24 15:45 ` Phil Dier
2004-11-24 16:56 ` Christoph Hellwig
2004-11-24 23:12 ` Andrew Morton
2004-11-25 0:48 ` Phil Dier
2004-11-28 11:29 ` David Greaves
2004-11-28 18:27 ` Andrew Morton
2004-12-08 9:03 ` David Greaves
2004-12-08 9:15 ` Andrew Morton
2004-12-09 3:50 ` Nigel Cunningham
2004-11-24 23:12 ` Neil Brown
2004-11-24 23:50 ` Andrew Morton
2004-11-25 0:14 ` Neil Brown
2004-11-25 1:05 ` Andrew Morton
2004-11-25 6:57 ` Jens Axboe [this message]
2004-11-25 7:08 ` Andrew Morton
2004-11-25 7:11 ` Jens Axboe
-- strict thread matches above, loose matches on Subject: below --
2004-11-23 20:48 Joerg Sommrey
2004-11-24 9:28 Anders Saaby
[not found] <33rTj-1VZ-13@gated-at.bofh.it>
[not found] ` <33wJq-633-25@gated-at.bofh.it>
[not found] ` <34fwL-P1-21@gated-at.bofh.it>
[not found] ` <34fGp-V2-9@gated-at.bofh.it>
[not found] ` <34fGp-V2-7@gated-at.bofh.it>
[not found] ` <34lVr-5WH-1@gated-at.bofh.it>
[not found] ` <34m5a-61Z-9@gated-at.bofh.it>
2004-11-25 11:07 ` Andi Kleen
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=20041125065728.GA10233@suse.de \
--to=axboe@suse.de \
--cc=akpm@osdl.org \
--cc=linux-kernel@vger.kernel.org \
--cc=neilb@cse.unsw.edu.au \
--cc=phil@dier.us \
/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