免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 9774 | 回复: 10
打印 上一主题 下一主题

[硬件及驱动] ARM下dma_map_page的疑问 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-12-18 01:19 |只看该作者 |倒序浏览
本帖最后由 lyl19 于 2013-12-18 01:40 编辑

Hi All

最近看了些ARM平台下一些WIFI, ETH驱动的DMA操作,有些不明白的地方。
比如说e1000e驱动

对于RX, 当接收到一个数据包时,会dma_unmap_page(FROM_DEVICE), 这个能理解。
当接收完成,还需要分配一个skb挂到descriptor链上,这个时候需要对分配的skb执行 dma_map_page(FROM_DEVICE)

我的问题如下
1.  在返回一个物理地址做为DMA地址时,kernel强烈推荐使用dma_map_page,而不使用其它诸如virt_to_phy之类的函数。
    我猜想这是不是基于可移植性的考虑,因为dma_map_page在各个arch下实现,然后每个处理器有它自己的对DMA地址的一些限制及转换。
    但如果我能通过virt_to_phy之类的把虚拟地址转换成DMA地址,那是不是也可以呢?

2. 从MAP/UNMAP的函数注释上来看,MAP是说函数结束后,对buf的控制权交给了设备,而UNMAP结束后,对buf的控制权又交给了CPU, 在这期间,无控制权一方不能对buf进行操作。
     我对这个很有疑惑,因为从ARM的这两个函数来看,除了返回DMA地址,然后就是做cache inv/clean, 没有说做其它操作把控制权交给谁的。
    这个说法是不是只是一个设想,表示做了这个操作后,因为cache操作已做,交出控制权的一方就不要再对buf进行操作了, 但其实我想操作,也没什么不可以。

3. 对于RX, 为什么新分配的skb还需要做dma_map_page(FROM_DEVICE), 除了获取dma地址之外,它还会做invalidate操作,我认为这个invalidate操作是多余的。
   因为这个buf进行DMA后,再收包时还是会做dma_unmap_page(FROM_DEVICE).
    产生这个疑问是因为需要做performance tuning, 需要尽可能的去掉多余的操作。

Thanks

论坛徽章:
17
水瓶座
日期:2013-08-29 12:09:27白羊座
日期:2014-08-07 12:36:42丑牛
日期:2014-07-24 12:44:41寅虎
日期:2014-04-16 16:15:33寅虎
日期:2014-03-12 09:28:43摩羯座
日期:2014-03-06 13:22:04技术图书徽章
日期:2014-03-06 11:34:50天蝎座
日期:2014-01-09 11:31:44寅虎
日期:2013-12-27 17:01:44双子座
日期:2013-12-27 12:32:29双子座
日期:2013-12-25 09:03:33丑牛
日期:2013-12-24 16:18:44
2 [报告]
发表于 2013-12-18 21:15 |只看该作者
回复 1# lyl19

1. 请思考有iommu或bounce buffer的情况

2. 请思考cache一致性问题或bounce buffer存在的情况

3. 当CPU的cache中有 dirty line对应 buffer,造成write back有可能损坏设备传输的数据,所以必须在dma开始前invalid cache,避免write back!


   

论坛徽章:
0
3 [报告]
发表于 2013-12-18 22:58 |只看该作者
回复 2# asuka2001


    谢谢,我确实没有考虑bounce buffer的情况。
   目前我的实验看起来,第一,使用virt_to_bus也是可以的,第二,MAP了,然后RX MDA后,即使不UNMAP, 也不会出错,只是取到的skb内容不是最新的。

对于第三条,我认为cache对应的是某个物理内存,这个skb buffer只是刚分配,然后挂到descriptor上,至真正的DMA传输都不会访问它,所以cache都不会有这个memory的映射,为什么还要担心write back呢?

Thanks

论坛徽章:
17
水瓶座
日期:2013-08-29 12:09:27白羊座
日期:2014-08-07 12:36:42丑牛
日期:2014-07-24 12:44:41寅虎
日期:2014-04-16 16:15:33寅虎
日期:2014-03-12 09:28:43摩羯座
日期:2014-03-06 13:22:04技术图书徽章
日期:2014-03-06 11:34:50天蝎座
日期:2014-01-09 11:31:44寅虎
日期:2013-12-27 17:01:44双子座
日期:2013-12-27 12:32:29双子座
日期:2013-12-25 09:03:33丑牛
日期:2013-12-24 16:18:44
4 [报告]
发表于 2013-12-18 23:18 |只看该作者
回复 3# lyl19

有对应dma buffer的cache line为dirty

dma_map_page()

设备dma数据到buffer

由于其他的内存操作,造成dirty cache line需要回写。dma buffer中的数据丢失了!


   

论坛徽章:
17
水瓶座
日期:2013-08-29 12:09:27白羊座
日期:2014-08-07 12:36:42丑牛
日期:2014-07-24 12:44:41寅虎
日期:2014-04-16 16:15:33寅虎
日期:2014-03-12 09:28:43摩羯座
日期:2014-03-06 13:22:04技术图书徽章
日期:2014-03-06 11:34:50天蝎座
日期:2014-01-09 11:31:44寅虎
日期:2013-12-27 17:01:44双子座
日期:2013-12-27 12:32:29双子座
日期:2013-12-25 09:03:33丑牛
日期:2013-12-24 16:18:44
5 [报告]
发表于 2013-12-18 23:22 |只看该作者
回复 3# lyl19

