[Xenial] arm64: mm: avoid calling apply_to_page_range on empty range
diff mbox

Message ID 1456136413-18849-1-git-send-email-ming.lei@canonical.com
State New
Headers show

Commit Message

Ming Lei Feb. 22, 2016, 10:20 a.m. UTC
From: Mika Penttilä <mika.penttila@nextfour.com>

Calling apply_to_page_range with an empty range results in a BUG_ON
from the core code. This can be triggered by trying to load the st_drv
module with CONFIG_DEBUG_SET_MODULE_RONX enabled:

  kernel BUG at mm/memory.c:1874!
  Internal error: Oops - BUG: 0 [#1] PREEMPT SMP
  Modules linked in:
  CPU: 3 PID: 1764 Comm: insmod Not tainted 4.5.0-rc1+ #2
  Hardware name: ARM Juno development board (r0) (DT)
  task: ffffffc9763b8000 ti: ffffffc975af8000 task.ti: ffffffc975af8000
  PC is at apply_to_page_range+0x2cc/0x2d0
  LR is at change_memory_common+0x80/0x108

This patch fixes the issue by making change_memory_common (called by the
set_memory_* functions) a NOP when numpages == 0, therefore avoiding the
erroneous call to apply_to_page_range and bringing us into line with x86
and s390.

BugLink: http://bugs.launchpad.net/bugs/1547718
Cc: <stable@vger.kernel.org>
Reviewed-by: Laura Abbott <labbott@redhat.com>
Acked-by: David Rientjes <rientjes@google.com>
Signed-off-by: Mika Penttilä <mika.penttila@nextfour.com>
Signed-off-by: Will Deacon <will.deacon@arm.com>
(cherry picked from commit 57adec866c0440976c96a4b8f5b59fb411b1cacb)
Signed-off-by: Ming Lei <ming.lei@canonical.com>
---
 arch/arm64/mm/pageattr.c | 3 +++
 1 file changed, 3 insertions(+)

Comments

Chris J Arges Feb. 22, 2016, 1:14 p.m. UTC | #1
Acked-by: Chris J Arges <chris.j.arges@canonical.com>

On Mon, Feb 22, 2016 at 06:20:13PM +0800, Ming Lei wrote:
> From: Mika Penttilä <mika.penttila@nextfour.com>
> 
> Calling apply_to_page_range with an empty range results in a BUG_ON
> from the core code. This can be triggered by trying to load the st_drv
> module with CONFIG_DEBUG_SET_MODULE_RONX enabled:
> 
>   kernel BUG at mm/memory.c:1874!
>   Internal error: Oops - BUG: 0 [#1] PREEMPT SMP
>   Modules linked in:
>   CPU: 3 PID: 1764 Comm: insmod Not tainted 4.5.0-rc1+ #2
>   Hardware name: ARM Juno development board (r0) (DT)
>   task: ffffffc9763b8000 ti: ffffffc975af8000 task.ti: ffffffc975af8000
>   PC is at apply_to_page_range+0x2cc/0x2d0
>   LR is at change_memory_common+0x80/0x108
> 
> This patch fixes the issue by making change_memory_common (called by the
> set_memory_* functions) a NOP when numpages == 0, therefore avoiding the
> erroneous call to apply_to_page_range and bringing us into line with x86
> and s390.
> 
> BugLink: http://bugs.launchpad.net/bugs/1547718
> Cc: <stable@vger.kernel.org>
> Reviewed-by: Laura Abbott <labbott@redhat.com>
> Acked-by: David Rientjes <rientjes@google.com>
> Signed-off-by: Mika Penttilä <mika.penttila@nextfour.com>
> Signed-off-by: Will Deacon <will.deacon@arm.com>
> (cherry picked from commit 57adec866c0440976c96a4b8f5b59fb411b1cacb)
> Signed-off-by: Ming Lei <ming.lei@canonical.com>
> ---
>  arch/arm64/mm/pageattr.c | 3 +++
>  1 file changed, 3 insertions(+)
> 
> diff --git a/arch/arm64/mm/pageattr.c b/arch/arm64/mm/pageattr.c
> index 3571c73..cf62407 100644
> --- a/arch/arm64/mm/pageattr.c
> +++ b/arch/arm64/mm/pageattr.c
> @@ -57,6 +57,9 @@ static int change_memory_common(unsigned long addr, int numpages,
>  	if (end < MODULES_VADDR || end >= MODULES_END)
>  		return -EINVAL;
>  
> +	if (!numpages)
> +		return 0;
> +
>  	data.set_mask = set_mask;
>  	data.clear_mask = clear_mask;
>  
> -- 
> 1.9.1
> 
> 
> -- 
> kernel-team mailing list
> kernel-team@lists.ubuntu.com
> https://lists.ubuntu.com/mailman/listinfo/kernel-team
Paolo Pisati Feb. 22, 2016, 2:56 p.m. UTC | #2
On Mon, Feb 22, 2016 at 06:20:13PM +0800, Ming Lei wrote:
> From: Mika Penttilä <mika.penttila@nextfour.com>
> 
> Calling apply_to_page_range with an empty range results in a BUG_ON
> from the core code. This can be triggered by trying to load the st_drv
> module with CONFIG_DEBUG_SET_MODULE_RONX enabled:
> 
>   kernel BUG at mm/memory.c:1874!
>   Internal error: Oops - BUG: 0 [#1] PREEMPT SMP
>   Modules linked in:
>   CPU: 3 PID: 1764 Comm: insmod Not tainted 4.5.0-rc1+ #2
>   Hardware name: ARM Juno development board (r0) (DT)
>   task: ffffffc9763b8000 ti: ffffffc975af8000 task.ti: ffffffc975af8000
>   PC is at apply_to_page_range+0x2cc/0x2d0
>   LR is at change_memory_common+0x80/0x108
> 
> This patch fixes the issue by making change_memory_common (called by the
> set_memory_* functions) a NOP when numpages == 0, therefore avoiding the
> erroneous call to apply_to_page_range and bringing us into line with x86
> and s390.
> 
> BugLink: http://bugs.launchpad.net/bugs/1547718
> Cc: <stable@vger.kernel.org>
> Reviewed-by: Laura Abbott <labbott@redhat.com>
> Acked-by: David Rientjes <rientjes@google.com>
> Signed-off-by: Mika Penttilä <mika.penttila@nextfour.com>
> Signed-off-by: Will Deacon <will.deacon@arm.com>
> (cherry picked from commit 57adec866c0440976c96a4b8f5b59fb411b1cacb)
> Signed-off-by: Ming Lei <ming.lei@canonical.com>

The original patch was covering both arm and arm64 (and it contained another small fix):

http://lkml.iu.edu/hypermail/linux/kernel/1601.2/04934.html
http://lkml.iu.edu/hypermail/linux/kernel/1601.2/04935.html
http://lkml.iu.edu/hypermail/linux/kernel/1601.2/04936.html
http://lkml.iu.edu/hypermail/linux/kernel/1601.2/04937.html

And while the arm64 part was taken care and imported upstream, the arm part was
left behind and forgotten[1].
The arm and arm64 code is identical, and it fixes the BUG_ON() we were
experiencing with the raspi2 kernel in -proposed.

I'll prod upstream to import the arm side of the patch, and in the mean time i'll
send a SAUCE patch for the arm-only case.

1: http://www.gossamer-threads.com/lists/linux/kernel/2353646#2353646
Brad Figg Feb. 22, 2016, 3:26 p.m. UTC | #3
On Mon, Feb 22, 2016 at 06:20:13PM +0800, Ming Lei wrote:
> From: Mika Penttilä <mika.penttila@nextfour.com>
> 
> Calling apply_to_page_range with an empty range results in a BUG_ON
> from the core code. This can be triggered by trying to load the st_drv
> module with CONFIG_DEBUG_SET_MODULE_RONX enabled:
> 
>   kernel BUG at mm/memory.c:1874!
>   Internal error: Oops - BUG: 0 [#1] PREEMPT SMP
>   Modules linked in:
>   CPU: 3 PID: 1764 Comm: insmod Not tainted 4.5.0-rc1+ #2
>   Hardware name: ARM Juno development board (r0) (DT)
>   task: ffffffc9763b8000 ti: ffffffc975af8000 task.ti: ffffffc975af8000
>   PC is at apply_to_page_range+0x2cc/0x2d0
>   LR is at change_memory_common+0x80/0x108
> 
> This patch fixes the issue by making change_memory_common (called by the
> set_memory_* functions) a NOP when numpages == 0, therefore avoiding the
> erroneous call to apply_to_page_range and bringing us into line with x86
> and s390.
> 
> BugLink: http://bugs.launchpad.net/bugs/1547718
> Cc: <stable@vger.kernel.org>
> Reviewed-by: Laura Abbott <labbott@redhat.com>
> Acked-by: David Rientjes <rientjes@google.com>
> Signed-off-by: Mika Penttilä <mika.penttila@nextfour.com>
> Signed-off-by: Will Deacon <will.deacon@arm.com>
> (cherry picked from commit 57adec866c0440976c96a4b8f5b59fb411b1cacb)
> Signed-off-by: Ming Lei <ming.lei@canonical.com>
> ---
>  arch/arm64/mm/pageattr.c | 3 +++
>  1 file changed, 3 insertions(+)
> 
> diff --git a/arch/arm64/mm/pageattr.c b/arch/arm64/mm/pageattr.c
> index 3571c73..cf62407 100644
> --- a/arch/arm64/mm/pageattr.c
> +++ b/arch/arm64/mm/pageattr.c
> @@ -57,6 +57,9 @@ static int change_memory_common(unsigned long addr, int numpages,
>  	if (end < MODULES_VADDR || end >= MODULES_END)
>  		return -EINVAL;
>  
> +	if (!numpages)
> +		return 0;
> +
>  	data.set_mask = set_mask;
>  	data.clear_mask = clear_mask;
>  
> -- 
> 1.9.1
> 
> 
> -- 
> kernel-team mailing list
> kernel-team@lists.ubuntu.com
> https://lists.ubuntu.com/mailman/listinfo/kernel-team

Looks ok
Kamal Mostafa Feb. 22, 2016, 6:38 p.m. UTC | #4
Note that this stable commit has already landed in Vivid and Wily (via
their stable kernels).

It does need to be SRU'd for Xenial as it has not yet landed in 4.4-
stable.

57adec8 arm64: mm: avoid calling apply_to_page_range on empty range
Kamal Mostafa Feb. 22, 2016, 6:50 p.m. UTC | #5
On Mon, 2016-02-22 at 15:56 +0100, Paolo Pisati wrote:
> On Mon, Feb 22, 2016 at 06:20:13PM +0800, Ming Lei wrote:
> > From: Mika Penttilä <mika.penttila@nextfour.com>
> > 
> > Calling apply_to_page_range with an empty range results in a BUG_ON
> > from the core code. This can be triggered by trying to load the
> > st_drv
> > module with CONFIG_DEBUG_SET_MODULE_RONX enabled:
> > 
> >   kernel BUG at mm/memory.c:1874!
> >   Internal error: Oops - BUG: 0 [#1] PREEMPT SMP
> >   Modules linked in:
> >   CPU: 3 PID: 1764 Comm: insmod Not tainted 4.5.0-rc1+ #2
> >   Hardware name: ARM Juno development board (r0) (DT)
> >   task: ffffffc9763b8000 ti: ffffffc975af8000 task.ti:
> > ffffffc975af8000
> >   PC is at apply_to_page_range+0x2cc/0x2d0
> >   LR is at change_memory_common+0x80/0x108
> > 
> > This patch fixes the issue by making change_memory_common (called
> > by the
> > set_memory_* functions) a NOP when numpages == 0, therefore
> > avoiding the
> > erroneous call to apply_to_page_range and bringing us into line
> > with x86
> > and s390.
> > 
> > BugLink: http://bugs.launchpad.net/bugs/1547718
> > Cc: <stable@vger.kernel.org>
> > Reviewed-by: Laura Abbott <labbott@redhat.com>
> > Acked-by: David Rientjes <rientjes@google.com>
> > Signed-off-by: Mika Penttilä <mika.penttila@nextfour.com>
> > Signed-off-by: Will Deacon <will.deacon@arm.com>
> > (cherry picked from commit
> > 57adec866c0440976c96a4b8f5b59fb411b1cacb)
> > Signed-off-by: Ming Lei <ming.lei@canonical.com>
> 
> The original patch was covering both arm and arm64 (and it contained
> another small fix):
> 
> http://lkml.iu.edu/hypermail/linux/kernel/1601.2/04934.html
> http://lkml.iu.edu/hypermail/linux/kernel/1601.2/04935.html
> http://lkml.iu.edu/hypermail/linux/kernel/1601.2/04936.html
> http://lkml.iu.edu/hypermail/linux/kernel/1601.2/04937.html
> 
> And while the arm64 part was taken care and imported upstream, the
> arm part was
> left behind and forgotten[1].
> The arm and arm64 code is identical, and it fixes the BUG_ON() we
> were
> experiencing with the raspi2 kernel in -proposed.
> 
> I'll prod upstream to import the arm side of the patch, and in the
> mean time i'll
> send a SAUCE patch for the arm-only case.
> 
> 1: http://www.gossamer-threads.com/lists/linux/kernel/2353646#2353646
> -- 
> bye,
> p.


In addition to Xenial, the [V and W] kernels will need the arm part
too.

Paolo's SAUCE patch "arm: mm: avoid ..." looks like it'll be tagged cc:
stable, but it has not landed in mainline yet.  So I think we should
apply it (the SAUCE) to [V and W] now along with Xenial.

(Upshot: [V, W, and X] should end up with both the arm64 and arm
versions of this patch).

 -Kamal
Andy Whitcroft Feb. 22, 2016, 11 p.m. UTC | #6
Applied to xenial.

-apw

Patch
diff mbox

diff --git a/arch/arm64/mm/pageattr.c b/arch/arm64/mm/pageattr.c
index 3571c73..cf62407 100644
--- a/arch/arm64/mm/pageattr.c
+++ b/arch/arm64/mm/pageattr.c
@@ -57,6 +57,9 @@  static int change_memory_common(unsigned long addr, int numpages,
 	if (end < MODULES_VADDR || end >= MODULES_END)
 		return -EINVAL;
 
+	if (!numpages)
+		return 0;
+
 	data.set_mask = set_mask;
 	data.clear_mask = clear_mask;