From: Andrew Morton <akpm@zip.com.au>
To: "Adam J. Richter" <adam@yggdrasil.com>
Cc: axboe@suse.de, linux-kernel@vger.kernel.org
Subject: Re: bio_chain: proposed solution for bio_alloc failure and large IO simplification
Date: Sat, 15 Jun 2002 12:50:12 -0700 [thread overview]
Message-ID: <3D0B9A74.5872B63B@zip.com.au> (raw)
In-Reply-To: <200206151030.DAA01140@adam.yggdrasil.com>
"Adam J. Richter" wrote:
>
> ...
> newbio = q->one_more_bvec(q, bio, page, offset, len);
>
That's a comfortable interface. Or maybe just:
struct bio *bio_add_bvec(bio, page, offset, len);
Couple of points:
- It's tricky to determine how many bvecs are available in
a bio. There is no straightforward "how big is it" field
in struct bio.
- AFAIK, there are no established conventions for BIO assembly.
We have conventions which state what the various fields do
while the BIO is being processed by the block layer, but not
for when the client is assembling the BIO.
What I did, and what I'd suggest as a convention is:
During BIO assembly, bi_vcnt indicates the maximum number of
bvecs which the BIO can hold. And bi_idx indexes the next-free
bvec within the BIO.
If you do this, *now* you have enough information to write
bio_add_bvec:
struct bio *bio_add_bvec(bio, page, offset, len)
{
if (block layer says bio is maximum size) ||
(bio->bi_idx == bio->bi_vcnt) {
bio->bi_vcnt = bio->bi_idx;
bio->bi_idx = 0;
submit_bio(bio); /* Caller has set up bi_end_io() */
bio = NULL;
} else {
bio->bi_io_vec[bio->bi_idx].page = page;
...
bio->bi_idx++;
}
return bio;
}
It returns NULL if the bio was sent so that the caller gets
to allocate the new BIO. If you want to allocate the new BIO
here you'll need to pass in gfp_flags and the new bio's
desired size as well. And copy that size into bi_vcnt.
ll_rw_kio() can be adapted to the above convention too, which will
simplify it a little.
-
next prev parent reply other threads:[~2002-06-15 19:46 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
2002-06-15 10:30 bio_chain: proposed solution for bio_alloc failure and large IO simplification Adam J. Richter
2002-06-15 19:50 ` Andrew Morton [this message]
2002-06-17 6:36 ` Jens Axboe
2002-06-17 7:09 ` Andrew Morton
-- strict thread matches above, loose matches on Subject: below --
2002-06-15 20:24 Adam J. Richter
2002-06-17 6:37 ` Jens Axboe
2002-06-15 20:01 Adam J. Richter
2002-06-15 20:22 ` Andrew Morton
2002-06-15 9:10 Adam J. Richter
2002-06-15 9:14 ` Jens Axboe
2002-06-15 8:52 Adam J. Richter
2002-06-15 9:00 ` Jens Axboe
2002-06-15 8:45 Adam J. Richter
2002-06-15 8:50 ` Jens Axboe
2002-06-15 4:38 Adam J. Richter
2002-06-15 0:22 Adam J. Richter
2002-06-14 23:39 Adam J. Richter
2002-06-14 23:58 ` Andrew Morton
2002-06-15 1:38 ` Oliver Xymoron
2002-06-15 7:55 ` Jens Axboe
2002-06-14 16:52 Adam J. Richter
2002-06-14 23:00 ` Andrew Morton
2002-06-14 23:29 ` William Lee Irwin III
2002-06-14 23:38 ` Andrew Morton
2002-06-15 7:55 ` Jens Axboe
2002-06-14 1:56 Adam J. Richter
2002-06-14 2:24 ` Andreas Dilger
2002-06-14 14:57 ` Jens Axboe
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=3D0B9A74.5872B63B@zip.com.au \
--to=akpm@zip.com.au \
--cc=adam@yggdrasil.com \
--cc=axboe@suse.de \
--cc=linux-kernel@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox