我使用下一段代码执行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
所以,问题是:如何检查内存池使用情况?