Skip to contentSkip to conversation

fix conflicting cpu_idle() declarations

PATCH In review Oleg Nesterov 6 participants 9 messages Dec 27, 2004 – Dec 30, 2004

Subsystems (5)
lore
Share & tools
lore
#0 lore raw

PATCH 1/1 fix conflicting cpu_idle() declarations

cpu_idle() declared/defined in

init/main.c: void cpu_idle(void)

i386/kernel/process.c void cpu_idle(void)
i386/kernel/smpboot.c: int cpu_idle(void)
i386/mach-voyager/voyager_smp.c: int cpu_idle(void)

ppc/kernel/idle.c: int cpu_idle(void)
ppc/kernel/smp.c: int cpu_idle(void *unused)

ppc64/kernel/idle.c: int cpu_idle(void)
ppc64/kernel/smp.c: int cpu_idle(void *unused)

sparc/kernel/process.c: int cpu_idle(void)

sparc64/kernel/process.c: int cpu_idle(void)

sh/kernel/process.c: void cpu_idle(void *unused)
sh/kernel/smp.c: int cpu_idle(void *unused)

ia64/kernel/smpboot.c: int cpu_idle(void)
ia64/kernel/process.c: void cpu_idle(void *unused)

sh64/kernel/process.c: void cpu_idle(void *unused)

s390/kernel/process.c: int cpu_idle(void)
s390/kernel/smp.c: int cpu_idle(void * unused)

m32r/kernel/process.c: void cpu_idle(void)
m32r/kernel/smpboot.c int cpu_idle(void)

Other arches beleive that cpu_idle is void(void).

This patch puts 'void cpu_idle(void)' in include/linux/smp.h and fixes conflicting definitions.

Also removes now unneeded declarations in x86_64, alpha, parisc.

Only i386 part is tested.

diffstat output:

 arch/alpha/kernel/proto.h            |    3 ---
 arch/i386/kernel/smpboot.c           |    6 ++----
 arch/i386/mach-voyager/voyager_smp.c |    5 ++---
 arch/ia64/kernel/process.c           |    2 +-
 arch/ia64/kernel/smpboot.c           |    5 ++---
 arch/m32r/kernel/smpboot.c           |    4 ++--
 arch/parisc/kernel/smp.c             |    1 -
 arch/ppc/kernel/idle.c               |    3 +--
 arch/ppc/kernel/smp.c                |    4 ++--
 arch/ppc64/kernel/idle.c             |    3 +--
 arch/ppc64/kernel/smp.c              |    4 ++--
 arch/s390/kernel/process.c           |    3 +--
 arch/s390/kernel/smp.c               |    4 ++--
 arch/sh/kernel/process.c             |    2 +-
 arch/sh/kernel/smp.c                 |    4 ++--
 arch/sh64/kernel/process.c           |    2 +-
 arch/sparc/kernel/process.c          |    9 +++------
 arch/sparc/kernel/sun4d_smp.c        |    1 -
 arch/sparc/kernel/sun4m_smp.c        |    1 -
 arch/sparc64/kernel/process.c        |    8 ++++----
 include/asm-x86_64/proto.h           |    1 -
 include/linux/smp.h                  |    2 ++
 init/main.c                          |    1 -
 23 files changed, 31 insertions(+), 47 deletions(-)
include/linux/smp.h renamed from include/linux/smp.h~1_common +2 -0
@@ -8,6 +8,8 @@
 
 #include <linux/config.h>
 
+extern void cpu_idle(void);
+
 #ifdef CONFIG_SMP
 
 #include <linux/preempt.h>
init/main.c renamed from init/main.c~1_common +0 -1
@@ -359,7 +359,6 @@ static int __init init_setup(char *str)
 __setup("init=", init_setup);
 
 extern void setup_arch(char **);
-extern void cpu_idle(void);
 
 #ifndef CONFIG_SMP
 
