Chinaunix首页 | 论坛 | 博客
  • 博客访问: 804897
  • 博文数量: 127
  • 博客积分: 2669
  • 博客等级: 少校
  • 技术积分: 1680
  • 用 户 组: 普通用户
  • 注册时间: 2009-10-23 11:39
文章分类

全部博文(127)

文章存档

2014年(5)

2013年(19)

2012年(25)

2011年(9)

2010年(25)

2009年(44)

分类:

2012-12-14 13:54:47

/**  * 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,回调函数,如果需要的话,由调用方传入函数指针

 

 

菊子曰 用写博客,就是爽!
阅读(1080) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~