* [PATCH] powerpc/mm: bail out early when flushing TLB page @ 2015-01-30 12:08 Arseny Solokha 2015-01-30 21:53 ` Scott Wood ` (2 more replies) 0 siblings, 3 replies; 6+ messages in thread From: Arseny Solokha @ 2015-01-30 12:08 UTC (permalink / raw) To: Scott Wood; +Cc: linux-kernel, Arseny Solokha, Paul Mackerras, linuxppc-dev MMU_NO_CONTEXT is conditionally defined as 0 or (unsigned int)-1. However, in __flush_tlb_page() a corresponding variable is only tested for open coded 0, which can cause NULL pointer dereference if `mm' argument was legitimately passed as such. Bail out early in case the first argument is NULL, thus eliminate confusion between different values of MMU_NO_CONTEXT and avoid disabling and then re-enabling preemption unnecessarily. Signed-off-by: Arseny Solokha <asolokha@kb.kras.ru> --- arch/powerpc/mm/tlb_nohash.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/arch/powerpc/mm/tlb_nohash.c b/arch/powerpc/mm/tlb_nohash.c index f38ea4d..ab0616b 100644 --- a/arch/powerpc/mm/tlb_nohash.c +++ b/arch/powerpc/mm/tlb_nohash.c @@ -284,8 +284,11 @@ void __flush_tlb_page(struct mm_struct *mm, unsigned long vmaddr, struct cpumask *cpu_mask; unsigned int pid; + if (unlikely(!mm)) + return; + preempt_disable(); - pid = mm ? mm->context.id : 0; + pid = mm->context.id; if (unlikely(pid == MMU_NO_CONTEXT)) goto bail; cpu_mask = mm_cpumask(mm); -- 2.2.2 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH] powerpc/mm: bail out early when flushing TLB page 2015-01-30 12:08 [PATCH] powerpc/mm: bail out early when flushing TLB page Arseny Solokha @ 2015-01-30 21:53 ` Scott Wood 2015-01-31 4:18 ` Arseny Solokha 2015-01-31 20:27 ` Benjamin Herrenschmidt 2015-02-02 5:28 ` [PATCH] powerpc/mm: warn on flushing tlb page in kernel context Arseny Solokha 2 siblings, 1 reply; 6+ messages in thread From: Scott Wood @ 2015-01-30 21:53 UTC (permalink / raw) To: Arseny Solokha; +Cc: Paul Mackerras, linuxppc-dev, linux-kernel On Fri, 2015-01-30 at 19:08 +0700, Arseny Solokha wrote: > MMU_NO_CONTEXT is conditionally defined as 0 or (unsigned int)-1. For nohash it is specifically -1. > However, in __flush_tlb_page() a corresponding variable is only tested > for open coded 0, which can cause NULL pointer dereference if `mm' > argument was legitimately passed as such. > > Bail out early in case the first argument is NULL, thus eliminate confusion > between different values of MMU_NO_CONTEXT and avoid disabling and then > re-enabling preemption unnecessarily. How did you notice this? Did you see an oops, or was it code inspection? I'm wondering what codepath gets here with mm == NULL. -Scott ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] powerpc/mm: bail out early when flushing TLB page 2015-01-30 21:53 ` Scott Wood @ 2015-01-31 4:18 ` Arseny Solokha 0 siblings, 0 replies; 6+ messages in thread From: Arseny Solokha @ 2015-01-31 4:18 UTC (permalink / raw) To: Scott Wood; +Cc: Paul Mackerras, linuxppc-dev, linux-kernel > On Fri, 2015-01-30 at 19:08 +0700, Arseny Solokha wrote: >> MMU_NO_CONTEXT is conditionally defined as 0 or (unsigned int)-1. > > For nohash it is specifically -1. >> However, in __flush_tlb_page() a corresponding variable is only tested >> for open coded 0, which can cause NULL pointer dereference if `mm' >> argument was legitimately passed as such. >> >> Bail out early in case the first argument is NULL, thus eliminate confusion >> between different values of MMU_NO_CONTEXT and avoid disabling and then >> re-enabling preemption unnecessarily. > > How did you notice this? Did you see an oops, or was it code > inspection? I'm wondering what codepath gets here with mm == NULL. Just a code inspection. It didn't seemed right at the first glance. Arsény > > -Scott ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] powerpc/mm: bail out early when flushing TLB page 2015-01-30 12:08 [PATCH] powerpc/mm: bail out early when flushing TLB page Arseny Solokha 2015-01-30 21:53 ` Scott Wood @ 2015-01-31 20:27 ` Benjamin Herrenschmidt 2015-02-02 5:07 ` Arseny Solokha 2015-02-02 5:28 ` [PATCH] powerpc/mm: warn on flushing tlb page in kernel context Arseny Solokha 2 siblings, 1 reply; 6+ messages in thread From: Benjamin Herrenschmidt @ 2015-01-31 20:27 UTC (permalink / raw) To: Arseny Solokha; +Cc: Scott Wood, Paul Mackerras, linuxppc-dev, linux-kernel On Fri, 2015-01-30 at 19:08 +0700, Arseny Solokha wrote: > MMU_NO_CONTEXT is conditionally defined as 0 or (unsigned int)-1. However, > in __flush_tlb_page() a corresponding variable is only tested for open > coded 0, which can cause NULL pointer dereference if `mm' argument was > legitimately passed as such. > > Bail out early in case the first argument is NULL, thus eliminate confusion > between different values of MMU_NO_CONTEXT and avoid disabling and then > re-enabling preemption unnecessarily. So the comment above isn't quite right... we don't *test* it for open coded 0, we test it for MMU_NO_CONTEXT, however we *set* it to 0 for NULL mm. This is actually correct... on all except 8xx :-) 0 *is* the PID of the kernel context, and NULL mm usually means kernel context. However, it's correct that this function will not deal properly with a NULL mm for other reasons. It must only be called for user contexts. Instead of just returning, I would WARN_ON, because if it's ever called for a kernel page, then it will not do what's expected and that will need fixing. Just a silent return isn't right. This is different from returning on MMU_NO_CONTEXT, in this case, we know there's no active TLB entries for the process, and thus nothing to flush. Cheers, Ben. > Signed-off-by: Arseny Solokha <asolokha@kb.kras.ru> > --- > arch/powerpc/mm/tlb_nohash.c | 5 ++++- > 1 file changed, 4 insertions(+), 1 deletion(-) > > diff --git a/arch/powerpc/mm/tlb_nohash.c b/arch/powerpc/mm/tlb_nohash.c > index f38ea4d..ab0616b 100644 > --- a/arch/powerpc/mm/tlb_nohash.c > +++ b/arch/powerpc/mm/tlb_nohash.c > @@ -284,8 +284,11 @@ void __flush_tlb_page(struct mm_struct *mm, unsigned long vmaddr, > struct cpumask *cpu_mask; > unsigned int pid; > > + if (unlikely(!mm)) > + return; > + > preempt_disable(); > - pid = mm ? mm->context.id : 0 Here we test mm, if we pass NULL, that means the kernel mm which has PID 0, which is not MMU_NO_CONTEXT > ; > + pid = mm->context.id; > if (unlikely(pid == MMU_NO_CONTEXT)) > goto bail; > cpu_mask = mm_cpumask(mm); ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] powerpc/mm: bail out early when flushing TLB page 2015-01-31 20:27 ` Benjamin Herrenschmidt @ 2015-02-02 5:07 ` Arseny Solokha 0 siblings, 0 replies; 6+ messages in thread From: Arseny Solokha @ 2015-02-02 5:07 UTC (permalink / raw) To: Benjamin Herrenschmidt Cc: Scott Wood, Paul Mackerras, linuxppc-dev, linux-kernel > On Fri, 2015-01-30 at 19:08 +0700, Arseny Solokha wrote: >> MMU_NO_CONTEXT is conditionally defined as 0 or (unsigned int)-1. However, >> in __flush_tlb_page() a corresponding variable is only tested for open >> coded 0, which can cause NULL pointer dereference if `mm' argument was >> legitimately passed as such. >> >> Bail out early in case the first argument is NULL, thus eliminate confusion >> between different values of MMU_NO_CONTEXT and avoid disabling and then >> re-enabling preemption unnecessarily. > > So the comment above isn't quite right... we don't *test* it for open > coded 0, we test it for MMU_NO_CONTEXT, however we *set* it to 0 for > NULL mm. > > This is actually correct... on all except 8xx :-) 0 *is* the PID of the > kernel context, and NULL mm usually means kernel context. > However, it's correct that this function will not deal properly with a > NULL mm for other reasons. It must only be called for user contexts. > > Instead of just returning, I would WARN_ON, because if it's ever called > for a kernel page, then it will not do what's expected and that will > need fixing. Just a silent return isn't right. Does this also hold true for __local_flush_tlb_page()? It's called from local_flush_tlb_page() as follows: __local_flush_tlb_page(vma ? vma->vm_mm : NULL, vmaddr, mmu_get_tsize(mmu_virtual_psize), 0); However, if MMU_NO_CONTEXT is 0 and __local_flush_tlb_page() is called with mm set to NULL, it's effectively a no-op. What else am I missing? Thanks, Arsény > This is different from returning on MMU_NO_CONTEXT, in this case, we > know there's no active TLB entries for the process, and thus nothing to > flush. > > Cheers, > Ben. > >> Signed-off-by: Arseny Solokha <asolokha@kb.kras.ru> >> --- >> arch/powerpc/mm/tlb_nohash.c | 5 ++++- >> 1 file changed, 4 insertions(+), 1 deletion(-) >> >> diff --git a/arch/powerpc/mm/tlb_nohash.c b/arch/powerpc/mm/tlb_nohash.c >> index f38ea4d..ab0616b 100644 >> --- a/arch/powerpc/mm/tlb_nohash.c >> +++ b/arch/powerpc/mm/tlb_nohash.c >> @@ -284,8 +284,11 @@ void __flush_tlb_page(struct mm_struct *mm, unsigned long vmaddr, >> struct cpumask *cpu_mask; >> unsigned int pid; >> >> + if (unlikely(!mm)) >> + return; >> + >> preempt_disable(); >> - pid = mm ? mm->context.id : 0 > > Here we test mm, if we pass NULL, that means the kernel mm which has PID > 0, which is not MMU_NO_CONTEXT >> ; >> + pid = mm->context.id; >> if (unlikely(pid == MMU_NO_CONTEXT)) >> goto bail; >> cpu_mask = mm_cpumask(mm); ^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH] powerpc/mm: warn on flushing tlb page in kernel context 2015-01-30 12:08 [PATCH] powerpc/mm: bail out early when flushing TLB page Arseny Solokha 2015-01-30 21:53 ` Scott Wood 2015-01-31 20:27 ` Benjamin Herrenschmidt @ 2015-02-02 5:28 ` Arseny Solokha 2 siblings, 0 replies; 6+ messages in thread From: Arseny Solokha @ 2015-02-02 5:28 UTC (permalink / raw) To: Benjamin Herrenschmidt Cc: linux-kernel, Paul Mackerras, Scott Wood, Arseny Solokha, linuxppc-dev Function __flush_tlb_page() must only be called for user contexts, so put in extra hardening to warn on calling it for kernel context. Signed-off-by: Arseny Solokha <asolokha@kb.kras.ru> --- arch/powerpc/mm/tlb_nohash.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/arch/powerpc/mm/tlb_nohash.c b/arch/powerpc/mm/tlb_nohash.c index f38ea4d..cbd3d06 100644 --- a/arch/powerpc/mm/tlb_nohash.c +++ b/arch/powerpc/mm/tlb_nohash.c @@ -284,8 +284,15 @@ void __flush_tlb_page(struct mm_struct *mm, unsigned long vmaddr, struct cpumask *cpu_mask; unsigned int pid; + /* + * This function as well as __local_flush_tlb_page() must only be called + * for user contexts. + */ + if (unlikely(WARN_ON(!mm))) + return; + preempt_disable(); - pid = mm ? mm->context.id : 0; + pid = mm->context.id; if (unlikely(pid == MMU_NO_CONTEXT)) goto bail; cpu_mask = mm_cpumask(mm); -- 2.2.2 ^ permalink raw reply related [flat|nested] 6+ messages in thread
end of thread, other threads:[~2015-02-02 5:28 UTC | newest] Thread overview: 6+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2015-01-30 12:08 [PATCH] powerpc/mm: bail out early when flushing TLB page Arseny Solokha 2015-01-30 21:53 ` Scott Wood 2015-01-31 4:18 ` Arseny Solokha 2015-01-31 20:27 ` Benjamin Herrenschmidt 2015-02-02 5:07 ` Arseny Solokha 2015-02-02 5:28 ` [PATCH] powerpc/mm: warn on flushing tlb page in kernel context Arseny Solokha
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).