Ralf Baechle wrote, on June 27, 2009 8:49 AM > On Wed, Jun 24, 2009 at 03:18:24PM -0700, Kaz Kylheku wrote: > > > +void __flush_icache_page(struct vm_area_struct *vma, > struct page *page) > > +{ > > + if (vma->vm_flags & VM_EXEC) > > + flush_icache_range((unsigned long) page_address(page), > > PAGE_SIZE); > > +} > > Flush_icache_range takes two arguments, start and end address. Both > addresses are the virtual addresses at which the code will > run. Thanks for pointing that out. After wiping some egg of my face, I'm now testing this change: void __flush_icache_page(struct vm_area_struct *vma, struct page *page) { if (vma->vm_flags & VM_EXEC) - flush_icache_range((unsigned long) page_address(page), PAGE_SIZE); + flush_icache_range(vma->vm_start, vma->vm_end); } I see a small performance improvement, suggesting that it's flushing cache lines more precisely. But I am now more confused, because it turns out that my kernel still runs fine now if I turn the function into a noop! We must have fixed something since the time I was getting this kernel running. Or it could be that I'm using a CF from a different manufacturer. Still, there is the observation that this flush_icache_page restoration also gets Aurelien's Swarm up and running.