io问题已经定位,大家看看有啥解决办法么?

21 views
Skip to first unread message

higur

unread,
Jul 9, 2009, 7:39:31 AM7/9/09
to linux-kernel
linux-kernel,你好
试验了在没有操作系统的情况下,单跑一个while(1),把cache关了,没有丢数据,打开,丢数据。问题定位在cache操作。
但是我们的系统是要做很多处理的,不可能以损失很大代价的前提去满足一个io,所以,在程序里试验了如下几个指令:
iccci,dccci,isync,试验成功,在io操作之后加上这几个中的一条汇编。成功。说明确实是要把cache清了才行。但是还有问题。
我们是一个操作系统,同时的上下文很多。那么清了cache会对其它的上下文有影响。那么如何只影响我一个kthread,而不影响其他的
程序又如何操作呢???大家有思路么?谢谢。。。。^_^....


higur,hi...@163.com
2009-07-09
_______________________________________________
Linux 内核开发中文邮件列表
Linux-...@zh-kernel.org
http://zh-kernel.org/mailman/listinfo/linux-kernel
Linux 内核开发中文社区: http://zh-kernel.org

Baojun Wang

unread,
Jul 9, 2009, 9:56:42 AM7/9/09
to hi...@163.com, linux-kernel
这个问题在驱动中很常见,硬件并不一定能保证内存访问的program order,因此需要写驱动的人手动加入内存屏障(memory
barrier),以保证程序的正确性。

不要自己动手加汇编指令,用wmb() 或是 mmiomb()就可以了

linux内核的Documentation中有DeviceIOBook里面有说明 (make htmldocs)

此外你真的很清楚那几条指令的含义吗?连isync都用上了,这个跟指令没有任何关系的,isync的代价很高,用mbar/msync应该就够了。

- Wang

2009/7/9 higur <hi...@163.com>:

higur

unread,
Jul 9, 2009, 10:22:49 AM7/9/09
to linux-kernel
提到的屏障我试验过了,没起作用,还试验了wmb,ioswrite32等,都没起作用的。所以最后才把操作系统弄掉做的实验。之后又加上操作系统试验,。,,。,不过您提的其他几个函数我明天继续试试,。,。,。谢谢先。

higur,hi...@163.com
2009-07-09
----- Original Message -----
From: Baojun Wang
To: higur
Sent: 2009-07-09, 21:56:42
Subject: Re: io问题已经定位,大家看看有啥解决办法么?


这个问题在驱动中很常见,硬件并不一定能保证内存访问的program order,因此需要写驱动的人手动加入内存屏障(memory
barrier),以保证程序的正确性。

不要自己动手加汇编指令,用wmb() 或是 mmiomb()就可以了

linux内核的Documentation中有DeviceIOBook里面有说明 (make htmldocs)

此外你真的很清楚那几条指令的含义吗?连isync都用上了,这个跟指令没有任何关系的,isync的代价很高,用mbar/msync应该就够了。

- Wang

2009/7/9 higur :

higur

unread,
Jul 9, 2009, 10:37:11 AM7/9/09
to linux-kernel
对了,还要提一下,今天做试验的时候也想过和指令cache没关系,但是现实情况就是用iccci就是管用了。。。。所以在猜想所谓哈佛结构的实现
并没有实际分开,而是在cache里分的。,,。。,还有用于低速的outl_p我也是试过的,没起作用,还在它后面插了好多asm("nop")也没起啥作用。
连续写,单个写的都试验过了。。。。只有当用iccci,或者dccci,或者isync清了cache才能行。。。否则就是丢整帧。。。很是无语,。。,。,
。。。苦恼中。。。。

Xuesong Yang

unread,
Jul 9, 2009, 9:51:39 PM7/9/09
to hi...@163.com, linux-kernel
在分配那段地址的时候设内存区域为non-cacheable,
不知道kernel里有没有类似的函数或者标志位

lijun

unread,
Jul 9, 2009, 8:12:09 PM7/9/09
to higur, linux-kernel
LDD3中说过,io有所谓的边际效应。对于IO的操作一般是不能cache的,并且适当的时候要加入内存屏障的函数,防止编译器的优化导致实际的时序不一致。对于非io操作才能从cache中获得更高的性能。


2009-07-10



lijun



发件人: higur
发送时间: 2009-07-10 00:04:08
收件人: linux-kernel
抄送:
主题: io问题已经定位,大家看看有啥解决办法么?

ZhangXiao

unread,
Jul 10, 2009, 1:14:11 AM7/10/09
to hi...@163.com, linux-kernel

higur wrote:
> linux-kernel,你好
> 试验了在没有操作系统的情况下,单跑一个while(1),把cache关了,没有丢数据,打开,丢数据。问题定位在cache操作。
> 但是我们的系统是要做很多处理的,不可能以损失很大代价的前提去满足一个io,所以,在程序里试验了如下几个指令:
> iccci,dccci,isync,试验成功,在io操作之后加上这几个中的一条汇编。成功。说明确实是要把cache清了才行。
Just a IO port or IO memory?

try ioremap_nocache.