arch/i386/kernel/smpboot.c renamed from arch/i386/kernel/smpboot.c~2_i386 +2 -4
@@ -411,12 +411,10 @@ void __init smp_callin(void)
 
 int cpucount;
 
-extern int cpu_idle(void);
-
 /*
  * Activate a secondary processor.
  */
-int __init start_secondary(void *unused)
+static void __init start_secondary(void *unused)
 {
 	/*
 	 * Dont put anything before smp_callin(), SMP
@@ -441,7 +439,7 @@ int __init start_secondary(void *unused)
 	local_flush_tlb();
 	cpu_set(smp_processor_id(), cpu_online_map);
 	wmb();
-	return cpu_idle();
+	cpu_idle();
 }
 
 /*
arch/i386/mach-voyager/voyager_smp.c renamed from arch/i386/mach-voyager/voyager_smp.c~2_i386 +2 -3
@@ -457,13 +457,12 @@ setup_trampoline(void)
 }
 
 /* Routine initially called when a non-boot CPU is brought online */
-int __init
+static void __init
 start_secondary(void *unused)
 {
 	__u8 cpuid = hard_smp_processor_id();
 	/* external functions not defined in the headers */
 	extern void calibrate_delay(void);
-	extern int cpu_idle(void);
 
 	cpu_init();
 
@@ -520,7 +519,7 @@ start_secondary(void *unused)
 
 	cpu_set(cpuid, cpu_online_map);
 	wmb();
-	return cpu_idle();
+	cpu_idle();
 }
 
 
arch/ppc/kernel/idle.c renamed from arch/ppc/kernel/idle.c~3_ppc +1 -2
@@ -57,14 +57,13 @@ void default_idle(void)
 /*
  * The body of the idle task.
  */
-int cpu_idle(void)
+void cpu_idle(void)
 {
 	for (;;)
 		if (ppc_md.idle != NULL)
 			ppc_md.idle();
 		else
 			default_idle();
-	return 0;
 }
 
 #if defined(CONFIG_SYSCTL) && defined(CONFIG_6xx)
arch/ppc/kernel/smp.c renamed from arch/ppc/kernel/smp.c~3_ppc +2 -2
@@ -60,7 +60,6 @@ static struct smp_ops_t *smp_ops;
 volatile unsigned long cpu_callin_map[NR_CPUS];
 
 int start_secondary(void *);
-extern int cpu_idle(void *unused);
 void smp_call_function_interrupt(void);
 static int __smp_call_function(void (*func) (void *info), void *info,
 			       int wait, int target);
@@ -358,7 +357,8 @@ int __devinit start_secondary(void *unus
 	smp_ops->take_timebase();
 	printk("CPU %i done timebase take...\n", cpu);
 
-	return cpu_idle(NULL);
+	cpu_idle();
+	return 0;
 }
 
 int __cpu_up(unsigned int cpu)
arch/ppc64/kernel/smp.c renamed from arch/ppc64/kernel/smp.c~4_ppc64 +2 -2
@@ -74,7 +74,6 @@ static volatile unsigned int cpu_callin_
 
 extern unsigned char stab_array[];
 
-extern int cpu_idle(void *unused);
 void smp_call_function_interrupt(void);
 
 int smt_enabled_at_boot = 1;
@@ -523,7 +522,8 @@ int __devinit start_secondary(void *unus
 
 	local_irq_enable();
 
-	return cpu_idle(NULL);
+	cpu_idle();
+	return 0;
 }
 
 int setup_profiling_timer(unsigned int multiplier)
arch/ppc64/kernel/idle.c renamed from arch/ppc64/kernel/idle.c~4_ppc64 +1 -2
@@ -298,10 +298,9 @@ static int native_idle(void)
 
 #endif /* CONFIG_PPC_ISERIES */
 
-int cpu_idle(void)
+void cpu_idle(void)
 {
 	idle_loop();
-	return 0;
 }
 
 int powersave_nap;
arch/sparc/kernel/sun4d_smp.c renamed from arch/sparc/kernel/sun4d_smp.c~5_sparc +0 -1
@@ -146,7 +146,6 @@ void __init smp4d_callin(void)
 	spin_unlock_irqrestore(&sun4d_imsk_lock, flags);
 }
 
-extern int cpu_idle(void *unused);
 extern void init_IRQ(void);
 extern void cpu_panic(void);
 
arch/sparc/kernel/sun4m_smp.c renamed from arch/sparc/kernel/sun4m_smp.c~5_sparc +0 -1
@@ -121,7 +121,6 @@ void __init smp4m_callin(void)
 	local_irq_enable();
 }
 
-extern int cpu_idle(void *unused);
 extern void init_IRQ(void);
 extern void cpu_panic(void);
 
arch/sparc/kernel/process.c renamed from arch/sparc/kernel/process.c~5_sparc +3 -6
@@ -81,10 +81,8 @@ void default_idle(void)
 /*
  * the idle loop on a Sparc... ;)
  */
-int cpu_idle(void)
+void cpu_idle(void)
 {
-	int ret = -EPERM;
-
 	if (current->pid != 0)
 		goto out;
 
@@ -128,15 +126,14 @@ int cpu_idle(void)
 		schedule();
 		check_pgt_cache();
 	}
-	ret = 0;
 out:
-	return ret;
+	return;
 }
 
 #else
 
 /* This is being executed in task 0 'user space'. */
-int cpu_idle(void)
+void cpu_idle(void)
 {
 	/* endless idle loop with no priority at all */
 	while(1) {
arch/sparc64/kernel/process.c renamed from arch/sparc64/kernel/process.c~6_sparc64 +4 -4
@@ -60,10 +60,10 @@ void default_idle(void)
 /*
  * the idle loop on a Sparc... ;)
  */
-int cpu_idle(void)
+void cpu_idle(void)
 {
 	if (current->pid != 0)
-		return -EPERM;
+		return;
 
 	/* endless idle loop with no priority at all */
 	for (;;) {
@@ -80,7 +80,7 @@ int cpu_idle(void)
 		schedule();
 		check_pgt_cache();
 	}
-	return 0;
+	return;
 }
 
 #else
@@ -90,7 +90,7 @@ int cpu_idle(void)
  */
 #define idle_me_harder()	(cpu_data(smp_processor_id()).idle_volume += 1)
 #define unidle_me()		(cpu_data(smp_processor_id()).idle_volume = 0)
-int cpu_idle(void)
+void cpu_idle(void)
 {
 	set_thread_flag(TIF_POLLING_NRFLAG);
 	while(1) {
arch/sh/kernel/process.c renamed from arch/sh/kernel/process.c~7_sh +1 -1
@@ -68,7 +68,7 @@ void default_idle(void)
 	}
 }
 
-void cpu_idle(void *unused)
+void cpu_idle(void)
 {
 	default_idle();
 }
arch/sh/kernel/smp.c renamed from arch/sh/kernel/smp.c~7_sh +2 -2
@@ -37,7 +37,6 @@
 int smp_threads_ready = 0;
 struct sh_cpuinfo cpu_data[NR_CPUS];
 
-extern int cpu_idle(void *unused);
 extern void per_cpu_trap_init(void);
 
 cpumask_t cpu_possible_map;
@@ -124,7 +123,8 @@ int start_secondary(void *unused)
 	
 	atomic_inc(&cpus_booted);
 
-	return cpu_idle(0);
+	cpu_idle();
+	return 0;
 }
 
 void __init smp_cpus_done(unsigned int max_cpus)
arch/ia64/kernel/smpboot.c renamed from arch/ia64/kernel/smpboot.c~8_ia64 +2 -3
@@ -343,8 +343,6 @@ smp_callin (void)
 int __devinit
 start_secondary (void *unused)
 {
-	extern int cpu_idle (void);
-
 	/* Early console may use I/O ports */
 	ia64_set_kr(IA64_KR_IO_BASE, __pa(ia64_iobase));
 
@@ -353,7 +351,8 @@ start_secondary (void *unused)
 	cpu_init();
 	smp_callin();
 
-	return cpu_idle();
+	cpu_idle();
+	return 0;
 }
 
 struct pt_regs * __devinit idle_regs(struct pt_regs *regs)
arch/ia64/kernel/process.c renamed from arch/ia64/kernel/process.c~8_ia64 +1 -1
@@ -226,7 +226,7 @@ static inline void play_dead(void)
 #endif /* CONFIG_HOTPLUG_CPU */
 
 void __attribute__((noreturn))
-cpu_idle (void *unused)
+cpu_idle (void)
 {
 	void (*mark_idle)(int) = ia64_mark_idle;
 
arch/sh64/kernel/process.c renamed from arch/sh64/kernel/process.c~9_sh64 +1 -1
@@ -338,7 +338,7 @@ void default_idle(void)
 	}
 }
 
