From: dima@android.com (Dima Zavin)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH] [ARM] Do not call flush_cache_user_range with mmap_sem held
Date: Wed, 28 Apr 2010 00:35:41 -0700 [thread overview]
Message-ID: <z2j404ea8001004280035o806a0903zb6628d70887bcff2@mail.gmail.com> (raw)
In-Reply-To: <1272439931-12795-1-git-send-email-dima@android.com>
This patch is probably not as efficient as it could be since the flush
will end up faulting in pages the user never touched. I think we
should print a warning regarding that and skip over the unmapped
pages, I just wasn't sure how to do that correctly.
--Dima
2010/4/28 Dima Zavin <dima@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.
>
> Signed-off-by: Dima Zavin <dima@android.com>
> Cc: Russell King <rmk+kernel@arm.linux.org.uk>
> Cc: Arve Hj?nnev?g <arve@android.com>
> ---
> ?arch/arm/include/asm/cacheflush.h | ? ?2 +-
> ?arch/arm/kernel/traps.c ? ? ? ? ? | ? ?4 +++-
> ?2 files changed, 4 insertions(+), 2 deletions(-)
>
> diff --git a/arch/arm/include/asm/cacheflush.h b/arch/arm/include/asm/cacheflush.h
> index 0d08d41..b68a2b4 100644
> --- a/arch/arm/include/asm/cacheflush.h
> +++ b/arch/arm/include/asm/cacheflush.h
> @@ -336,7 +336,7 @@ extern void flush_cache_page(struct vm_area_struct *vma, unsigned long user_addr
> ?* Harvard caches are synchronised for the user space address range.
> ?* This is used for the ARM private sys_cacheflush system call.
> ?*/
> -#define flush_cache_user_range(vma,start,end) \
> +#define flush_cache_user_range(start,end) \
> ? ? ? ?__cpuc_coherent_user_range((start) & PAGE_MASK, PAGE_ALIGN(end))
>
> ?/*
> diff --git a/arch/arm/kernel/traps.c b/arch/arm/kernel/traps.c
> index 1621e53..2455fd3 100644
> --- a/arch/arm/kernel/traps.c
> +++ b/arch/arm/kernel/traps.c
> @@ -453,7 +453,9 @@ do_cache_op(unsigned long start, unsigned long end, int flags)
> ? ? ? ? ? ? ? ?if (end > vma->vm_end)
> ? ? ? ? ? ? ? ? ? ? ? ?end = vma->vm_end;
>
> - ? ? ? ? ? ? ? flush_cache_user_range(vma, start, end);
> + ? ? ? ? ? ? ? up_read(&mm->mmap_sem);
> + ? ? ? ? ? ? ? flush_cache_user_range(start, end);
> + ? ? ? ? ? ? ? return;
> ? ? ? ?}
> ? ? ? ?up_read(&mm->mmap_sem);
> ?}
> --
> 1.6.6
>
>
next prev parent reply other threads:[~2010-04-28 7:35 UTC|newest]
Thread overview: 36+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-04-28 7:32 [PATCH] [ARM] Do not call flush_cache_user_range with mmap_sem held Dima Zavin
2010-04-28 7:35 ` Dima Zavin [this message]
2010-04-29 13:00 ` Russell King - ARM Linux
2010-04-29 18:16 ` Jamie Lokier
2010-04-29 18:24 ` Russell King - ARM Linux
2010-04-29 19:23 ` Dima Zavin
2010-05-04 4:07 ` Dima Zavin
2010-05-04 7:40 ` Russell King - ARM Linux
2010-05-06 15:00 ` [PATCH] [ARM] Do not call flush_cache_user_range with mmap_semheld Catalin Marinas
2010-05-06 16:01 ` Jamie Lokier
2010-05-06 16:07 ` Jamie Lokier
2010-05-06 16:24 ` Catalin Marinas
2010-05-06 16:21 ` Catalin Marinas
2010-05-06 15:08 ` [PATCH] [ARM] Do not call flush_cache_user_range with mmap_sem held Catalin Marinas
-- strict thread matches above, loose matches on Subject: below --
2011-11-07 17:33 [PATCH] ARM: " Catalin Marinas
2011-11-16 21:23 ` Olof Johansson
2011-11-16 23:50 ` Russell King - ARM Linux
2011-11-17 0:16 ` Olof Johansson
2011-11-17 0:20 ` Olof Johansson
2011-11-17 10:26 ` Catalin Marinas
2011-11-17 10:49 ` Russell King - ARM Linux
2011-11-17 10:45 ` Russell King - ARM Linux
2011-11-20 17:54 ` Olof Johansson
2011-11-17 10:22 ` Catalin Marinas
2011-11-17 10:42 ` Russell King - ARM Linux
2011-11-17 10:59 ` Catalin Marinas
2011-11-17 11:03 ` Russell King - ARM Linux
2011-11-17 11:25 ` Catalin Marinas
2012-04-09 5:58 ` Dirk Behme
2012-04-09 14:24 ` Olof Johansson
2012-04-10 17:17 ` Will Deacon
2012-04-18 15:05 ` Will Deacon
2012-04-18 15:27 ` Russell King - ARM Linux
2012-04-18 16:27 ` Will Deacon
2012-04-18 17:15 ` Catalin Marinas
2012-04-18 8:40 ` Catalin Marinas
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=z2j404ea8001004280035o806a0903zb6628d70887bcff2@mail.gmail.com \
--to=dima@android.com \
--cc=linux-arm-kernel@lists.infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).