diff options
Diffstat (limited to 'arch/ia64/kernel/process.c')
| -rw-r--r-- | arch/ia64/kernel/process.c | 90 | 
1 files changed, 18 insertions, 72 deletions
diff --git a/arch/ia64/kernel/process.c b/arch/ia64/kernel/process.c index 6f7dc8b7b35..55d4ba47a90 100644 --- a/arch/ia64/kernel/process.c +++ b/arch/ia64/kernel/process.c @@ -96,21 +96,13 @@ show_stack (struct task_struct *task, unsigned long *sp)  }  void -dump_stack (void) -{ -	show_stack(NULL, NULL); -} - -EXPORT_SYMBOL(dump_stack); - -void  show_regs (struct pt_regs *regs)  {  	unsigned long ip = regs->cr_iip + ia64_psr(regs)->ri;  	print_modules(); -	printk("\nPid: %d, CPU %d, comm: %20s\n", task_pid_nr(current), -			smp_processor_id(), current->comm); +	printk("\n"); +	show_regs_print_info(KERN_DEFAULT);  	printk("psr : %016lx ifs : %016lx ip  : [<%016lx>]    %s (%s)\n",  	       regs->cr_ipsr, regs->cr_ifs, ip, print_tainted(),  	       init_utsname()->release); @@ -209,41 +201,13 @@ do_notify_resume_user(sigset_t *unused, struct sigscratch *scr, long in_syscall)  	local_irq_disable();	/* force interrupt disable */  } -static int pal_halt        = 1; -static int can_do_pal_halt = 1; -  static int __init nohalt_setup(char * str)  { -	pal_halt = can_do_pal_halt = 0; +	cpu_idle_poll_ctrl(true);  	return 1;  }  __setup("nohalt", nohalt_setup); -void -update_pal_halt_status(int status) -{ -	can_do_pal_halt = pal_halt && status; -} - -/* - * We use this if we don't have any better idle routine.. - */ -void -default_idle (void) -{ -	local_irq_enable(); -	while (!need_resched()) { -		if (can_do_pal_halt) { -			local_irq_disable(); -			if (!need_resched()) { -				safe_halt(); -			} -			local_irq_enable(); -		} else -			cpu_relax(); -	} -} -  #ifdef CONFIG_HOTPLUG_CPU  /* We don't actually take CPU down, just spin without interrupts. */  static inline void play_dead(void) @@ -270,47 +234,29 @@ static inline void play_dead(void)  }  #endif /* CONFIG_HOTPLUG_CPU */ -void __attribute__((noreturn)) -cpu_idle (void) +void arch_cpu_idle_dead(void)  { -	void (*mark_idle)(int) = ia64_mark_idle; -  	int cpu = smp_processor_id(); +	play_dead(); +} -	/* endless idle loop with no priority at all */ -	while (1) { -		rcu_idle_enter(); -		if (can_do_pal_halt) { -			current_thread_info()->status &= ~TS_POLLING; -			/* -			 * TS_POLLING-cleared state must be visible before we -			 * test NEED_RESCHED: -			 */ -			smp_mb(); -		} else { -			current_thread_info()->status |= TS_POLLING; -		} +void arch_cpu_idle(void) +{ +	void (*mark_idle)(int) = ia64_mark_idle; -		if (!need_resched()) {  #ifdef CONFIG_SMP -			min_xtp(); +	min_xtp();  #endif -			rmb(); -			if (mark_idle) -				(*mark_idle)(1); +	rmb(); +	if (mark_idle) +		(*mark_idle)(1); -			default_idle(); -			if (mark_idle) -				(*mark_idle)(0); +	safe_halt(); + +	if (mark_idle) +		(*mark_idle)(0);  #ifdef CONFIG_SMP -			normal_xtp(); +	normal_xtp();  #endif -		} -		rcu_idle_exit(); -		schedule_preempt_disabled(); -		check_pgt_cache(); -		if (cpu_is_offline(cpu)) -			play_dead(); -	}  }  void  |