-void cpu_idle(void *unused)
+void cpu_idle(void)
 {
 	default_idle();
 }
arch/s390/kernel/process.c renamed from arch/s390/kernel/process.c~10_s390 +1 -2
@@ -159,11 +159,10 @@ void default_idle(void)
 #endif /* CONFIG_ARCH_S390X */
 }
 
-int cpu_idle(void)
+void cpu_idle(void)
 {
 	for (;;)
 		default_idle();
-	return 0;
 }
 
 void show_regs(struct pt_regs *regs)
arch/s390/kernel/smp.c renamed from arch/s390/kernel/smp.c~10_s390 +2 -2
@@ -42,7 +42,6 @@
 #include <asm/tlbflush.h>
 
 /* prototypes */
-extern int cpu_idle(void * unused);
 
 extern volatile int __cpu_logical_map[];
 
@@ -557,7 +556,8 @@ int __devinit start_secondary(void *cpuv
         /* Print info about this processor */
         print_cpu_info(&S390_lowcore.cpu_data);
         /* cpu_idle will call schedule for us */
-        return cpu_idle(NULL);
+        cpu_idle();
+        return 0;
 }
 
 static void __init smp_create_idle(unsigned int cpu)
arch/m32r/kernel/smpboot.c renamed from arch/m32r/kernel/smpboot.c~11_m32 +2 -2
@@ -58,7 +58,6 @@
 #define Dprintk(x...)
 #endif
 
-extern int cpu_idle(void);
 extern cpumask_t cpu_initialized;
 
 /*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/
@@ -443,7 +442,8 @@ int __init start_secondary(void *unused)
 	 */
 	local_flush_tlb_all();
 
-	return cpu_idle();
+	cpu_idle();
+	return 0;
 }
 
 /*==========================================================================*
include/asm-x86_64/proto.h renamed from include/asm-x86_64/proto.h~12_x86_64 +0 -1
@@ -26,7 +26,6 @@ extern void ia32_cstar_target(void); 
 extern void ia32_sysenter_target(void); 
 
 extern void calibrate_delay(void);
-extern void cpu_idle(void);
 extern void config_acpi_tables(void);
 extern void ia32_syscall(void);
 extern void iommu_hole_init(void);
arch/alpha/kernel/proto.h renamed from arch/alpha/kernel/proto.h~13_alpha +0 -3
@@ -167,9 +167,6 @@ extern void entSys(void);
 extern void entUna(void);
 extern void entDbg(void);
 
-/* process.c */
-extern void cpu_idle(void) __attribute__((noreturn));
-
 /* ptrace.c */
 extern int ptrace_set_bpt (struct task_struct *child);
 extern int ptrace_cancel_bpt (struct task_struct *child);
