使用正确的池进行生物克隆

时间:2018-07-25 08:47:35

标签: linux-device-driver

我使用下一段代码执行BIO克隆:

static int __dua_bio_clone  (
    struct bio  *src,
    struct bio  **dst
        )

{

int状态; gfp_t gfp = GFP_NOIO; // GFP_KERNEL; //(GFP_NOIO | __GFP_HIGH);

$TRACE("pool = %p, bio: .min_nr = %d, .curr_nr = %d, bvec: .min_nr = %d, .curr_nr = %d", src->bi_pool,
       src->bi_pool->bio_pool->min_nr, src->bi_pool->bio_pool->curr_nr,
       src->bi_pool->bvec_pool->min_nr, src->bi_pool->bvec_pool->curr_nr);

/* Allocate a memory for a new 'bio' structure */
if ( !(*dst = bio_clone_bioset(src, gfp /* GFP_KERNEL */, src->bi_pool /* NULL*/)) )
    {
    printk(KERN_ERR  __MODULE__ ": bio_clone_bioset() -> NULL\n");

    return  -ENOMEM;
    }

if ( status = bio_alloc_pages(*dst , GFP_KERNEL))
    {
    printk(KERN_ERR  __MODULE__ ": bio_alloc_pages() -> %d\n", status);

    return  status;
    }

/* Copy data from source bio_vec-s to a new bio_vec-s set */
bio_copy_data(*dst, src);


$TRACE("pool = %p, bio: .min_nr = %d, .curr_nr = %d, bvec: .min_nr = %d, .curr_nr = %d", src->bi_pool,
       src->bi_pool->bio_pool->min_nr, src->bi_pool->bio_pool->curr_nr,
       src->bi_pool->bvec_pool->min_nr, src->bi_pool->bvec_pool->curr_nr);

return  0;

}

Debug输出显示mempool的计数器没有更改:

[  527.097603] [ 0xae DUDRIVER\dua_make_request_fn:997] WRITE BIO=ffff8800d5f6b800, .bi_sector=156488, .bi_vcnt=1
[  527.099417] [ 0xae DUDRIVER\__dua_bio_clone:813] pool = ffff8800db805680, bio: .min_nr = 2, .curr_nr = 2, bvec: .min_nr = 2, .curr_nr = 2
[  527.155288] [ 0xae DUDRIVER\__dua_bio_clone:836] pool = ffff8800db805680, bio: .min_nr = 2, .curr_nr = 2, bvec: .min_nr = 2, .curr_nr = 2

所以,问题是:如何检查内存池使用情况?

0 个答案:

没有答案