Some hcall stats fixes
PATCH 1/1 Some hcall stats fixes
There were a few issues with the HCALL_STATS code:
- PURR cpu feature checks were backwards
- We iterated one entry off the end of the hcall_stats array
- Remove dead update_hcall_stats() function prototype
I noticed one thing while debugging, and that is we call H_ENTER (to set up the MMU hashtable in early init) before we have done the cpu fixups. This means we will execute the PURR SPR reads even on a CPU that isnt capable of it. I wonder if we can move the CPU feature fixups earlier.
Signed-off-by Anton Blanchard <[email protected]>
---
arch/powerpc/platforms/pseries/hvCall.S +3 -3
@@ -26,7 +26,7 @@ BEGIN_FTR_SECTION; \ mfspr r0,SPRN_PURR; /* get PURR and */ \ std r0,STK_PARM(r6)(r1); /* save for later */ \ -END_FTR_SECTION_IFCLR(CPU_FTR_PURR); +END_FTR_SECTION_IFSET(CPU_FTR_PURR); /* * postcall is performed immediately before function return which
@@ -43,7 +43,7 @@ mfspr r8,SPRN_PURR; /* PURR after */ \ ld r6,STK_PARM(r6)(r1); /* PURR before */ \ subf r6,r6,r8; /* delta */ \ -END_FTR_SECTION_IFCLR(CPU_FTR_PURR); \ +END_FTR_SECTION_IFSET(CPU_FTR_PURR); \ ld r5,STK_PARM(r5)(r1); /* timebase before */ \ subf r5,r5,r7; /* time delta */ \ \
@@ -66,7 +66,7 @@ ld r7,HCALL_STAT_PURR(r4); /* PURR */ \ add r7,r7,r6; \ std r7,HCALL_STAT_PURR(r4); \ -END_FTR_SECTION_IFCLR(CPU_FTR_PURR); \ +END_FTR_SECTION_IFSET(CPU_FTR_PURR); \ 1: #else #define HCALL_INST_PRECALL
arch/powerpc/platforms/pseries/hvCall_inst.c +2 -2
@@ -34,7 +34,7 @@*/ static void *hc_start (struct seq_file *m,loff_t *pos) { -if ((int )*pos <HCALL_STAT_ARRAY_SIZE ) +if ((int )*pos < (HCALL_STAT_ARRAY_SIZE -1 ))return (void *)(unsigned long )(*pos +1 );return NULL ;
@@ -57,7 +57,7 @@struct hcall_stats *hs = (struct hcall_stats *)m->private;if (hs[h_num].num_calls) { -if (!cpu_has_feature (CPU_FTR_PURR )) +if (cpu_has_feature (CPU_FTR_PURR )) seq_printf(m, "%lu %lu %lu %lu\n", h_num<<2, hs[h_num].num_calls, hs[h_num].tb_total,
include/asm-powerpc/hvcall.h +0 -2
@@ -252,8 +252,6 @@unsigned long tb_total;/* total wall time (mftb) of calls. */ unsigned long purr_total; /* total cpu time (PURR) of calls. */ }; -void update_hcall_stats (unsigned long opcode,unsigned long tb_delta, -unsigned long purr_delta);#define HCALL_STAT_ARRAY_SIZE ((MAX_HCALL_OPCODE >> 2) + 1)#endif /* __ASSEMBLY__ */