| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * Provide a default dump_stack() function for architectures | 
					
						
							|  |  |  |  * which don't implement their own. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <linux/kernel.h>
 | 
					
						
							| 
									
										
										
										
											2011-11-16 21:29:17 -05:00
										 |  |  | #include <linux/export.h>
 | 
					
						
							| 
									
										
										
										
											2013-04-30 15:27:12 -07:00
										 |  |  | #include <linux/sched.h>
 | 
					
						
							| 
									
										
										
										
											2013-07-03 15:04:59 -07:00
										 |  |  | #include <linux/smp.h>
 | 
					
						
							|  |  |  | #include <linux/atomic.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void __dump_stack(void) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	dump_stack_print_info(KERN_DEFAULT); | 
					
						
							|  |  |  | 	show_stack(NULL, NULL); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-04-30 15:27:12 -07:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * dump_stack - dump the current task information and its stack trace | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Architectures can override this implementation by implementing its own. | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2013-07-03 15:04:59 -07:00
										 |  |  | #ifdef CONFIG_SMP
 | 
					
						
							|  |  |  | static atomic_t dump_lock = ATOMIC_INIT(-1); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-02 00:44:38 +02:00
										 |  |  | asmlinkage __visible void dump_stack(void) | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2013-07-03 15:04:59 -07:00
										 |  |  | 	int was_locked; | 
					
						
							|  |  |  | 	int old; | 
					
						
							|  |  |  | 	int cpu; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/*
 | 
					
						
							|  |  |  | 	 * Permit this cpu to perform nested stack dumps while serialising | 
					
						
							|  |  |  | 	 * against other CPUs | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	preempt_disable(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | retry: | 
					
						
							|  |  |  | 	cpu = smp_processor_id(); | 
					
						
							|  |  |  | 	old = atomic_cmpxchg(&dump_lock, -1, cpu); | 
					
						
							|  |  |  | 	if (old == -1) { | 
					
						
							|  |  |  | 		was_locked = 0; | 
					
						
							|  |  |  | 	} else if (old == cpu) { | 
					
						
							|  |  |  | 		was_locked = 1; | 
					
						
							|  |  |  | 	} else { | 
					
						
							|  |  |  | 		cpu_relax(); | 
					
						
							|  |  |  | 		goto retry; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	__dump_stack(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (!was_locked) | 
					
						
							|  |  |  | 		atomic_set(&dump_lock, -1); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	preempt_enable(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | #else
 | 
					
						
							| 
									
										
										
										
											2014-05-02 00:44:38 +02:00
										 |  |  | asmlinkage __visible void dump_stack(void) | 
					
						
							| 
									
										
										
										
											2013-07-03 15:04:59 -07:00
										 |  |  | { | 
					
						
							|  |  |  | 	__dump_stack(); | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2013-07-03 15:04:59 -07:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | EXPORT_SYMBOL(dump_stack); |