ARM cacheflush syscall with range that spans multiple vma

Russell King - ARM Linux linux at arm.linux.org.uk
Mon Jun 10 19:42:47 EDT 2013


On Mon, Jun 10, 2013 at 01:16:57PM -0700, John Reiser wrote:
> On 06/10/2013 02:09 AM -0700, Will Deacon wrote:
> > On Mon, Jun 10, 2013 at 09:59:48AM +0100, Russell King - ARM Linux wrote:
> >> On Sun, Jun 09, 2013 at 05:05:24PM -0700, John Reiser wrote:
> >>> Why does the ARM cacheflush syscall stop after the lowest vma
> >>> which intersects the user-requested range?  The range could
> >>> span more than one vma having contiguous addresses, such as
> >>> two files MAP_SHARED into adjacent pages; or even a region
> >>> that contains holes (pages not present.)
> >>
> >> Because you're not supposed to use it on large ranges because it's
> >> an expensive operation.
> > 
> > I posted some patches to address this recently. Obviously it's still
> > expensive, but it makes the syscall restartable so that you can't DoS the
> > system.
> > 
> >   git://git.kernel.org/pub/scm/linux/kernel/git/will/linux.git cacheflush
> > 
> > There's WIP code there for a new iovec-based syscall too.
> 
> Please merge those patches soon.
> 
> My "app" is user-mode execve() of a compressed ET_EXEC, so UPX must flush
> all of the re-generated .text, which can be a megabyte or more.  Thus I flush
> one page per syscall, or write all of .text to a temporary file
> (achieves cache flush because DMA accesses only memory, not cache),
> or heuristically flush by "sweeping" 1/2 MB of consecutive words (thus
> generating deliberate collisions and evictions.)  Each of those sucks.
> 
> It is *EXTREMELY* discouraging that cacheflush() misbehaves so badly.
> *PLEASE* return an error status when you decide not to honor the API!

So what, you're arranging for your memory to exist as a set of
contiguous but separate mappings of one page each?  Surely not.

You should be able to cover a complete mapping in one go.  If the
function stops because a page is not present and _can_ be populated,
that is a bug.  If it stops because a page is not present and that
page can't be populated, then it's working as it should.



More information about the linux-arm-kernel mailing list