* [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