* [PATCH 3/6] mips: call find_vma with the mmap_sem held
[not found] <1397960791-16320-1-git-send-email-davidlohr@hp.com>
@ 2014-04-20 2:26 ` Davidlohr Bueso
2014-04-22 13:25 ` Andreas Herrmann
0 siblings, 1 reply; 2+ messages in thread
From: Davidlohr Bueso @ 2014-04-20 2:26 UTC (permalink / raw)
To: akpm
Cc: zeus, aswin, davidlohr, linux-mm, linux-kernel, Ralf Baechle,
linux-mips
Performing vma lookups without taking the mm->mmap_sem is asking
for trouble. While doing the search, the vma in question can be
modified or even removed before returning to the caller. Take the
lock (exclusively) in order to avoid races while iterating through
the vmacache and/or rbtree.
Updates two functions:
- process_fpemu_return()
- cteon_flush_cache_sigtramp()
This patch is completely *untested*.
Signed-off-by: Davidlohr Bueso <davidlohr@hp.com>
Cc: Ralf Baechle <ralf@linux-mips.org>
Cc: linux-mips@linux-mips.org
---
arch/mips/kernel/traps.c | 2 ++
arch/mips/mm/c-octeon.c | 2 ++
2 files changed, 4 insertions(+)
diff --git a/arch/mips/kernel/traps.c b/arch/mips/kernel/traps.c
index 074e857..c51bd20 100644
--- a/arch/mips/kernel/traps.c
+++ b/arch/mips/kernel/traps.c
@@ -712,10 +712,12 @@ int process_fpemu_return(int sig, void __user *fault_addr)
si.si_addr = fault_addr;
si.si_signo = sig;
if (sig == SIGSEGV) {
+ down_read(¤t->mm->mmap_sem);
if (find_vma(current->mm, (unsigned long)fault_addr))
si.si_code = SEGV_ACCERR;
else
si.si_code = SEGV_MAPERR;
+ up_read(¤t->mm->mmap_sem);
} else {
si.si_code = BUS_ADRERR;
}
diff --git a/arch/mips/mm/c-octeon.c b/arch/mips/mm/c-octeon.c
index f41a5c5..05b1d7c 100644
--- a/arch/mips/mm/c-octeon.c
+++ b/arch/mips/mm/c-octeon.c
@@ -137,8 +137,10 @@ static void octeon_flush_cache_sigtramp(unsigned long addr)
{
struct vm_area_struct *vma;
+ down_read(¤t->mm->mmap_sem);
vma = find_vma(current->mm, addr);
octeon_flush_icache_all_cores(vma);
+ up_read(¤t->mm->mmap_sem);
}
--
1.8.1.4
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [PATCH 3/6] mips: call find_vma with the mmap_sem held
2014-04-20 2:26 ` [PATCH 3/6] mips: call find_vma with the mmap_sem held Davidlohr Bueso
@ 2014-04-22 13:25 ` Andreas Herrmann
0 siblings, 0 replies; 2+ messages in thread
From: Andreas Herrmann @ 2014-04-22 13:25 UTC (permalink / raw)
To: Davidlohr Bueso
Cc: akpm, zeus, aswin, linux-mm, linux-kernel, Ralf Baechle,
linux-mips
On Sat, Apr 19, 2014 at 07:26:28PM -0700, Davidlohr Bueso wrote:
> Performing vma lookups without taking the mm->mmap_sem is asking
> for trouble. While doing the search, the vma in question can be
> modified or even removed before returning to the caller. Take the
> lock (exclusively) in order to avoid races while iterating through
> the vmacache and/or rbtree.
>
> Updates two functions:
> - process_fpemu_return()
> - cteon_flush_cache_sigtramp()
>
> This patch is completely *untested*.
>
> Signed-off-by: Davidlohr Bueso <davidlohr@hp.com>
> Cc: Ralf Baechle <ralf@linux-mips.org>
> Cc: linux-mips@linux-mips.org
Tested-by: Andreas Herrmann <andreas.herrmann@caviumnetworks.com>
Thanks,
Andreas
> ---
> arch/mips/kernel/traps.c | 2 ++
> arch/mips/mm/c-octeon.c | 2 ++
> 2 files changed, 4 insertions(+)
>
> diff --git a/arch/mips/kernel/traps.c b/arch/mips/kernel/traps.c
> index 074e857..c51bd20 100644
> --- a/arch/mips/kernel/traps.c
> +++ b/arch/mips/kernel/traps.c
> @@ -712,10 +712,12 @@ int process_fpemu_return(int sig, void __user *fault_addr)
> si.si_addr = fault_addr;
> si.si_signo = sig;
> if (sig == SIGSEGV) {
> + down_read(¤t->mm->mmap_sem);
> if (find_vma(current->mm, (unsigned long)fault_addr))
> si.si_code = SEGV_ACCERR;
> else
> si.si_code = SEGV_MAPERR;
> + up_read(¤t->mm->mmap_sem);
> } else {
> si.si_code = BUS_ADRERR;
> }
> diff --git a/arch/mips/mm/c-octeon.c b/arch/mips/mm/c-octeon.c
> index f41a5c5..05b1d7c 100644
> --- a/arch/mips/mm/c-octeon.c
> +++ b/arch/mips/mm/c-octeon.c
> @@ -137,8 +137,10 @@ static void octeon_flush_cache_sigtramp(unsigned long addr)
> {
> struct vm_area_struct *vma;
>
> + down_read(¤t->mm->mmap_sem);
> vma = find_vma(current->mm, addr);
> octeon_flush_icache_all_cores(vma);
> + up_read(¤t->mm->mmap_sem);
> }
>
>
> --
> 1.8.1.4
>
>
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2014-04-22 13:26 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <1397960791-16320-1-git-send-email-davidlohr@hp.com>
2014-04-20 2:26 ` [PATCH 3/6] mips: call find_vma with the mmap_sem held Davidlohr Bueso
2014-04-22 13:25 ` Andreas Herrmann
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox