From mboxrd@z Thu Jan 1 00:00:00 1970 From: bill4carson@gmail.com (bill4carson) Date: Thu, 31 May 2012 15:21:55 +0800 Subject: Query about: ARM11 MPCore: preemption/task migration cache coherency In-Reply-To: <20120531065603.GA2442@mbp> References: <20120530063858.GB6484@mudshark.cambridge.arm.com> <4FC5F017.4050202@gmail.com> <20120531030016.GB29372@mbp> <4FC6E172.4080601@gmail.com> <20120531031941.GA29906@mbp> <4FC6E7CE.9090004@gmail.com> <4FC6FC38.8090904@gmail.com> <4FC706DA.5040308@gmail.com> <20120531065603.GA2442@mbp> Message-ID: <4FC71C13.7090301@gmail.com> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org On 2012?05?31? 14:56, Catalin Marinas wrote: > On Thu, May 31, 2012 at 06:51:22AM +0100, bill4carson wrote: >> On 2012?05?31? 13:19, Catalin Marinas wrote: >>> On 31 May 2012 13:06, bill4carson wrote: >>>> On 2012?05?31? 11:58, Catalin Marinas wrote: >>>>> I still didn't fully understand what the problem is. So, to make sure, >>>>> if you run some applications from flash using a yaffs filesystem, you >>>>> get random crashes. Is this correct? If yes, a solution is to actually >>>>> call flush_dcache_page() on the CPU that does the page copying from >>>>> flash into RAM, which could be the yaffs filesystem. >>>> >>>> The story goes like this: >>>> function "flush_dcache_page" should be global effective >>>> but in ARMv6 MPCore, it was not, it was just local effective due >>>> to hardware design. >>> >>> Yes, I know this. >> >> Then, why not fix "flush_dcache_page" to make it globally effective? > > Performance? > > And it's also just ARM11MPCore microarchitecture specific. > >>>> This may cause error in some cases for example: >>>> >>>> 1) Task running on Core-0 loading text section into memory. >>>> It was preempted and then migrate into Core-1; >>> >>> BTW, do you have CONFIG_PREEMPT enabled? >>> >> Yes, CONFIG_PREEMPT enabled. Thus cause the task was preempted. :-) > > I told you that CONFIG_PREEMPT is not supported on ARM11MPCore :). Point! Is it better to add comment, such as "PREEMPT is not supported for ARM11MPCore" in somewhere(for now, I don't find such place)? then custom will be alerted with such notice when they trying change to PREEMPT. And again, thanks for your patience with me :) > >>> To be clear - is your application reading some data from flash and >>> trying to execute or it's the kernel doing the load via the >>> page/prefetch abort mechanism? >> >> In my current case, it is yaffs root file system. >> >>> If the latter, task running on core 0 gets a prefetch abort when >>> trying to execute some code. The kernel reads the page from flash (via >>> mtd, block layer, VFS) and copies it into RAM. It can be on any CPU as >>> long as it calls flush_dcache_page on the same CPU that copied the >>> data. >>> >>> No matter where the task was running or migrated to, if the code doing >>> the copy also called flush_dcache_page() on the same core, there is no >>> data left in the D-cache for that page. >> >> Yes, I agree with it. >> But how to flush the data cache on the same core with PREEMPT enabled? > > That's not easily possible. But you may get better results with > VOLUNTARY_PREEMPT. > >> And, I think according to the design, there is no such operation that >> guarantee it. > > RFO/WFO tricks only work on ARM11MPCore. > >> But any way, I think flush_dcache_page should be global effective. >> If ARMv6 MPCore didn't make it, we should try to accomplish it. > > Do some performance tests first. > -- Love each day! --bill