[PATCH 4/4] Do not call flush_cache_user_range with mmap_sem held

Catalin Marinas catalin.marinas at arm.com
Tue Dec 14 12:51:36 EST 2010


On 14 December 2010 09:30, Russell King - ARM Linux
<linux at arm.linux.org.uk> wrote:
> On Mon, Dec 13, 2010 at 08:57:39PM -0800, John Stultz wrote:
>> From: Dima Zavin <dima at android.com>
>>
>> We can't be holding the mmap_sem while calling flush_cache_user_range
>> because the flush can fault. If we fault on a user address, the
>> page fault handler will try to take mmap_sem again. Since both places
>> acquire the read lock, most of the time it succeeds. However, if another
>> thread tries to acquire the write lock on the mmap_sem (e.g. mmap) in
>> between the call to flush_cache_user_range and the fault, the down_read
>> in do_page_fault will deadlock.
>>
>> Also, since we really can't be holding the mmap_sem while calling
>> flush_cache_user_range AND vma is actually unused by the flush itself,
>> get rid of vma as an argument.
>
> Holding the mmap sem prevents a concurrent munmap, mremap or other change
> to the VMA while the flush operation is in progress.  There is no other
> lock which will do this for us.

But what's the problem if such mapping disappears? The
flush_cache_user_range code should just skip such pages.

-- 
Catalin



More information about the linux-arm-kernel mailing list