代码之家  ›  专栏  ›  技术社区  ›  Allen Han

Linux内核函数dm\u per\u bio\u data做什么?

  •  1
  • Allen Han  · 技术社区  · 7 年前

    device-mapper.h .

    struct dm_target_io {
        struct dm_io *io;
        struct dm_target *ti;
        unsigned target_bio_nr;
        unsigned *len_ptr;
        struct bio clone;
    };
    
    static inline void *dm_per_bio_data(struct bio *bio, size_t data_size)
    {
        return (char *)bio - offsetof(struct dm_target_io, clone) - data_size;
    }
    

    在device\u mapper中的一条评论中告诉我们。h、 “dm_per_bio_data”返回数据位置我不知道为什么会这样。

    我一直在寻找dm\u target\u io在另一个结构中声明的位置,以了解通过data\u size进行减法可能需要的结果。到目前为止还没有这样的运气。

    1 回复  |  直到 7 年前
        1
  •  1
  •   Akira Hayakawa    7 年前

    per_io_data_size 是这里的钥匙。通过设置 struct dm_target ,device mapper在dm\u target\u io之前为用户定义的数据分配额外空间,因此它们的放置方式如下:

    (额外)(dm_target_io…(克隆))

    因此dm_per_bio_data返回指向额外空间开头的指针。

    struct dm_md_mempools *dm_alloc_md_mempools(struct mapped_device *md, enum dm_queue_mode type,
                                                unsigned integrity, unsigned per_io_data_size)
    {
            struct dm_md_mempools *pools = kzalloc_node(sizeof(*pools), GFP_KERNEL, md->numa_node_id);
            unsigned int pool_size = 0;
            unsigned int front_pad;
    
            if (!pools)
                    return NULL;
    
            switch (type) {
            case DM_TYPE_BIO_BASED:
            case DM_TYPE_DAX_BIO_BASED:
                    pool_size = dm_get_reserved_bio_based_ios();
                    front_pad = roundup(per_io_data_size, __alignof__(struct dm_target_io)) + offsetof(struct dm_target_io, clone);
    
                    pools->io_pool = mempool_create_slab_pool(pool_size, _io_cache);
                    if (!pools->io_pool)
                            goto out;
                    break;
            case DM_TYPE_REQUEST_BASED:
            case DM_TYPE_MQ_REQUEST_BASED:
                    pool_size = dm_get_reserved_rq_based_ios();
                    front_pad = offsetof(struct dm_rq_clone_bio_info, clone);
                    /* per_io_data_size is used for blk-mq pdu at queue allocation */
                    break;
            default:
                    BUG();
            }
    
            pools->bs = bioset_create(pool_size, front_pad, BIOSET_NEED_RESCUER);
            if (!pools->bs)
                    goto out;