aboutsummaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
Diffstat (limited to 'arch')
-rw-r--r--arch/ppc64/kernel/ItLpQueue.c44
1 files changed, 29 insertions, 15 deletions
diff --git a/arch/ppc64/kernel/ItLpQueue.c b/arch/ppc64/kernel/ItLpQueue.c
index a849f6775ad6..4a6ab9de629d 100644
--- a/arch/ppc64/kernel/ItLpQueue.c
+++ b/arch/ppc64/kernel/ItLpQueue.c
@@ -28,7 +28,9 @@
28 */ 28 */
29struct hvlpevent_queue hvlpevent_queue __attribute__((__section__(".data"))); 29struct hvlpevent_queue hvlpevent_queue __attribute__((__section__(".data")));
30 30
31static char *event_types[9] = { 31DEFINE_PER_CPU(unsigned long[HvLpEvent_Type_NumTypes], hvlpevent_counts);
32
33static char *event_types[HvLpEvent_Type_NumTypes] = {
32 "Hypervisor\t\t", 34 "Hypervisor\t\t",
33 "Machine Facilities\t", 35 "Machine Facilities\t",
34 "Session Manager\t", 36 "Session Manager\t",
@@ -129,7 +131,6 @@ static void hvlpevent_clear_valid( struct HvLpEvent * event )
129 131
130void process_hvlpevents(struct pt_regs *regs) 132void process_hvlpevents(struct pt_regs *regs)
131{ 133{
132 unsigned numIntsProcessed = 0;
133 struct HvLpEvent * nextLpEvent; 134 struct HvLpEvent * nextLpEvent;
134 135
135 /* If we have recursed, just return */ 136 /* If we have recursed, just return */
@@ -144,8 +145,6 @@ void process_hvlpevents(struct pt_regs *regs)
144 for (;;) { 145 for (;;) {
145 nextLpEvent = get_next_hvlpevent(); 146 nextLpEvent = get_next_hvlpevent();
146 if ( nextLpEvent ) { 147 if ( nextLpEvent ) {
147 ++numIntsProcessed;
148 hvlpevent_queue.xLpIntCount++;
149 /* Call appropriate handler here, passing 148 /* Call appropriate handler here, passing
150 * a pointer to the LpEvent. The handler 149 * a pointer to the LpEvent. The handler
151 * must make a copy of the LpEvent if it 150 * must make a copy of the LpEvent if it
@@ -160,7 +159,7 @@ void process_hvlpevents(struct pt_regs *regs)
160 * here! 159 * here!
161 */ 160 */
162 if ( nextLpEvent->xType < HvLpEvent_Type_NumTypes ) 161 if ( nextLpEvent->xType < HvLpEvent_Type_NumTypes )
163 hvlpevent_queue.xLpIntCountByType[nextLpEvent->xType]++; 162 __get_cpu_var(hvlpevent_counts)[nextLpEvent->xType]++;
164 if ( nextLpEvent->xType < HvLpEvent_Type_NumTypes && 163 if ( nextLpEvent->xType < HvLpEvent_Type_NumTypes &&
165 lpEventHandler[nextLpEvent->xType] ) 164 lpEventHandler[nextLpEvent->xType] )
166 lpEventHandler[nextLpEvent->xType](nextLpEvent, regs); 165 lpEventHandler[nextLpEvent->xType](nextLpEvent, regs);
@@ -181,8 +180,6 @@ void process_hvlpevents(struct pt_regs *regs)
181 ItLpQueueInProcess = 0; 180 ItLpQueueInProcess = 0;
182 mb(); 181 mb();
183 clear_inUse(); 182 clear_inUse();
184
185 get_paca()->lpevent_count += numIntsProcessed;
186} 183}
187 184
188static int set_spread_lpevents(char *str) 185static int set_spread_lpevents(char *str)
@@ -228,20 +225,37 @@ void setup_hvlpevent_queue(void)
228 225
229static int proc_lpevents_show(struct seq_file *m, void *v) 226static int proc_lpevents_show(struct seq_file *m, void *v)
230{ 227{
231 unsigned int i; 228 int cpu, i;
229 unsigned long sum;
230 static unsigned long cpu_totals[NR_CPUS];
231
232 /* FIXME: do we care that there's no locking here? */
233 sum = 0;
234 for_each_online_cpu(cpu) {
235 cpu_totals[cpu] = 0;
236 for (i = 0; i < HvLpEvent_Type_NumTypes; i++) {
237 cpu_totals[cpu] += per_cpu(hvlpevent_counts, cpu)[i];
238 }
239 sum += cpu_totals[cpu];
240 }
232 241
233 seq_printf(m, "LpEventQueue 0\n"); 242 seq_printf(m, "LpEventQueue 0\n");
234 seq_printf(m, " events processed:\t%lu\n", 243 seq_printf(m, " events processed:\t%lu\n", sum);
235 (unsigned long)hvlpevent_queue.xLpIntCount);
236 244
237 for (i = 0; i < 9; ++i) 245 for (i = 0; i < HvLpEvent_Type_NumTypes; ++i) {
238 seq_printf(m, " %s %10lu\n", event_types[i], 246 sum = 0;
239 (unsigned long)hvlpevent_queue.xLpIntCountByType[i]); 247 for_each_online_cpu(cpu) {
248 sum += per_cpu(hvlpevent_counts, cpu)[i];
249 }
250
251 seq_printf(m, " %s %10lu\n", event_types[i], sum);
252 }
240 253
241 seq_printf(m, "\n events processed by processor:\n"); 254 seq_printf(m, "\n events processed by processor:\n");
242 255
243 for_each_online_cpu(i) 256 for_each_online_cpu(cpu) {
244 seq_printf(m, " CPU%02d %10u\n", i, paca[i].lpevent_count); 257 seq_printf(m, " CPU%02d %10lu\n", cpu, cpu_totals[cpu]);
258 }
245 259
246 return 0; 260 return 0;
247} 261}