arch/parisc/kernel/smp.c renamed from arch/parisc/kernel/smp.c~14_parisc +0 -1
@@ -459,7 +459,6 @@ smp_cpu_init(int cpunum)
  */
 void __init smp_callin(void)
 {
-	extern void cpu_idle(void);	/* arch/parisc/kernel/process.c */
 	int slave_id = cpu_now_booting;
 #if 0
 	void *istack;
#1 lore raw
Quoted 7 lines · Oleg Nesterov

cpu_idle() declared/defined in
init/main.c: void cpu_idle(void)
i386/kernel/process.c void cpu_idle(void)
i386/kernel/smpboot.c: int cpu_idle(void)
i386/mach-voyager/voyager_smp.c: int cpu_idle(void)
ppc/kernel/idle.c: int cpu_idle(void)
ppc/kernel/smp.c: int cpu_idle(void *unused)

Quoted 8 lines

ppc64/kernel/idle.c: int cpu_idle(void)
ppc64/kernel/smp.c: int cpu_idle(void *unused)
sparc/kernel/process.c: int cpu_idle(void)
sparc64/kernel/process.c: int cpu_idle(void)
sh/kernel/process.c: void cpu_idle(void *unused)
sh/kernel/smp.c: int cpu_idle(void *unused)
ia64/kernel/smpboot.c: int cpu_idle(void)
ia64/kernel/process.c: void cpu_idle(void *unused)

It's remarkable that several arches are internally inconsistent. Anyway, this will likely be a shoo-in, as it removes more code than it adds. The mess surrounding cpu_idle() has been aggravating for some time.

-- wli

#2 lore raw

PATCH 1/1 fix sparc64 cpu_idle()

Quoted 17 lines · William Lee Irwin III
Quoted 15 lines · Oleg Nesterov

cpu_idle() declared/defined in

init/main.c:                          void cpu_idle(void)
i386/kernel/process.c                 void cpu_idle(void)
i386/kernel/smpboot.c:                int  cpu_idle(void)
i386/mach-voyager/voyager_smp.c:      int  cpu_idle(void)
ppc/kernel/idle.c:                    int  cpu_idle(void)
ppc/kernel/smp.c:                     int  cpu_idle(void *unused)
ppc64/kernel/idle.c:                  int  cpu_idle(void)
ppc64/kernel/smp.c:                   int  cpu_idle(void *unused)
sparc/kernel/process.c:               int  cpu_idle(void)
sparc64/kernel/process.c:             int  cpu_idle(void)
sh/kernel/process.c:                  void cpu_idle(void *unused)
sh/kernel/smp.c:                      int  cpu_idle(void *unused)
ia64/kernel/smpboot.c:                int  cpu_idle(void)
ia64/kernel/process.c:                void cpu_idle(void *unused)
Quoted 3 lines

It's remarkable that several arches are internally inconsistent. Anyway, this will likely be a shoo-in, as it removes more code than it adds. The mess surrounding cpu_idle() has been aggravating for some time.

It's not flexible to enforce 'void cpu_idle(void)' all over. What If someday someone would want cpu_idle() to return value for some arch.

Currently sparch64's UP cpu_idel() returns -EPERM. This is paranoia.

diff -Nurp 2.6.10/arch/sparc64/kernel/process.c
2.6.10-cy/arch/sparc64/kernel/process.c

arch/sparc64/kernel/process.c +1 -5
@@ -60,11 +60,8 @@ void default_idle(void)
 /*
  * the idle loop on a Sparc... ;)
  */
-int cpu_idle(void)
+void cpu_idle(void)
 {
-	if (current->pid != 0)
-		return -EPERM;
-
 	/* endless idle loop with no priority at all */
 	for (;;) {
 		/* If current->work.need_resched is zero we should really
@@ -80,7 +77,6 @@ int cpu_idle(void)
 		schedule();
 		check_pgt_cache();
 	}
-	return 0;
 }
 
 #else
Signature · 2 lines
Coywolf Qi Hunt
Homepage http://sosdg.org/~coywolf/
#3 lore raw

Re: [patch] fix sparc64 cpu_idle()

Currently sparc and sparc64's UP cpu_idel() checks current pid. This is paranoia.

 sparc/kernel/process.c   |   10 +---------
 sparc64/kernel/process.c |    6 +-----
 2 files changed, 2 insertions(+), 14 deletions(-)

diff -Nurp 2.6.10/arch/sparc/kernel/process.c
2.6.10-cy/arch/sparc/kernel/process.c

arch/sparc/kernel/process.c +1 -9
@@ -81,13 +81,8 @@ void default_idle(void)
 /*
  * the idle loop on a Sparc... ;)
  */
-int cpu_idle(void)
+void cpu_idle(void)
 {
-	int ret = -EPERM;
-
-	if (current->pid != 0)
-		goto out;
-
 	/* endless idle loop with no priority at all */
 	for (;;) {
 		if (ARCH_SUN4C_SUN4) {
@@ -128,9 +123,6 @@ int cpu_idle(void)
 		schedule();
 		check_pgt_cache();
 	}
-	ret = 0;
-out:
-	return ret;
 }
 
 #else

diff -Nurp 2.6.10/arch/sparc64/kernel/process.c
2.6.10-cy/arch/sparc64/kernel/process.c

arch/sparc64/kernel/process.c +1 -5
@@ -60,11 +60,8 @@ void default_idle(void)
 /*
  * the idle loop on a Sparc... ;)
  */
-int cpu_idle(void)
+void cpu_idle(void)
 {
-	if (current->pid != 0)
-		return -EPERM;
-
 	/* endless idle loop with no priority at all */
 	for (;;) {
 		/* If current->work.need_resched is zero we should really
@@ -80,7 +77,6 @@ int cpu_idle(void)
 		schedule();
 		check_pgt_cache();
 	}
-	return 0;
 }
 
 #else
Signature · 2 lines
Coywolf Qi Hunt
Homepage http://sosdg.org/~coywolf/
#4 lore raw

Re: [patch] fix sparc64 cpu_idle()

(cc: list trimmed)

arch/sparc/kernel/process.c void default_idle(void) · line 90

Quoted 5 lines · Coywolf Qi Hunt
arch/sparc/kernel/process.c +0 -5
-	int ret = -EPERM;
-
-	if (current->pid != 0)
-		goto out;
-

Maybe just a WARN_ON(current->pid != 0) would be a good compromise... I imagine that someone added the check for some reason but you're right that just returning an error code (that presumably noone checks, right?) doesn't make much sense

-Mitch

#5 lore raw

Re: [patch] fix sparc64 cpu_idle()

In reply to Coywolf Qi Hunt
Quoted 4 lines · Coywolf Qi Hunt

It's not flexible to enforce 'void cpu_idle(void)' all over. What If someday someone would want to return value for some arch.

May be you are right, but i can't imagine what could be done after return from cpu_idle() except panic(). cpu_idle() is the last call in start_kernel().

Oleg.

#6 lore raw
In reply to Oleg Nesterov

Hello,

From: Oleg Nesterov <[email protected]>
Date: Mon, 27 Dec 2004 19:51:07 +0300

Quoted 7 lines

Hello.

I am sorry, i misspelled your email in cc list.

Could you please check arch/m32r/ part?

Oleg.

I think it is OK for m32r.

BTW, you moved the definition of cpu_idle() to smp.h. It may not be included from arch/*/process.c in some archs. Is it OK?

Thank you.

-- Takata

#7 lore raw
Quoted 4 lines · Hirokazu Takata

I think it is OK for m32r.
BTW, you moved the definition of cpu_idle() to smp.h. It may not be included from arch/*/process.c in some archs. Is it OK?

It should be okay to include even on UP-only arches, IIRC it has stubs for UP versions of various locking primitives etc. used widely throughout the kernel.

-- wli

maintainer
#8 lore raw
In reply to Oleg Nesterov
Quoted 7 lines · Oleg Nesterov

cpu_idle() declared/defined in

init/main.c: void cpu_idle(void)

i386/kernel/process.c void cpu_idle(void)
i386/kernel/smpboot.c: int cpu_idle(void)
i386/mach-voyager/voyager_smp.c: int cpu_idle(void)

Patch looks good. This bit applies and compiles and boots fine on my voyager.

James