If not, I remember linux supports several functions operate on cache,
something like flush***cache. Not clear, google it.


> 但是还有问题。
> 我们是一个操作系统,同时的上下文很多。那么清了cache会对其它的上下文有影响。
It is safe for other progress/threads. Don't worry about it. :-)

> 那么如何只影响我一个kthread,而不影响其他的
> 程序又如何操作呢???大家有思路么?谢谢。。。。^_^....
>
>

Thanks
Xiao

lijun

unread,
Jul 10, 2009, 2:47:08 AM7/10/09
to Xuesong Yang, hi...@163.com, linux-kernel
貌似ioremap分配的地址范围都是不经过cache的吧,在vm_area_struct 中也有一个标识位vm_flags,取值的选择中就有VM_IO,表明这个区域为设备IO地址,是不cache的。


2009-07-10



lijun



发件人: Xuesong Yang
发送时间: 2009-07-10 12:33:04
收件人: hi...@163.com; linux-kernel
抄送:
主题: RE: io问题已经定位,大家看看有啥解决办法么?

MaJia

unread,
Jul 13, 2009, 3:29:39 AM7/13/09
to ZhangXiao, hi...@163.com, linux-kernel
On Fri, Jul 10, 2009 at 01:14:11PM +0800, ZhangXiao wrote:
>
> higur wrote:
> > linux-kernel,你好
> > 试验了在没有操作系统的情况下,单跑一个while(1),把cache关了,没有丢数据,打开,丢数据。问题定位在cache操作。
> > 但是我们的系统是要做很多处理的,不可能以损失很大代价的前提去满足一个io,所以,在程序里试验了如下几个指令:
> > iccci,dccci,isync,试验成功,在io操作之后加上这几个中的一条汇编。成功。说明确实是要把cache清了才行。
> Just a IO port or IO memory?
>
> try ioremap_nocache.

理论上说,这个函数应该帮你做了所有你需要的工作。应该已经满足了你的需求。
除非因为体系结构的原因,TLB/MMU 对 mapped mem 失去了‘完全’的控制。(Fix
me), :)

>
> If not, I remember linux supports several functions operate on cache,
> something like flush***cache. Not clear, google it.
>

Try:

grep -rnE "cache_*flush" <kernel source>

>
> > 但是还有问题。
> > 我们是一个操作系统,同时的上下文很多。那么清了cache会对其它的上下文有影响。
> It is safe for other progress/threads. Don't worry about it. :-)

他担心的应该是 cache flush 对其他的部分的“效能”影响,而不是“功能”影响。

-MJ

>
> > 那么如何只影响我一个kthread,而不影响其他的
> > 程序又如何操作呢???大家有思路么?谢谢。。。。^_^....
> >
> >
> Thanks
> Xiao
>

ZhangXiao

unread,
Jul 13, 2009, 4:38:02 AM7/13/09
to MaJia, hi...@163.com, linux-kernel
MaJia wrote:
> On Fri, Jul 10, 2009 at 01:14:11PM +0800, ZhangXiao wrote:
>
>> higur wrote:
>>
>>> linux-kernel,你好
>>> 试验了在没有操作系统的情况下,单跑一个while(1),把cache关了,没有丢数据,打开,丢数据。问题定位在cache操作。
>>> 但是我们的系统是要做很多处理的,不可能以损失很大代价的前提去满足一个io,所以,在程序里试验了如下几个指令:
>>> iccci,dccci,isync,试验成功,在io操作之后加上这几个中的一条汇编。成功。说明确实是要把cache清了才行。
>>>
>> Just a IO port or IO memory?
>>
>> try ioremap_nocache.
>>
>
> 理论上说,这个函数应该帮你做了所有你需要的工作。应该已经满足了你的需求。
> 除非因为体系结构的原因,TLB/MMU 对 mapped mem 失去了‘完全’的控制。(Fix
> me), :)
>
>
>> If not, I remember linux supports several functions operate on cache,
>> something like flush***cache. Not clear, google it.
>>
>>
>
> Try:
>
> grep -rnE "cache_*flush" <kernel source>
>
>
>>> 但是还有问题。
>>> 我们是一个操作系统,同时的上下文很多。那么清了cache会对其它的上下文有影响。
>>>
>> It is safe for other progress/threads. Don't worry about it. :-)
>>
>
> 他担心的应该是 cache flush 对其他的部分的“效能”影响,而不是“功能”影响。
>
这里的“清”cache只是把数据缓存里面的内容写入主存,并不是把数据缓存
invalid,所以不会影响别人的效率。至于他这个操作的接收方是如何操作的咱就
不清楚了,所以他这个问题也不排除接收方也同样存在bug。那个清指令缓存解决
问题的方式感觉很难理解,不知道啥原理。 O:-)

alec zhou

unread,
Oct 21, 2009, 3:30:03 AM10/21/09
to lijun, linux-kernel
Cache初始化的时候映射得就有问题,IO地址空间不应该映射Cache。

Alec

2009/7/10 lijun <li...@ceiec-electric.com>

Reply all
Reply to author
Forward
0 new messages