smp.c (15c42e5a1f0bccb69508059b8ae0720840068b8e) | smp.c (fb1c8f93d869b34cacb8b8932e2b83d96a19d720) |
---|---|
1/* 2 * linux/arch/alpha/kernel/smp.c 3 * 4 * 2001-07-09 Phil Ezolt (Phillip.Ezolt@compaq.com) 5 * Renamed modified smp_call_function to smp_call_function_on_cpu() 6 * Created an function that conforms to the old calling convention 7 * of smp_call_function(). 8 * --- 975 unchanged lines hidden (view full) --- 984 } 985 986 if (smp_call_function(ipi_flush_icache_page, mm, 1, 1)) { 987 printk(KERN_CRIT "flush_icache_page: timed out\n"); 988 } 989 990 preempt_enable(); 991} | 1/* 2 * linux/arch/alpha/kernel/smp.c 3 * 4 * 2001-07-09 Phil Ezolt (Phillip.Ezolt@compaq.com) 5 * Renamed modified smp_call_function to smp_call_function_on_cpu() 6 * Created an function that conforms to the old calling convention 7 * of smp_call_function(). 8 * --- 975 unchanged lines hidden (view full) --- 984 } 985 986 if (smp_call_function(ipi_flush_icache_page, mm, 1, 1)) { 987 printk(KERN_CRIT "flush_icache_page: timed out\n"); 988 } 989 990 preempt_enable(); 991} |
992 993#ifdef CONFIG_DEBUG_SPINLOCK 994void 995_raw_spin_unlock(spinlock_t * lock) 996{ 997 mb(); 998 lock->lock = 0; 999 1000 lock->on_cpu = -1; 1001 lock->previous = NULL; 1002 lock->task = NULL; 1003 lock->base_file = "none"; 1004 lock->line_no = 0; 1005} 1006 1007void 1008debug_spin_lock(spinlock_t * lock, const char *base_file, int line_no) 1009{ 1010 long tmp; 1011 long stuck; 1012 void *inline_pc = __builtin_return_address(0); 1013 unsigned long started = jiffies; 1014 int printed = 0; 1015 int cpu = smp_processor_id(); 1016 1017 stuck = 1L << 30; 1018 try_again: 1019 1020 /* Use sub-sections to put the actual loop at the end 1021 of this object file's text section so as to perfect 1022 branch prediction. */ 1023 __asm__ __volatile__( 1024 "1: ldl_l %0,%1\n" 1025 " subq %2,1,%2\n" 1026 " blbs %0,2f\n" 1027 " or %0,1,%0\n" 1028 " stl_c %0,%1\n" 1029 " beq %0,3f\n" 1030 "4: mb\n" 1031 ".subsection 2\n" 1032 "2: ldl %0,%1\n" 1033 " subq %2,1,%2\n" 1034 "3: blt %2,4b\n" 1035 " blbs %0,2b\n" 1036 " br 1b\n" 1037 ".previous" 1038 : "=r" (tmp), "=m" (lock->lock), "=r" (stuck) 1039 : "m" (lock->lock), "2" (stuck) : "memory"); 1040 1041 if (stuck < 0) { 1042 printk(KERN_WARNING 1043 "%s:%d spinlock stuck in %s at %p(%d)" 1044 " owner %s at %p(%d) %s:%d\n", 1045 base_file, line_no, 1046 current->comm, inline_pc, cpu, 1047 lock->task->comm, lock->previous, 1048 lock->on_cpu, lock->base_file, lock->line_no); 1049 stuck = 1L << 36; 1050 printed = 1; 1051 goto try_again; 1052 } 1053 1054 /* Exiting. Got the lock. */ 1055 lock->on_cpu = cpu; 1056 lock->previous = inline_pc; 1057 lock->task = current; 1058 lock->base_file = base_file; 1059 lock->line_no = line_no; 1060 1061 if (printed) { 1062 printk(KERN_WARNING 1063 "%s:%d spinlock grabbed in %s at %p(%d) %ld ticks\n", 1064 base_file, line_no, current->comm, inline_pc, 1065 cpu, jiffies - started); 1066 } 1067} 1068 1069int 1070debug_spin_trylock(spinlock_t * lock, const char *base_file, int line_no) 1071{ 1072 int ret; 1073 if ((ret = !test_and_set_bit(0, lock))) { 1074 lock->on_cpu = smp_processor_id(); 1075 lock->previous = __builtin_return_address(0); 1076 lock->task = current; 1077 } else { 1078 lock->base_file = base_file; 1079 lock->line_no = line_no; 1080 } 1081 return ret; 1082} 1083#endif /* CONFIG_DEBUG_SPINLOCK */ 1084 1085#ifdef CONFIG_DEBUG_RWLOCK 1086void _raw_write_lock(rwlock_t * lock) 1087{ 1088 long regx, regy; 1089 int stuck_lock, stuck_reader; 1090 void *inline_pc = __builtin_return_address(0); 1091 1092 try_again: 1093 1094 stuck_lock = 1<<30; 1095 stuck_reader = 1<<30; 1096 1097 __asm__ __volatile__( 1098 "1: ldl_l %1,%0\n" 1099 " blbs %1,6f\n" 1100 " blt %1,8f\n" 1101 " mov 1,%1\n" 1102 " stl_c %1,%0\n" 1103 " beq %1,6f\n" 1104 "4: mb\n" 1105 ".subsection 2\n" 1106 "6: blt %3,4b # debug\n" 1107 " subl %3,1,%3 # debug\n" 1108 " ldl %1,%0\n" 1109 " blbs %1,6b\n" 1110 "8: blt %4,4b # debug\n" 1111 " subl %4,1,%4 # debug\n" 1112 " ldl %1,%0\n" 1113 " blt %1,8b\n" 1114 " br 1b\n" 1115 ".previous" 1116 : "=m" (*(volatile int *)lock), "=&r" (regx), "=&r" (regy), 1117 "=&r" (stuck_lock), "=&r" (stuck_reader) 1118 : "m" (*(volatile int *)lock), "3" (stuck_lock), "4" (stuck_reader) : "memory"); 1119 1120 if (stuck_lock < 0) { 1121 printk(KERN_WARNING "write_lock stuck at %p\n", inline_pc); 1122 goto try_again; 1123 } 1124 if (stuck_reader < 0) { 1125 printk(KERN_WARNING "write_lock stuck on readers at %p\n", 1126 inline_pc); 1127 goto try_again; 1128 } 1129} 1130 1131void _raw_read_lock(rwlock_t * lock) 1132{ 1133 long regx; 1134 int stuck_lock; 1135 void *inline_pc = __builtin_return_address(0); 1136 1137 try_again: 1138 1139 stuck_lock = 1<<30; 1140 1141 __asm__ __volatile__( 1142 "1: ldl_l %1,%0;" 1143 " blbs %1,6f;" 1144 " subl %1,2,%1;" 1145 " stl_c %1,%0;" 1146 " beq %1,6f;" 1147 "4: mb\n" 1148 ".subsection 2\n" 1149 "6: ldl %1,%0;" 1150 " blt %2,4b # debug\n" 1151 " subl %2,1,%2 # debug\n" 1152 " blbs %1,6b;" 1153 " br 1b\n" 1154 ".previous" 1155 : "=m" (*(volatile int *)lock), "=&r" (regx), "=&r" (stuck_lock) 1156 : "m" (*(volatile int *)lock), "2" (stuck_lock) : "memory"); 1157 1158 if (stuck_lock < 0) { 1159 printk(KERN_WARNING "read_lock stuck at %p\n", inline_pc); 1160 goto try_again; 1161 } 1162} 1163#endif /* CONFIG_DEBUG_RWLOCK */ | |