全部博文(127)
分类:
2012-12-14 13:54:47
原文地址:linux 2.6.32 Async_tx代码分析 三 作者:libing881
/** * struct async_submit_ctl - async_tx submission/completion modifiers * @flags: submission modifiers * @depend_tx: parent dependency of the current operation being submitted * @cb_fn: callback routine to run at operation completion * @cb_param: parameter for the callback routine * @scribble: caller provided space for dma/page address conversions */ struct async_submit_ctl { enum async_tx_flags flags; struct dma_async_tx_descriptor *depend_tx; dma_async_tx_callback cb_fn; void *cb_param; void *scribble; };
关键结构体,异步提交的管理结构体,flag就是上次分析的那4个枚举变量,depend_tx就是当前提交操作依赖的父提交结构体
cb_fn当提交操作完成时调用的回调函数,cb_param回调的参数,scribble调用者提供dma空间或者是页地址转换
我们来看看具体raid栈是如何使用DMA的。
简单的看一下async_copy_data函数,在raid5.c中实现
为了调用DMA加速memcpy操作,首先要调用init_async_submit初始化,然后调用async_memcpy
其他类似xor或者计算Q值都是类似的操作,要先初始化,然后调用async_xor或者是async_gen_syndrome,不同之处是,async_copy_data里面异步拷贝操作不没有回调函数,而其它地方都有回调函数
先看看初始化函数,
static inline void init_async_submit(struct async_submit_ctl *args, enum async_tx_flags flags, struct dma_async_tx_descriptor *tx, dma_async_tx_callback cb_fn, void *cb_param, addr_conv_t *scribble) { args->flags = flags; args->depend_tx = tx; args->cb_fn = cb_fn; args->cb_param = cb_param; args->scribble = scribble; }
直接实现在async_tx.h头文件中,是个inline函数,我们可以看见其实现太简单了,就是个赋值操作
没啥好讲的,注意cb代表callback,回调函数,如果需要的话,由调用方传入函数指针