taylergreen 发表于 2009-01-12 15:47

问一个关于bio中bi_io_vec个数(bi_vcnt)的问题

最近在看块设备这块,第一次write/read最后都会调到submit_bh

在submit_bh()中,生成bio的过程如下。
    bio = bio_alloc(GFP_NOIO, 1);

    bio->bi_sector = bh->b_blocknr * (bh->b_size >> 9);
    bio->bi_bdev = bh->b_bdev;
    bio->bi_io_vec.bv_page = bh->b_page;
    bio->bi_io_vec.bv_len = bh->b_size;
    bio->bi_io_vec.bv_offset = bh_offset(bh);

    bio->bi_vcnt = 1;
    bio->bi_idx = 0;
    bio->bi_size = bh->b_size;

    bio->bi_end_io = end_bio_bh_io_sync;
    bio->bi_private = bh;

    bio_get(bio);
    submit_bio(rw, bio);
照这样,每个submit的bio最后bi_io_vec数组中 的bio_vec都只有一项。

    想问问bio中bi_io_vec数组是不是就在预读成功的时候会出现多项,其他情况下(所有的一般的读写)都只会有一项。
    请高人指点哈子。

[ 本帖最后由 taylergreen 于 2009-1-12 15:50 编辑 ]

chishanmingshen 发表于 2013-06-12 08:22

本帖最后由 chishanmingshen 于 2013-06-12 08:38 编辑

回复 1# taylergreen

from 3.9.4
static int __bio_add_page(struct request_queue *q, struct bio *bio, struct page
                          *page, unsigned int len, unsigned int offset,
                          unsigned short max_secto
{
      /*
         * For filesystems with a blocksize smaller than the pagesize
         * we will often be called with the same page as last time and
         * a consecutive offset.Optimize this special case.
         */
      if (bio->bi_vcnt > 0) {
                struct bio_vec *prev = &bio->bi_io_vec;

                if (page == prev->bv_page &&
                  offset == prev->bv_offset + prev->bv_len) {
                        unsigned int prev_bv_len = prev->bv_len;
                        prev->bv_len += len;

                        if (q->merge_bvec_fn) {
                              struct bvec_merge_data bvm = {
                                        /* prev_bvec is already charged in
                                           bi_size, discharge it in order to
                                           simulate merging updated prev_bvec
                                           as new bvec. */
                                        .bi_bdev = bio->bi_bdev,
                                        .bi_sector = bio->bi_sector,
                                        .bi_size = bio->bi_size - prev_bv_len,
                                        .bi_rw = bio->bi_rw,
                              };

                              if (q->merge_bvec_fn(q, &bvm, prev) < prev->bv_len) {
                                        prev->bv_len -= len;
                                        return 0;
                              }
                        }

                        goto done;
                }
      }
}
页: [1]
查看完整版本: 问一个关于bio中bi_io_vec个数(bi_vcnt)的问题