至于你认为没有cache line对应该buffer,dma_map_page()无法知道是不是这种情况,为规避风险,肯定 invalid cache才是最安全的!

论坛徽章:
15
射手座
日期:2014-02-26 13:45:082015年迎新春徽章
日期:2015-03-04 09:54:452015年辞旧岁徽章
日期:2015-03-03 16:54:15羊年新春福章
日期:2015-02-26 08:47:552015年亚洲杯之卡塔尔
日期:2015-02-03 08:33:45射手座
日期:2014-12-31 08:36:51水瓶座
日期:2014-06-04 08:33:52天蝎座
日期:2014-05-14 14:30:41天秤座
日期:2014-04-21 08:37:08处女座
日期:2014-04-18 16:57:05戌狗
日期:2014-04-04 12:21:33技术图书徽章
日期:2014-03-25 09:00:29
6 [报告]
发表于 2013-12-19 09:34 |只看该作者
lyl19 发表于 2013-12-18 01:19
Hi All

最近看了些ARM平台下一些WIFI, ETH驱动的DMA操作,有些不明白的地方。

LDD3中文版p439-440中,做了部分的解释,可参考~~

论坛徽章:
0
7 [报告]
发表于 2013-12-19 17:54 |只看该作者
Thanks guys.

"至于你认为没有cache line对应该buffer,dma_map_page()无法知道是不是这种情况,为规避风险,肯定 invalid cache才是最安全的!"

I think this make sense, as from my test, even I didn't MAP from device when allocated a new skb for next receive, it still worked well, but the CPU loading decreased a lot.

BTW, MAP from device actually do cache invalidate and cache clean both.

Sorry that I can't type in Chinese.

Thanks

论坛徽章:
17
水瓶座
日期:2013-08-29 12:09:27白羊座
日期:2014-08-07 12:36:42丑牛
日期:2014-07-24 12:44:41寅虎
日期:2014-04-16 16:15:33寅虎
日期:2014-03-12 09:28:43摩羯座
日期:2014-03-06 13:22:04技术图书徽章
日期:2014-03-06 11:34:50天蝎座
日期:2014-01-09 11:31:44寅虎
日期:2013-12-27 17:01:44双子座
日期:2013-12-27 12:32:29双子座
日期:2013-12-25 09:03:33丑牛
日期:2013-12-24 16:18:44
8 [报告]
发表于 2013-12-20 09:14 |只看该作者
本帖最后由 asuka2001 于 2013-12-20 09:20 编辑

回复 7# lyl19

map from device应该不需要clean cache。既然已经是提供给设备访问的buffer,即使将dirty cache刷回到主存又有什么意义呢?

kernel 3.11.5:arch/arm/mm/dma-mapping.c

static void __dma_page_cpu_to_dev(struct page *page, unsigned long off,
        size_t size, enum dma_data_direction dir)
{
        unsigned long paddr;

        dma_cache_maint_page(page, off, size, dir, dmac_map_area);

        paddr = page_to_phys(page) + off;
        if (dir == DMA_FROM_DEVICE) {
                outer_inv_range(paddr, paddr + size);

        } else {
                outer_clean_range(paddr, paddr + size);
        }
        /* FIXME: non-speculating: flush on bidirectional mappings? */
}


代码里可以看出,应该是只做了invalid,没有clean。除非是TO_DEVICE才需要将dirty cache刷回主存!

另外还有种情况就是range的开头结尾是非cache line对齐的话,头尾两个cache line需要clean。


   

论坛徽章:
0
9 [报告]
发表于 2013-12-23 12:18 |只看该作者
回复 8# asuka2001

outer_inv_range(paddr, paddr + size);
This is for L2 cache, and if you check dma_cache_maint_page, you will find it invalidate and clean the L1 cache.

This is the ARMV7 cache code, just for your reference

ENTRY(v7_dma_map_area)
        add        r1, r1, r0
        teq        r2, #DMA_FROM_DEVICE
        beq        v7_dma_inv_range
        b        v7_dma_clean_range
ENDPROC(v7_dma_map_area)


Thanks


   

论坛徽章:
17
水瓶座
日期:2013-08-29 12:09:27白羊座
日期:2014-08-07 12:36:42丑牛
日期:2014-07-24 12:44:41寅虎
日期:2014-04-16 16:15:33寅虎
日期:2014-03-12 09:28:43摩羯座
日期:2014-03-06 13:22:04技术图书徽章
日期:2014-03-06 11:34:50天蝎座
日期:2014-01-09 11:31:44寅虎
日期:2013-12-27 17:01:44双子座
日期:2013-12-27 12:32:29双子座
日期:2013-12-25 09:03:33丑牛
日期:2013-12-24 16:18:44
10 [报告]
发表于 2013-12-23 13:09 |只看该作者
回复 9# lyl19

不太明白你的意思,代码中也的确是只invalid了cache啊。

这里使用的是beq指令,后面v7_dma_inv_range()中直接 mov        pc, lr。不会返回到v7_dma_map_area()中继续执行v7_dma_clean_range()啊!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP