All of lore.kernel.org
 help / color / mirror / Atom feed
From: Josh Poimboeuf <jpoimboe@kernel.org>
To: linux-kernel@vger.kernel.org
Cc: jgross@suse.com, richard.henderson@linaro.org,
	ink@jurassic.park.msu.ru, mattst88@gmail.com,
	linux-alpha@vger.kernel.org, linux@armlinux.org.uk,
	linux-arm-kernel@lists.infradead.org, catalin.marinas@arm.com,
	will@kernel.org, guoren@kernel.org, linux-csky@vger.kernel.org,
	linux-ia64@vger.kernel.org, chenhuacai@kernel.org,
	kernel@xen0n.name, loongarch@lists.linux.dev,
	f.fainelli@gmail.com, bcm-kernel-feedback-list@broadcom.com,
	tsbogend@alpha.franken.de, linux-mips@vger.kernel.org,
	jiaxun.yang@flygoat.com, mpe@ellerman.id.au, npiggin@gmail.com,
	christophe.leroy@csgroup.eu, linuxppc-dev@lists.ozlabs.org,
	ysato@users.sourceforge.jp, dalias@libc.org,
	linux-sh@vger.kernel.org, davem@davemloft.net,
	sparclinux@vger.kernel.org, tglx@linutronix.de, mingo@redhat.com,
	bp@alien8.de, dave.hansen@linux.intel.com, x86@kernel.org,
	hpa@zytor.com, chris@zankel.net, jcmvbkbc@gmail.com,
	linux-xtensa@linux-xtensa.org, peterz@infradead.org,
	juri.lelli@redhat.com, vincent.guittot@linaro.org,
	dietmar.eggemann@arm.com, rostedt@goodmis.org,
	bsegall@google.com, mgorman@suse.de, bristot@redhat.com,
	vschneid@redhat.com, paulmck@kernel.org
Subject: [PATCH 00/22] cpu,sched: Mark arch_cpu_idle_dead() __noreturn
Date: Fri,  3 Feb 2023 14:05:09 -0800	[thread overview]
Message-ID: <cover.1675461757.git.jpoimboe@kernel.org> (raw)

These are some minor changes to enable the __noreturn attribute for
arch_cpu_idle_dead().  (If there are no objections, I can merge the
entire set through the tip tree.)

Until recently [1], in Xen, when a previously offlined CPU was brought
back online, it unexpectedly resumed execution where it left off in the
middle of the idle loop by returning from play_dead() and its caller
arch_cpu_idle_dead().

There were some clever hacks to make that work, but the behavior was
surprising as do_idle() doesn't expect an offlined CPU to return from
the dead in the middle of the function.

Now that Xen has been fixed, make sure arch_cpu_idle_dead() never
returns by marking it __noreturn.  This causes the compiler to complain
if an arch-specific implementation might return.  It also improves code
generation for both caller and callee.

Patches 1-20 update the arch-specific implementations of the function so
they don't actually return (even in error cases), and make that visible
to the compiler.  That's typically done by ending the function with a
call to another noreturn function, or with a BUG().

Patch 21 fixes the weak implementation.

Patch 22 actually adds the __noreturn attribute.

[1] 076cbf5d2163 ("x86/xen: don't let xen_pv_play_dead() return")

Josh Poimboeuf (22):
  alpha/cpu: Expose arch_cpu_idle_dead()'s prototype declaration
  alpha/cpu: Make sure arch_cpu_idle_dead() doesn't return
  arm/cpu: Make sure arch_cpu_idle_dead() doesn't return
  arm64/cpu: Mark cpu_die() __noreturn
  csky/cpu: Make sure arch_cpu_idle_dead() doesn't return
  ia64/cpu: Mark play_dead() __noreturn
  loongarch/cpu: Make sure play_dead() doesn't return
  loongarch/cpu: Mark play_dead() __noreturn
  mips/cpu: Expose play_dead()'s prototype definition
  mips/cpu: Make sure play_dead() doesn't return
  mips/cpu: Mark play_dead() __noreturn
  powerpc/cpu: Mark start_secondary_resume() __noreturn
  sh/cpu: Make sure play_dead() doesn't return
  sh/cpu: Mark play_dead() __noreturn
  sh/cpu: Expose arch_cpu_idle_dead()'s prototype definition
  sparc/cpu: Mark cpu_play_dead() __noreturn
  x86/cpu: Make sure play_dead() doesn't return
  x86/cpu: Mark play_dead() __noreturn
  xtensa/cpu: Make sure cpu_die() doesn't return
  xtensa/cpu: Mark cpu_die() __noreturn
  sched/idle: Make sure weak version of arch_cpu_idle_dead() doesn't
    return
  sched/idle: Mark arch_cpu_idle_dead() __noreturn

 arch/alpha/kernel/process.c      | 2 ++
 arch/arm/kernel/smp.c            | 2 ++
 arch/arm64/include/asm/smp.h     | 2 +-
 arch/csky/kernel/smp.c           | 2 ++
 arch/ia64/kernel/process.c       | 4 ++--
 arch/loongarch/include/asm/smp.h | 2 +-
 arch/loongarch/kernel/smp.c      | 2 +-
 arch/mips/include/asm/smp.h      | 2 +-
 arch/mips/kernel/smp-bmips.c     | 3 +++
 arch/mips/loongson64/smp.c       | 1 +
 arch/powerpc/include/asm/smp.h   | 2 +-
 arch/sh/include/asm/smp-ops.h    | 5 +++--
 arch/sh/kernel/idle.c            | 1 +
 arch/sparc/include/asm/smp_64.h  | 2 +-
 arch/x86/include/asm/smp.h       | 3 ++-
 arch/x86/kernel/process.c        | 2 +-
 arch/xtensa/include/asm/smp.h    | 2 +-
 arch/xtensa/kernel/smp.c         | 2 ++
 include/linux/cpu.h              | 2 +-
 kernel/sched/idle.c              | 2 +-
 tools/objtool/check.c            | 1 +
 21 files changed, 31 insertions(+), 15 deletions(-)

-- 
2.39.0


WARNING: multiple messages have this Message-ID (diff)
From: Josh Poimboeuf <jpoimboe@kernel.org>
To: linux-kernel@vger.kernel.org
Cc: jgross@suse.com, richard.henderson@linaro.org,
	ink@jurassic.park.msu.ru, mattst88@gmail.com,
	linux-alpha@vger.kernel.org, linux@armlinux.org.uk,
	linux-arm-kernel@lists.infradead.org, catalin.marinas@arm.com,
	will@kernel.org, guoren@kernel.org, linux-csky@vger.kernel.org,
	linux-ia64@vger.kernel.org, chenhuacai@kernel.org,
	kernel@xen0n.name, loongarch@lists.linux.dev,
	f.fainelli@gmail.com, bcm-kernel-feedback-list@broadcom.com,
	tsbogend@alpha.franken.de, linux-mips@vger.kernel.org,
	jiaxun.yang@flygoat.com, mpe@ellerman.id.au, npiggin@gmail.com,
	christophe.leroy@csgroup.eu, linuxppc-dev@lists.ozlabs.org,
	ysato@users.sourceforge.jp, dalias@libc.org,
	linux-sh@vger.kernel.org, davem@davemloft.net,
	sparclinux@vger.kernel.org, tglx@linutronix.de, mingo@redhat.com,
	bp@alien8.de, dave.hansen@linux.intel.com, x86@kernel.org,
	hpa@zytor.com, chris@zankel.net, jcmvbkbc@gmail.com,
	linux-xtensa@linux-xtensa.org, peterz@infradead.org,
	juri.lelli@redhat.com, vincent.guittot@linaro.org,
	dietmar.eggemann@arm.com, rostedt@goodmis.org,
	bsegall@google.com, mgorman@suse.de, bristot@redhat.com,
	vschneid@redhat.com, paulmck@kernel.org
Subject: [PATCH 00/22] cpu,sched: Mark arch_cpu_idle_dead() __noreturn
Date: Fri,  3 Feb 2023 14:05:09 -0800	[thread overview]
Message-ID: <cover.1675461757.git.jpoimboe@kernel.org> (raw)

These are some minor changes to enable the __noreturn attribute for
arch_cpu_idle_dead().  (If there are no objections, I can merge the
entire set through the tip tree.)

Until recently [1], in Xen, when a previously offlined CPU was brought
back online, it unexpectedly resumed execution where it left off in the
middle of the idle loop by returning from play_dead() and its caller
arch_cpu_idle_dead().

There were some clever hacks to make that work, but the behavior was
surprising as do_idle() doesn't expect an offlined CPU to return from
the dead in the middle of the function.

Now that Xen has been fixed, make sure arch_cpu_idle_dead() never
returns by marking it __noreturn.  This causes the compiler to complain
if an arch-specific implementation might return.  It also improves code
generation for both caller and callee.

Patches 1-20 update the arch-specific implementations of the function so
they don't actually return (even in error cases), and make that visible
to the compiler.  That's typically done by ending the function with a
call to another noreturn function, or with a BUG().

Patch 21 fixes the weak implementation.

Patch 22 actually adds the __noreturn attribute.

[1] 076cbf5d2163 ("x86/xen: don't let xen_pv_play_dead() return")

Josh Poimboeuf (22):
  alpha/cpu: Expose arch_cpu_idle_dead()'s prototype declaration
  alpha/cpu: Make sure arch_cpu_idle_dead() doesn't return
  arm/cpu: Make sure arch_cpu_idle_dead() doesn't return
  arm64/cpu: Mark cpu_die() __noreturn
  csky/cpu: Make sure arch_cpu_idle_dead() doesn't return
  ia64/cpu: Mark play_dead() __noreturn
  loongarch/cpu: Make sure play_dead() doesn't return
  loongarch/cpu: Mark play_dead() __noreturn
  mips/cpu: Expose play_dead()'s prototype definition
  mips/cpu: Make sure play_dead() doesn't return
  mips/cpu: Mark play_dead() __noreturn
  powerpc/cpu: Mark start_secondary_resume() __noreturn
  sh/cpu: Make sure play_dead() doesn't return
  sh/cpu: Mark play_dead() __noreturn
  sh/cpu: Expose arch_cpu_idle_dead()'s prototype definition
  sparc/cpu: Mark cpu_play_dead() __noreturn
  x86/cpu: Make sure play_dead() doesn't return
  x86/cpu: Mark play_dead() __noreturn
  xtensa/cpu: Make sure cpu_die() doesn't return
  xtensa/cpu: Mark cpu_die() __noreturn
  sched/idle: Make sure weak version of arch_cpu_idle_dead() doesn't
    return
  sched/idle: Mark arch_cpu_idle_dead() __noreturn

 arch/alpha/kernel/process.c      | 2 ++
 arch/arm/kernel/smp.c            | 2 ++
 arch/arm64/include/asm/smp.h     | 2 +-
 arch/csky/kernel/smp.c           | 2 ++
 arch/ia64/kernel/process.c       | 4 ++--
 arch/loongarch/include/asm/smp.h | 2 +-
 arch/loongarch/kernel/smp.c      | 2 +-
 arch/mips/include/asm/smp.h      | 2 +-
 arch/mips/kernel/smp-bmips.c     | 3 +++
 arch/mips/loongson64/smp.c       | 1 +
 arch/powerpc/include/asm/smp.h   | 2 +-
 arch/sh/include/asm/smp-ops.h    | 5 +++--
 arch/sh/kernel/idle.c            | 1 +
 arch/sparc/include/asm/smp_64.h  | 2 +-
 arch/x86/include/asm/smp.h       | 3 ++-
 arch/x86/kernel/process.c        | 2 +-
 arch/xtensa/include/asm/smp.h    | 2 +-
 arch/xtensa/kernel/smp.c         | 2 ++
 include/linux/cpu.h              | 2 +-
 kernel/sched/idle.c              | 2 +-
 tools/objtool/check.c            | 1 +
 21 files changed, 31 insertions(+), 15 deletions(-)

-- 
2.39.0


_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

WARNING: multiple messages have this Message-ID (diff)
From: Josh Poimboeuf <jpoimboe@kernel.org>
To: linux-kernel@vger.kernel.org
Cc: juri.lelli@redhat.com, dalias@libc.org,
	linux-ia64@vger.kernel.org, linux-sh@vger.kernel.org,
	peterz@infradead.org, catalin.marinas@arm.com,
	dave.hansen@linux.intel.com, x86@kernel.org,
	jiaxun.yang@flygoat.com, bsegall@google.com, jcmvbkbc@gmail.com,
	guoren@kernel.org, hpa@zytor.com, sparclinux@vger.kernel.org,
	kernel@xen0n.name, will@kernel.org, vschneid@redhat.com,
	f.fainelli@gmail.com, vincent.guittot@linaro.org,
	ysato@users.sourceforge.jp, chenhuacai@kernel.org,
	linux@armlinux.org.uk, linux-csky@vger.kernel.org,
	mingo@redhat.com, bcm-kernel-feedback-list@broadcom.com,
	mgorman@suse.de, mattst88@gmail.com,
	linux-xtensa@linux-xtensa.org, paulmck@kernel.org,
	richard.henderson@linaro.org, npiggin@gmail.com,
	ink@jurassic.park.msu.ru, rostedt@goodmis.org,
	loongarch@lists.linux.dev, tglx@linutronix.de,
	dietmar.eggemann@arm.com, linux-arm-kernel@lists.infradead.org,
	jgross@suse.com, chris@zankel.net, tsbogend@alpha.franken.de,
	bristot@redhat.com, linux-mips@vger.kernel.org,
	linux-alph a@vger.kernel.org, bp@alien8.de,
	linuxppc-dev@lists.ozlabs.org, davem@davemloft.net
Subject: [PATCH 00/22] cpu,sched: Mark arch_cpu_idle_dead() __noreturn
Date: Fri,  3 Feb 2023 14:05:09 -0800	[thread overview]
Message-ID: <cover.1675461757.git.jpoimboe@kernel.org> (raw)

These are some minor changes to enable the __noreturn attribute for
arch_cpu_idle_dead().  (If there are no objections, I can merge the
entire set through the tip tree.)

Until recently [1], in Xen, when a previously offlined CPU was brought
back online, it unexpectedly resumed execution where it left off in the
middle of the idle loop by returning from play_dead() and its caller
arch_cpu_idle_dead().

There were some clever hacks to make that work, but the behavior was
surprising as do_idle() doesn't expect an offlined CPU to return from
the dead in the middle of the function.

Now that Xen has been fixed, make sure arch_cpu_idle_dead() never
returns by marking it __noreturn.  This causes the compiler to complain
if an arch-specific implementation might return.  It also improves code
generation for both caller and callee.

Patches 1-20 update the arch-specific implementations of the function so
they don't actually return (even in error cases), and make that visible
to the compiler.  That's typically done by ending the function with a
call to another noreturn function, or with a BUG().

Patch 21 fixes the weak implementation.

Patch 22 actually adds the __noreturn attribute.

[1] 076cbf5d2163 ("x86/xen: don't let xen_pv_play_dead() return")

Josh Poimboeuf (22):
  alpha/cpu: Expose arch_cpu_idle_dead()'s prototype declaration
  alpha/cpu: Make sure arch_cpu_idle_dead() doesn't return
  arm/cpu: Make sure arch_cpu_idle_dead() doesn't return
  arm64/cpu: Mark cpu_die() __noreturn
  csky/cpu: Make sure arch_cpu_idle_dead() doesn't return
  ia64/cpu: Mark play_dead() __noreturn
  loongarch/cpu: Make sure play_dead() doesn't return
  loongarch/cpu: Mark play_dead() __noreturn
  mips/cpu: Expose play_dead()'s prototype definition
  mips/cpu: Make sure play_dead() doesn't return
  mips/cpu: Mark play_dead() __noreturn
  powerpc/cpu: Mark start_secondary_resume() __noreturn
  sh/cpu: Make sure play_dead() doesn't return
  sh/cpu: Mark play_dead() __noreturn
  sh/cpu: Expose arch_cpu_idle_dead()'s prototype definition
  sparc/cpu: Mark cpu_play_dead() __noreturn
  x86/cpu: Make sure play_dead() doesn't return
  x86/cpu: Mark play_dead() __noreturn
  xtensa/cpu: Make sure cpu_die() doesn't return
  xtensa/cpu: Mark cpu_die() __noreturn
  sched/idle: Make sure weak version of arch_cpu_idle_dead() doesn't
    return
  sched/idle: Mark arch_cpu_idle_dead() __noreturn

 arch/alpha/kernel/process.c      | 2 ++
 arch/arm/kernel/smp.c            | 2 ++
 arch/arm64/include/asm/smp.h     | 2 +-
 arch/csky/kernel/smp.c           | 2 ++
 arch/ia64/kernel/process.c       | 4 ++--
 arch/loongarch/include/asm/smp.h | 2 +-
 arch/loongarch/kernel/smp.c      | 2 +-
 arch/mips/include/asm/smp.h      | 2 +-
 arch/mips/kernel/smp-bmips.c     | 3 +++
 arch/mips/loongson64/smp.c       | 1 +
 arch/powerpc/include/asm/smp.h   | 2 +-
 arch/sh/include/asm/smp-ops.h    | 5 +++--
 arch/sh/kernel/idle.c            | 1 +
 arch/sparc/include/asm/smp_64.h  | 2 +-
 arch/x86/include/asm/smp.h       | 3 ++-
 arch/x86/kernel/process.c        | 2 +-
 arch/xtensa/include/asm/smp.h    | 2 +-
 arch/xtensa/kernel/smp.c         | 2 ++
 include/linux/cpu.h              | 2 +-
 kernel/sched/idle.c              | 2 +-
 tools/objtool/check.c            | 1 +
 21 files changed, 31 insertions(+), 15 deletions(-)

-- 
2.39.0


WARNING: multiple messages have this Message-ID (diff)
From: Josh Poimboeuf <jpoimboe@kernel.org>
To: linux-kernel@vger.kernel.org
Cc: jgross@suse.com, richard.henderson@linaro.org,
	ink@jurassic.park.msu.ru, mattst88@gmail.com,
	linux-alpha@vger.kernel.org, linux@armlinux.org.uk,
	linux-arm-kernel@lists.infradead.org, catalin.marinas@arm.com,
	will@kernel.org, guoren@kernel.org, linux-csky@vger.kernel.org,
	linux-ia64@vger.kernel.org, chenhuacai@kernel.org,
	kernel@xen0n.name, loongarch@lists.linux.dev,
	f.fainelli@gmail.com, bcm-kernel-feedback-list@broadcom.com,
	tsbogend@alpha.franken.de, linux-mips@vger.kernel.org,
	jiaxun.yang@flygoat.com, mpe@ellerman.id.au, npiggin@gmail.com,
	christophe.leroy@csgroup.eu, linuxppc-dev@lists.ozlabs.org,
	ysato@users.sourceforge.jp, dalias@libc.org,
	linux-sh@vger.kernel.org, davem@davemloft.net,
	sparclinux@vger.kernel.org, tglx@linutronix.de, mingo@redhat.com,
	bp@alien8.de, dave.hansen@linux.intel.com, x86@kernel.org,
	hpa@zytor.com, chris@zankel.net, jcmvbkbc@gmail.com,
	linux-xtensa@linux-xtensa.org, peterz@infradead.org,
	juri.lelli@redhat.com, vincent.guittot@linaro.org,
	dietmar.eggemann@arm.com, rostedt@goodmis.org,
	bsegall@google.com, mgorman@suse.de, bristot@redhat.com,
	vschneid@redhat.com, paulmck@kernel.org
Subject: [PATCH 00/22] cpu,sched: Mark arch_cpu_idle_dead() __noreturn
Date: Fri, 03 Feb 2023 22:05:09 +0000	[thread overview]
Message-ID: <cover.1675461757.git.jpoimboe@kernel.org> (raw)

These are some minor changes to enable the __noreturn attribute for
arch_cpu_idle_dead().  (If there are no objections, I can merge the
entire set through the tip tree.)

Until recently [1], in Xen, when a previously offlined CPU was brought
back online, it unexpectedly resumed execution where it left off in the
middle of the idle loop by returning from play_dead() and its caller
arch_cpu_idle_dead().

There were some clever hacks to make that work, but the behavior was
surprising as do_idle() doesn't expect an offlined CPU to return from
the dead in the middle of the function.

Now that Xen has been fixed, make sure arch_cpu_idle_dead() never
returns by marking it __noreturn.  This causes the compiler to complain
if an arch-specific implementation might return.  It also improves code
generation for both caller and callee.

Patches 1-20 update the arch-specific implementations of the function so
they don't actually return (even in error cases), and make that visible
to the compiler.  That's typically done by ending the function with a
call to another noreturn function, or with a BUG().

Patch 21 fixes the weak implementation.

Patch 22 actually adds the __noreturn attribute.

[1] 076cbf5d2163 ("x86/xen: don't let xen_pv_play_dead() return")

Josh Poimboeuf (22):
  alpha/cpu: Expose arch_cpu_idle_dead()'s prototype declaration
  alpha/cpu: Make sure arch_cpu_idle_dead() doesn't return
  arm/cpu: Make sure arch_cpu_idle_dead() doesn't return
  arm64/cpu: Mark cpu_die() __noreturn
  csky/cpu: Make sure arch_cpu_idle_dead() doesn't return
  ia64/cpu: Mark play_dead() __noreturn
  loongarch/cpu: Make sure play_dead() doesn't return
  loongarch/cpu: Mark play_dead() __noreturn
  mips/cpu: Expose play_dead()'s prototype definition
  mips/cpu: Make sure play_dead() doesn't return
  mips/cpu: Mark play_dead() __noreturn
  powerpc/cpu: Mark start_secondary_resume() __noreturn
  sh/cpu: Make sure play_dead() doesn't return
  sh/cpu: Mark play_dead() __noreturn
  sh/cpu: Expose arch_cpu_idle_dead()'s prototype definition
  sparc/cpu: Mark cpu_play_dead() __noreturn
  x86/cpu: Make sure play_dead() doesn't return
  x86/cpu: Mark play_dead() __noreturn
  xtensa/cpu: Make sure cpu_die() doesn't return
  xtensa/cpu: Mark cpu_die() __noreturn
  sched/idle: Make sure weak version of arch_cpu_idle_dead() doesn't
    return
  sched/idle: Mark arch_cpu_idle_dead() __noreturn

 arch/alpha/kernel/process.c      | 2 ++
 arch/arm/kernel/smp.c            | 2 ++
 arch/arm64/include/asm/smp.h     | 2 +-
 arch/csky/kernel/smp.c           | 2 ++
 arch/ia64/kernel/process.c       | 4 ++--
 arch/loongarch/include/asm/smp.h | 2 +-
 arch/loongarch/kernel/smp.c      | 2 +-
 arch/mips/include/asm/smp.h      | 2 +-
 arch/mips/kernel/smp-bmips.c     | 3 +++
 arch/mips/loongson64/smp.c       | 1 +
 arch/powerpc/include/asm/smp.h   | 2 +-
 arch/sh/include/asm/smp-ops.h    | 5 +++--
 arch/sh/kernel/idle.c            | 1 +
 arch/sparc/include/asm/smp_64.h  | 2 +-
 arch/x86/include/asm/smp.h       | 3 ++-
 arch/x86/kernel/process.c        | 2 +-
 arch/xtensa/include/asm/smp.h    | 2 +-
 arch/xtensa/kernel/smp.c         | 2 ++
 include/linux/cpu.h              | 2 +-
 kernel/sched/idle.c              | 2 +-
 tools/objtool/check.c            | 1 +
 21 files changed, 31 insertions(+), 15 deletions(-)

-- 
2.39.0

WARNING: multiple messages have this Message-ID (diff)
From: Josh Poimboeuf <jpoimboe@kernel.org>
To: linux-kernel@vger.kernel.org
Cc: jgross@suse.com, richard.henderson@linaro.org,
	ink@jurassic.park.msu.ru, mattst88@gmail.com,
	linux-alpha@vger.kernel.org, linux@armlinux.org.uk,
	linux-arm-kernel@lists.infradead.org, catalin.marinas@arm.com,
	will@kernel.org, guoren@kernel.org, linux-csky@vger.kernel.org,
	linux-ia64@vger.kernel.org, chenhuacai@kernel.org,
	kernel@xen0n.name, loongarch@lists.linux.dev,
	f.fainelli@gmail.com, bcm-kernel-feedback-list@broadcom.com,
	tsbogend@alpha.franken.de, linux-mips@vger.kernel.org,
	jiaxun.yang@flygoat.com, mpe@ellerman.id.au, npiggin@gmail.com,
	christophe.leroy@csgroup.eu, linuxppc-dev@lists.ozlabs.org,
	ysato@users.sourceforge.jp, dalias@libc.org,
	linux-sh@vger.kernel.org, davem@davemloft.net,
	sparclinux@vger.kernel.org, tglx@linutronix.de, mingo@redhat.com,
	bp@alien8.de, dave.hansen
Subject: [PATCH 00/22] cpu,sched: Mark arch_cpu_idle_dead() __noreturn
Date: Fri,  3 Feb 2023 14:05:09 -0800	[thread overview]
Message-ID: <cover.1675461757.git.jpoimboe@kernel.org> (raw)

These are some minor changes to enable the __noreturn attribute for
arch_cpu_idle_dead().  (If there are no objections, I can merge the
entire set through the tip tree.)

Until recently [1], in Xen, when a previously offlined CPU was brought
back online, it unexpectedly resumed execution where it left off in the
middle of the idle loop by returning from play_dead() and its caller
arch_cpu_idle_dead().

There were some clever hacks to make that work, but the behavior was
surprising as do_idle() doesn't expect an offlined CPU to return from
the dead in the middle of the function.

Now that Xen has been fixed, make sure arch_cpu_idle_dead() never
returns by marking it __noreturn.  This causes the compiler to complain
if an arch-specific implementation might return.  It also improves code
generation for both caller and callee.

Patches 1-20 update the arch-specific implementations of the function so
they don't actually return (even in error cases), and make that visible
to the compiler.  That's typically done by ending the function with a
call to another noreturn function, or with a BUG().

Patch 21 fixes the weak implementation.

Patch 22 actually adds the __noreturn attribute.

[1] 076cbf5d2163 ("x86/xen: don't let xen_pv_play_dead() return")

Josh Poimboeuf (22):
  alpha/cpu: Expose arch_cpu_idle_dead()'s prototype declaration
  alpha/cpu: Make sure arch_cpu_idle_dead() doesn't return
  arm/cpu: Make sure arch_cpu_idle_dead() doesn't return
  arm64/cpu: Mark cpu_die() __noreturn
  csky/cpu: Make sure arch_cpu_idle_dead() doesn't return
  ia64/cpu: Mark play_dead() __noreturn
  loongarch/cpu: Make sure play_dead() doesn't return
  loongarch/cpu: Mark play_dead() __noreturn
  mips/cpu: Expose play_dead()'s prototype definition
  mips/cpu: Make sure play_dead() doesn't return
  mips/cpu: Mark play_dead() __noreturn
  powerpc/cpu: Mark start_secondary_resume() __noreturn
  sh/cpu: Make sure play_dead() doesn't return
  sh/cpu: Mark play_dead() __noreturn
  sh/cpu: Expose arch_cpu_idle_dead()'s prototype definition
  sparc/cpu: Mark cpu_play_dead() __noreturn
  x86/cpu: Make sure play_dead() doesn't return
  x86/cpu: Mark play_dead() __noreturn
  xtensa/cpu: Make sure cpu_die() doesn't return
  xtensa/cpu: Mark cpu_die() __noreturn
  sched/idle: Make sure weak version of arch_cpu_idle_dead() doesn't
    return
  sched/idle: Mark arch_cpu_idle_dead() __noreturn

 arch/alpha/kernel/process.c      | 2 ++
 arch/arm/kernel/smp.c            | 2 ++
 arch/arm64/include/asm/smp.h     | 2 +-
 arch/csky/kernel/smp.c           | 2 ++
 arch/ia64/kernel/process.c       | 4 ++--
 arch/loongarch/include/asm/smp.h | 2 +-
 arch/loongarch/kernel/smp.c      | 2 +-
 arch/mips/include/asm/smp.h      | 2 +-
 arch/mips/kernel/smp-bmips.c     | 3 +++
 arch/mips/loongson64/smp.c       | 1 +
 arch/powerpc/include/asm/smp.h   | 2 +-
 arch/sh/include/asm/smp-ops.h    | 5 +++--
 arch/sh/kernel/idle.c            | 1 +
 arch/sparc/include/asm/smp_64.h  | 2 +-
 arch/x86/include/asm/smp.h       | 3 ++-
 arch/x86/kernel/process.c        | 2 +-
 arch/xtensa/include/asm/smp.h    | 2 +-
 arch/xtensa/kernel/smp.c         | 2 ++
 include/linux/cpu.h              | 2 +-
 kernel/sched/idle.c              | 2 +-
 tools/objtool/check.c            | 1 +
 21 files changed, 31 insertions(+), 15 deletions(-)

-- 
2.39.0


             reply	other threads:[~2023-02-03 22:05 UTC|newest]

Thread overview: 157+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-02-03 22:05 Josh Poimboeuf [this message]
2023-02-03 22:05 ` [PATCH 00/22] cpu,sched: Mark arch_cpu_idle_dead() __noreturn Josh Poimboeuf
2023-02-03 22:05 ` Josh Poimboeuf
2023-02-03 22:05 ` Josh Poimboeuf
2023-02-03 22:05 ` Josh Poimboeuf
2023-02-03 22:05 ` [PATCH 01/22] alpha/cpu: Expose arch_cpu_idle_dead()'s prototype declaration Josh Poimboeuf
2023-02-03 22:05   ` Josh Poimboeuf
2023-02-03 22:05   ` Josh Poimboeuf
2023-02-03 22:05   ` Josh Poimboeuf
2023-02-03 22:05   ` Josh Poimboeuf
2023-02-03 22:05 ` [PATCH 02/22] alpha/cpu: Make sure arch_cpu_idle_dead() doesn't return Josh Poimboeuf
2023-02-03 22:05   ` Josh Poimboeuf
2023-02-03 22:05   ` Josh Poimboeuf
2023-02-03 22:05   ` Josh Poimboeuf
2023-02-03 22:05   ` Josh Poimboeuf
2023-02-03 22:05 ` [PATCH 03/22] arm/cpu: " Josh Poimboeuf
2023-02-03 22:05   ` Josh Poimboeuf
2023-02-03 22:05   ` Josh Poimboeuf
2023-02-03 22:05   ` Josh Poimboeuf
2023-02-03 22:05   ` Josh Poimboeuf
2023-02-03 22:05 ` [PATCH 04/22] arm64/cpu: Mark cpu_die() __noreturn Josh Poimboeuf
2023-02-03 22:05   ` Josh Poimboeuf
2023-02-03 22:05   ` Josh Poimboeuf
2023-02-03 22:05   ` Josh Poimboeuf
2023-02-03 22:05   ` Josh Poimboeuf
2023-02-03 22:05 ` [PATCH 05/22] csky/cpu: Make sure arch_cpu_idle_dead() doesn't return Josh Poimboeuf
2023-02-03 22:05   ` Josh Poimboeuf
2023-02-03 22:05   ` Josh Poimboeuf
2023-02-03 22:05   ` Josh Poimboeuf
2023-02-03 22:05   ` Josh Poimboeuf
2023-02-04  1:12   ` Guo Ren
2023-02-04  1:12     ` Guo Ren
2023-02-04  1:12     ` Guo Ren
2023-02-04  1:12     ` Guo Ren
2023-02-04  1:12     ` Guo Ren
2023-02-04  2:29     ` Josh Poimboeuf
2023-02-04  2:29       ` Josh Poimboeuf
2023-02-04  2:29       ` Josh Poimboeuf
2023-02-04  2:29       ` Josh Poimboeuf
2023-02-04  2:29       ` Josh Poimboeuf
2023-02-06  3:11       ` Guo Ren
2023-02-06  3:11         ` Guo Ren
2023-02-06  3:11         ` Guo Ren
2023-02-06  3:11         ` Guo Ren
2023-02-06  3:11         ` Guo Ren
2023-02-03 22:05 ` [PATCH 06/22] ia64/cpu: Mark play_dead() __noreturn Josh Poimboeuf
2023-02-03 22:05   ` Josh Poimboeuf
2023-02-03 22:05   ` Josh Poimboeuf
2023-02-03 22:05   ` Josh Poimboeuf
2023-02-03 22:05   ` Josh Poimboeuf
2023-02-03 22:05 ` [PATCH 07/22] loongarch/cpu: Make sure play_dead() doesn't return Josh Poimboeuf
2023-02-03 22:05   ` Josh Poimboeuf
2023-02-03 22:05   ` Josh Poimboeuf
2023-02-03 22:05   ` Josh Poimboeuf
2023-02-03 22:05   ` Josh Poimboeuf
2023-02-03 22:05 ` [PATCH 08/22] loongarch/cpu: Mark play_dead() __noreturn Josh Poimboeuf
2023-02-03 22:05   ` Josh Poimboeuf
2023-02-03 22:05   ` Josh Poimboeuf
2023-02-03 22:05   ` Josh Poimboeuf
2023-02-03 22:05   ` Josh Poimboeuf
2023-02-03 22:05 ` [PATCH 09/22] mips/cpu: Expose play_dead()'s prototype definition Josh Poimboeuf
2023-02-03 22:05   ` Josh Poimboeuf
2023-02-03 22:05   ` Josh Poimboeuf
2023-02-03 22:05   ` Josh Poimboeuf
2023-02-03 22:05   ` Josh Poimboeuf
2023-02-06 22:36   ` Florian Fainelli
2023-02-06 22:36     ` Florian Fainelli
2023-02-06 22:36     ` Florian Fainelli
2023-02-06 22:36     ` Florian Fainelli
2023-02-03 22:05 ` [PATCH 10/22] mips/cpu: Make sure play_dead() doesn't return Josh Poimboeuf
2023-02-03 22:05   ` Josh Poimboeuf
2023-02-03 22:05   ` Josh Poimboeuf
2023-02-03 22:05   ` Josh Poimboeuf
2023-02-03 22:05   ` Josh Poimboeuf
2023-02-06 22:36   ` Florian Fainelli
2023-02-06 22:36     ` Florian Fainelli
2023-02-06 22:36     ` Florian Fainelli
2023-02-06 22:36     ` Florian Fainelli
2023-02-03 22:05 ` [PATCH 11/22] mips/cpu: Mark play_dead() __noreturn Josh Poimboeuf
2023-02-03 22:05   ` Josh Poimboeuf
2023-02-03 22:05   ` Josh Poimboeuf
2023-02-03 22:05   ` Josh Poimboeuf
2023-02-03 22:05   ` Josh Poimboeuf
2023-02-06 22:36   ` Florian Fainelli
2023-02-06 22:36     ` Florian Fainelli
2023-02-06 22:36     ` Florian Fainelli
2023-02-06 22:36     ` Florian Fainelli
2023-02-03 22:05 ` [PATCH 12/22] powerpc/cpu: Mark start_secondary_resume() __noreturn Josh Poimboeuf
2023-02-03 22:05   ` Josh Poimboeuf
2023-02-03 22:05   ` Josh Poimboeuf
2023-02-03 22:05   ` Josh Poimboeuf
2023-02-03 22:05   ` Josh Poimboeuf
2023-02-06 11:10   ` Michael Ellerman
2023-02-06 11:10     ` Michael Ellerman
2023-02-06 11:10     ` Michael Ellerman
2023-02-06 11:10     ` Michael Ellerman
2023-02-06 11:10     ` Michael Ellerman
2023-02-06 22:22     ` Josh Poimboeuf
2023-02-06 22:22       ` Josh Poimboeuf
2023-02-06 22:22       ` Josh Poimboeuf
2023-02-06 22:22       ` Josh Poimboeuf
2023-02-06 22:22       ` Josh Poimboeuf
2023-02-03 22:05 ` [PATCH 13/22] sh/cpu: Make sure play_dead() doesn't return Josh Poimboeuf
2023-02-03 22:05   ` Josh Poimboeuf
2023-02-03 22:05   ` Josh Poimboeuf
2023-02-03 22:05   ` Josh Poimboeuf
2023-02-03 22:05   ` Josh Poimboeuf
2023-02-03 22:05 ` [PATCH 14/22] sh/cpu: Mark play_dead() __noreturn Josh Poimboeuf
2023-02-03 22:05   ` Josh Poimboeuf
2023-02-03 22:05   ` Josh Poimboeuf
2023-02-03 22:05   ` Josh Poimboeuf
2023-02-03 22:05   ` Josh Poimboeuf
2023-02-03 22:05 ` [PATCH 15/22] sh/cpu: Expose arch_cpu_idle_dead()'s prototype definition Josh Poimboeuf
2023-02-03 22:05   ` Josh Poimboeuf
2023-02-03 22:05   ` Josh Poimboeuf
2023-02-03 22:05   ` Josh Poimboeuf
2023-02-03 22:05   ` Josh Poimboeuf
2023-02-03 22:05 ` [PATCH 16/22] sparc/cpu: Mark cpu_play_dead() __noreturn Josh Poimboeuf
2023-02-03 22:05   ` Josh Poimboeuf
2023-02-03 22:05   ` Josh Poimboeuf
2023-02-03 22:05   ` Josh Poimboeuf
2023-02-03 22:05   ` Josh Poimboeuf
2023-02-03 22:05 ` [PATCH 17/22] x86/cpu: Make sure play_dead() doesn't return Josh Poimboeuf
2023-02-03 22:05   ` Josh Poimboeuf
2023-02-03 22:05   ` Josh Poimboeuf
2023-02-03 22:05   ` Josh Poimboeuf
2023-02-03 22:05   ` Josh Poimboeuf
2023-02-03 22:05 ` [PATCH 18/22] x86/cpu: Mark play_dead() __noreturn Josh Poimboeuf
2023-02-03 22:05   ` Josh Poimboeuf
2023-02-03 22:05   ` Josh Poimboeuf
2023-02-03 22:05   ` Josh Poimboeuf
2023-02-03 22:05   ` Josh Poimboeuf
2023-02-03 22:05 ` [PATCH 19/22] xtensa/cpu: Make sure cpu_die() doesn't return Josh Poimboeuf
2023-02-03 22:05   ` Josh Poimboeuf
2023-02-03 22:05   ` Josh Poimboeuf
2023-02-03 22:05   ` Josh Poimboeuf
2023-02-03 22:05   ` Josh Poimboeuf
2023-02-03 22:05 ` [PATCH 20/22] xtensa/cpu: Mark cpu_die() __noreturn Josh Poimboeuf
2023-02-03 22:05   ` Josh Poimboeuf
2023-02-03 22:05   ` Josh Poimboeuf
2023-02-03 22:05   ` Josh Poimboeuf
2023-02-03 22:05   ` Josh Poimboeuf
2023-02-03 22:05 ` [PATCH 21/22] sched/idle: Make sure weak version of arch_cpu_idle_dead() doesn't return Josh Poimboeuf
2023-02-03 22:05   ` Josh Poimboeuf
2023-02-03 22:05   ` Josh Poimboeuf
2023-02-03 22:05   ` Josh Poimboeuf
2023-02-03 22:05   ` Josh Poimboeuf
2023-02-03 22:05 ` [PATCH 22/22] sched/idle: Mark arch_cpu_idle_dead() __noreturn Josh Poimboeuf
2023-02-03 22:05   ` Josh Poimboeuf
2023-02-03 22:05   ` Josh Poimboeuf
2023-02-03 22:05   ` Josh Poimboeuf
2023-02-03 22:05   ` Josh Poimboeuf
2023-02-07 17:33   ` [PATCH v1.1 " Josh Poimboeuf
2023-02-07 17:33     ` Josh Poimboeuf
2023-02-07 17:33     ` Josh Poimboeuf
2023-02-07 17:33     ` Josh Poimboeuf
2023-02-07 17:33     ` Josh Poimboeuf

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=cover.1675461757.git.jpoimboe@kernel.org \
    --to=jpoimboe@kernel.org \
    --cc=bcm-kernel-feedback-list@broadcom.com \
    --cc=bp@alien8.de \
    --cc=bristot@redhat.com \
    --cc=bsegall@google.com \
    --cc=catalin.marinas@arm.com \
    --cc=chenhuacai@kernel.org \
    --cc=chris@zankel.net \
    --cc=christophe.leroy@csgroup.eu \
    --cc=dalias@libc.org \
    --cc=dave.hansen@linux.intel.com \
    --cc=davem@davemloft.net \
    --cc=dietmar.eggemann@arm.com \
    --cc=f.fainelli@gmail.com \
    --cc=guoren@kernel.org \
    --cc=hpa@zytor.com \
    --cc=ink@jurassic.park.msu.ru \
    --cc=jcmvbkbc@gmail.com \
    --cc=jgross@suse.com \
    --cc=jiaxun.yang@flygoat.com \
    --cc=juri.lelli@redhat.com \
    --cc=kernel@xen0n.name \
    --cc=linux-alpha@vger.kernel.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-csky@vger.kernel.org \
    --cc=linux-ia64@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mips@vger.kernel.org \
    --cc=linux-sh@vger.kernel.org \
    --cc=linux-xtensa@linux-xtensa.org \
    --cc=linux@armlinux.org.uk \
    --cc=linuxppc-dev@lists.ozlabs.org \
    --cc=loongarch@lists.linux.dev \
    --cc=mattst88@gmail.com \
    --cc=mgorman@suse.de \
    --cc=mingo@redhat.com \
    --cc=mpe@ellerman.id.au \
    --cc=npiggin@gmail.com \
    --cc=paulmck@kernel.org \
    --cc=peterz@infradead.org \
    --cc=richard.henderson@linaro.org \
    --cc=rostedt@goodmis.org \
    --cc=sparclinux@vger.kernel.org \
    --cc=tglx@linutronix.de \
    --cc=tsbogend@alpha.franken.de \
    --cc=vincent.guittot@linaro.org \
    --cc=vschneid@redhat.com \
    --cc=will@kernel.org \
    --cc=x86@kernel.org \
    --cc=ysato@users.sourceforge.jp \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.