# HG changeset patch # User gingold@virtu10 # Node ID b23585cd4e700890930f7b5b1eeeaecc00a79bcb # Parent 6c4b7669876b707b5eccf2ad99be6681f5b52366 Convert most privop stats to perfc. Signed-off-by: Tristan Gingold diff -r 6c4b7669876b -r b23585cd4e70 xen/arch/ia64/asm-offsets.c --- a/xen/arch/ia64/asm-offsets.c Fri Aug 04 11:51:09 2006 +0200 +++ b/xen/arch/ia64/asm-offsets.c Fri Aug 04 12:14:16 2006 +0200 @@ -215,5 +215,7 @@ void foo(void) BLANK(); DEFINE(RECOVER_TO_PAGE_FAULT_PERFC_OFS, offsetof (struct perfcounter, recover_to_page_fault)); DEFINE(RECOVER_TO_BREAK_FAULT_PERFC_OFS, offsetof (struct perfcounter, recover_to_break_fault)); + DEFINE(FAST_HYPERPRIVOP_PERFC_OFS, offsetof (struct perfcounter, fast_hyperprivop)); + DEFINE(FAST_REFLECT_PERFC_OFS, offsetof (struct perfcounter, fast_reflect)); #endif } diff -r 6c4b7669876b -r b23585cd4e70 xen/arch/ia64/xen/domain.c --- a/xen/arch/ia64/xen/domain.c Fri Aug 04 11:51:09 2006 +0200 +++ b/xen/arch/ia64/xen/domain.c Fri Aug 04 12:14:16 2006 +0200 @@ -136,7 +136,6 @@ void context_switch(struct vcpu *prev, s uint64_t pta; local_irq_save(spsr); - perfc_incrc(context_switch); __ia64_save_fpu(prev->arch._thread.fph); __ia64_load_fpu(next->arch._thread.fph); diff -r 6c4b7669876b -r b23585cd4e70 xen/arch/ia64/xen/faults.c --- a/xen/arch/ia64/xen/faults.c Fri Aug 04 11:51:09 2006 +0200 +++ b/xen/arch/ia64/xen/faults.c Fri Aug 04 12:14:16 2006 +0200 @@ -51,8 +51,6 @@ extern IA64FAULT ia64_hypercall(struct p extern void do_ssc(unsigned long ssc, struct pt_regs *regs); -#define inc_slow_reflect_count(vec) slow_reflect_count[vec>>8]++; - // should never panic domain... if it does, stack may have been overrun void check_bad_nested_interruption(unsigned long isr, struct pt_regs *regs, unsigned long vector) { @@ -92,7 +90,7 @@ void reflect_interruption(unsigned long v->vcpu_info->evtchn_upcall_mask = 1; PSCB(v,interrupt_collection_enabled) = 0; - inc_slow_reflect_count(vector); + perfc_incra(slow_reflect,vector>>8); } static unsigned long pending_false_positive = 0; @@ -247,7 +245,7 @@ void ia64_do_page_fault (unsigned long a regs->cr_ipsr = (regs->cr_ipsr & ~DELIVER_PSR_CLR) | DELIVER_PSR_SET; // NOTE: nested trap must NOT pass PSCB address //regs->r31 = (unsigned long) &PSCB(current); - inc_slow_reflect_count(fault); + perfc_incra(slow_reflect,fault>>8); return; } diff -r 6c4b7669876b -r b23585cd4e70 xen/arch/ia64/xen/hyperprivop.S --- a/xen/arch/ia64/xen/hyperprivop.S Fri Aug 04 11:51:09 2006 +0200 +++ b/xen/arch/ia64/xen/hyperprivop.S Fri Aug 04 12:14:16 2006 +0200 @@ -22,34 +22,39 @@ #define _PAGE_PL_2 (2<<7) #if 1 // change to 0 to turn off all fast paths -#define FAST_HYPERPRIVOPS -#define FAST_HYPERPRIVOP_CNT -#define FAST_REFLECT_CNT +# define FAST_HYPERPRIVOPS +# ifdef PERF_COUNTERS +# define FAST_HYPERPRIVOP_CNT +# define FAST_HYPERPRIVOP_PERFC(N) \ + (perfcounters+FAST_HYPERPRIVOP_PERFC_OFS+(4*N)) +# define FAST_REFLECT_CNT +# endif + //#define FAST_TICK // mostly working (unat problems) but default off for now //#define FAST_TLB_MISS_REFLECT // mostly working but default off for now -#ifdef CONFIG_XEN_IA64_DOM0_VP -#undef FAST_ITC //XXX CONFIG_XEN_IA64_DOM0_VP +# ifdef CONFIG_XEN_IA64_DOM0_VP +# undef FAST_ITC //XXX CONFIG_XEN_IA64_DOM0_VP // TODO fast_itc doesn't suport dom0 vp yet. -#else -//#define FAST_ITC // to be reviewed -#endif -#define FAST_BREAK -#ifndef CONFIG_XEN_IA64_DOM0_VP -# define FAST_ACCESS_REFLECT -#else -# undef FAST_ACCESS_REFLECT //XXX CONFIG_XEN_IA64_DOM0_VP +# else +//# define FAST_ITC // to be reviewed +# endif +# define FAST_BREAK +# ifndef CONFIG_XEN_IA64_DOM0_VP +# define FAST_ACCESS_REFLECT +# else +# undef FAST_ACCESS_REFLECT //XXX CONFIG_XEN_IA64_DOM0_VP // TODO fast_access_reflect // doesn't support dom0 vp yet. -#endif -#define FAST_RFI -#define FAST_SSM_I -#define FAST_PTC_GA -#undef RFI_TO_INTERRUPT // not working yet +# endif +# define FAST_RFI +# define FAST_SSM_I +# define FAST_PTC_GA +# undef RFI_TO_INTERRUPT // not working yet #endif #ifdef CONFIG_SMP -//#warning "FIXME: ptc.ga instruction requires spinlock for SMP" -#undef FAST_PTC_GA + //#warning "FIXME: ptc.ga instruction requires spinlock for SMP" + #undef FAST_PTC_GA #endif // FIXME: turn off for now... but NaTs may crash Xen so re-enable soon! @@ -237,10 +242,10 @@ ENTRY(hyper_ssm_i) cmp.ne p7,p0=r21,r0 (p7) br.sptk.many dispatch_break_fault ;; #ifdef FAST_HYPERPRIVOP_CNT - movl r20=fast_hyperpriv_cnt+(8*HYPERPRIVOP_SSM_I);; - ld8 r21=[r20];; + movl r20=FAST_HYPERPRIVOP_PERFC(HYPERPRIVOP_SSM_I);; + ld4 r21=[r20];; adds r21=1,r21;; - st8 [r20]=r21;; + st4 [r20]=r21;; #endif // set shared_mem iip to instruction after HYPER_SSM_I extr.u r20=r30,41,2 ;; @@ -373,10 +378,10 @@ GLOBAL_ENTRY(fast_tick_reflect) mov rp=r29;; mov cr.itm=r26;; // ensure next tick #ifdef FAST_REFLECT_CNT - movl r20=fast_reflect_count+((0x3000>>8)*8);; - ld8 r21=[r20];; + movl r20=perfcounters+FAST_REFLECT_PERFC_OFS+((0x3000>>8)*4);; + ld4 r21=[r20];; adds r21=1,r21;; - st8 [r20]=r21;; + st4 [r20]=r21;; #endif // vcpu_pend_timer(current) movl r18=THIS_CPU(current_psr_ic_addr) @@ -611,12 +616,12 @@ END(fast_break_reflect) // r31 == pr ENTRY(fast_reflect) #ifdef FAST_REFLECT_CNT - movl r22=fast_reflect_count; - shr r23=r20,5;; + movl r22=perfcounters+FAST_REFLECT_PERFC_OFS; + shr r23=r20,8-2;; add r22=r22,r23;; - ld8 r21=[r22];; + ld4 r21=[r22];; adds r21=1,r21;; - st8 [r22]=r21;; + st4 [r22]=r21;; #endif // save iip in shared_info (DON'T POINT TO NEXT INSTRUCTION!) adds r21=XSI_IIP_OFS-XSI_PSR_IC_OFS,r18 ;; @@ -948,10 +953,10 @@ 1: // check the guest VHPT (p7) br.cond.spnt.few page_not_present;; #ifdef FAST_REFLECT_CNT - movl r21=fast_vhpt_translate_count;; - ld8 r22=[r21];; + movl r21=perfcounter+FAST_VHPT_TRANSLATE_PERFC_OFS;; + ld4 r22=[r21];; adds r22=1,r22;; - st8 [r21]=r22;; + st4 [r21]=r22;; #endif // prepare for fast_insert(PSCB(ifa),PSCB(itir),r16=pte) @@ -979,9 +984,9 @@ ENTRY(recover_and_page_fault) ENTRY(recover_and_page_fault) #ifdef PERF_COUNTERS movl r21=perfcounters + RECOVER_TO_PAGE_FAULT_PERFC_OFS;; - ld8 r22=[r21];; + ld4 r22=[r21];; adds r22=1,r22;; - st8 [r21]=r22;; + st4 [r21]=r22;; #endif mov b0=r29;; br.cond.sptk.many page_fault;; @@ -1083,10 +1088,10 @@ 1: 1: // OK now, let's do an rfi. #ifdef FAST_HYPERPRIVOP_CNT - movl r20=fast_hyperpriv_cnt+(8*HYPERPRIVOP_RFI);; - ld8 r23=[r20];; + movl r20=FAST_HYPERPRIVOP_PERFC(HYPERPRIVOP_RFI);; + ld4 r23=[r20];; adds r23=1,r23;; - st8 [r20]=r23;; + st4 [r20]=r23;; #endif #ifdef RFI_TO_INTERRUPT // maybe do an immediate interrupt delivery? @@ -1339,10 +1344,10 @@ END(rfi_with_interrupt) ENTRY(hyper_cover) #ifdef FAST_HYPERPRIVOP_CNT - movl r20=fast_hyperpriv_cnt+(8*HYPERPRIVOP_COVER);; - ld8 r21=[r20];; + movl r20=FAST_HYPERPRIVOP_PERFC(HYPERPRIVOP_COVER);; + ld4 r21=[r20];; adds r21=1,r21;; - st8 [r20]=r21;; + st4 [r20]=r21;; #endif mov r24=cr.ipsr mov r25=cr.iip;; @@ -1375,10 +1380,10 @@ END(hyper_cover) // return from metaphysical mode (meta=1) to virtual mode (meta=0) ENTRY(hyper_ssm_dt) #ifdef FAST_HYPERPRIVOP_CNT - movl r20=fast_hyperpriv_cnt+(8*HYPERPRIVOP_SSM_DT);; - ld8 r21=[r20];; + movl r20=FAST_HYPERPRIVOP_PERFC(HYPERPRIVOP_SSM_DT);; + ld4 r21=[r20];; adds r21=1,r21;; - st8 [r20]=r21;; + st4 [r20]=r21;; #endif mov r24=cr.ipsr mov r25=cr.iip;; @@ -1412,10 +1417,10 @@ END(hyper_ssm_dt) // go to metaphysical mode (meta=1) from virtual mode (meta=0) ENTRY(hyper_rsm_dt) #ifdef FAST_HYPERPRIVOP_CNT - movl r20=fast_hyperpriv_cnt+(8*HYPERPRIVOP_RSM_DT);; - ld8 r21=[r20];; + movl r20=FAST_HYPERPRIVOP_PERFC(HYPERPRIVOP_RSM_DT);; + ld4 r21=[r20];; adds r21=1,r21;; - st8 [r20]=r21;; + st4 [r20]=r21;; #endif mov r24=cr.ipsr mov r25=cr.iip;; @@ -1449,10 +1454,10 @@ END(hyper_rsm_dt) ENTRY(hyper_get_tpr) #ifdef FAST_HYPERPRIVOP_CNT - movl r20=fast_hyperpriv_cnt+(8*HYPERPRIVOP_GET_TPR);; - ld8 r21=[r20];; + movl r20=FAST_HYPERPRIVOP_PERFC(HYPERPRIVOP_GET_TPR);; + ld4 r21=[r20];; adds r21=1,r21;; - st8 [r20]=r21;; + st4 [r20]=r21;; #endif mov r24=cr.ipsr mov r25=cr.iip;; @@ -1478,10 +1483,10 @@ END(hyper_get_tpr) // (or accidentally missing) delivering an interrupt ENTRY(hyper_set_tpr) #ifdef FAST_HYPERPRIVOP_CNT - movl r20=fast_hyperpriv_cnt+(8*HYPERPRIVOP_SET_TPR);; - ld8 r21=[r20];; + movl r20=FAST_HYPERPRIVOP_PERFC(HYPERPRIVOP_SET_TPR);; + ld4 r21=[r20];; adds r21=1,r21;; - st8 [r20]=r21;; + st4 [r20]=r21;; #endif mov r24=cr.ipsr mov r25=cr.iip;; @@ -1506,10 +1511,10 @@ END(hyper_set_tpr) ENTRY(hyper_get_ivr) #ifdef FAST_HYPERPRIVOP_CNT - movl r22=fast_hyperpriv_cnt+(8*HYPERPRIVOP_GET_IVR);; - ld8 r21=[r22];; + movl r22=FAST_HYPERPRIVOP_PERFC(HYPERPRIVOP_GET_IVR);; + ld4 r21=[r22];; adds r21=1,r21;; - st8 [r22]=r21;; + st4 [r22]=r21;; #endif mov r8=15;; // when we get to here r20=~=interrupts pending @@ -1618,10 +1623,10 @@ ENTRY(hyper_eoi) cmp.ne p7,p0=r20,r0 (p7) br.spnt.many dispatch_break_fault ;; #ifdef FAST_HYPERPRIVOP_CNT - movl r20=fast_hyperpriv_cnt+(8*HYPERPRIVOP_EOI);; - ld8 r21=[r20];; + movl r20=FAST_HYPERPRIVOP_PERFC(HYPERPRIVOP_EOI);; + ld4 r21=[r20];; adds r21=1,r21;; - st8 [r20]=r21;; + st4 [r20]=r21;; #endif movl r22=THIS_CPU(cpu_kr)+IA64_KR_CURRENT_OFFSET;; ld8 r22=[r22];; @@ -1682,10 +1687,10 @@ ENTRY(hyper_set_itm) cmp.ne p7,p0=r20,r0 (p7) br.spnt.many dispatch_break_fault ;; #ifdef FAST_HYPERPRIVOP_CNT - movl r20=fast_hyperpriv_cnt+(8*HYPERPRIVOP_SET_ITM);; - ld8 r21=[r20];; + movl r20=FAST_HYPERPRIVOP_PERFC(HYPERPRIVOP_SET_ITM);; + ld4 r21=[r20];; adds r21=1,r21;; - st8 [r20]=r21;; + st4 [r20]=r21;; #endif movl r20=THIS_CPU(cpu_info)+IA64_CPUINFO_ITM_NEXT_OFFSET;; ld8 r21=[r20];; @@ -1723,10 +1728,10 @@ END(hyper_set_itm) ENTRY(hyper_get_rr) #ifdef FAST_HYPERPRIVOP_CNT - movl r20=fast_hyperpriv_cnt+(8*HYPERPRIVOP_GET_RR);; - ld8 r21=[r20];; + movl r20=FAST_HYPERPRIVOP_PERFC(HYPERPRIVOP_GET_RR);; + ld4 r21=[r20];; adds r21=1,r21;; - st8 [r20]=r21;; + st4 [r20]=r21;; #endif extr.u r25=r8,61,3;; adds r20=XSI_RR0_OFS-XSI_PSR_IC_OFS,r18 ;; @@ -1755,10 +1760,10 @@ ENTRY(hyper_set_rr) cmp.leu p7,p0=7,r25 // punt on setting rr7 (p7) br.spnt.many dispatch_break_fault ;; #ifdef FAST_HYPERPRIVOP_CNT - movl r20=fast_hyperpriv_cnt+(8*HYPERPRIVOP_SET_RR);; - ld8 r21=[r20];; + movl r20=FAST_HYPERPRIVOP_PERFC(HYPERPRIVOP_SET_RR);; + ld4 r21=[r20];; adds r21=1,r21;; - st8 [r20]=r21;; + st4 [r20]=r21;; #endif extr.u r26=r9,8,24 // r26 = r9.rid movl r20=THIS_CPU(cpu_kr)+IA64_KR_CURRENT_OFFSET;; @@ -1813,10 +1818,10 @@ ENTRY(hyper_set_kr) cmp.ne p7,p0=r0,r25 // if kr# > 7, go slow way (p7) br.spnt.many dispatch_break_fault ;; #ifdef FAST_HYPERPRIVOP_CNT - movl r20=fast_hyperpriv_cnt+(8*HYPERPRIVOP_SET_KR);; - ld8 r21=[r20];; + movl r20=FAST_HYPERPRIVOP_PERFC(HYPERPRIVOP_SET_KR);; + ld4 r21=[r20];; adds r21=1,r21;; - st8 [r20]=r21;; + st4 [r20]=r21;; #endif adds r21=XSI_KR0_OFS-XSI_PSR_IC_OFS,r18 ;; shl r20=r8,3;; @@ -1871,10 +1876,10 @@ END(hyper_set_kr) // r31 == pr ENTRY(hyper_thash) #ifdef FAST_HYPERPRIVOP_CNT - movl r20=fast_hyperpriv_cnt+(8*HYPERPRIVOP_THASH);; - ld8 r21=[r20];; + movl r20=FAST_HYPERPRIVOP_PERFC(HYPERPRIVOP_THASH);; + ld4 r21=[r20];; adds r21=1,r21;; - st8 [r20]=r21;; + st4 [r20]=r21;; #endif shr.u r20 = r8, 61 addl r25 = 1, r0 @@ -1940,10 +1945,10 @@ ENTRY(hyper_ptc_ga) #endif // FIXME: validate not flushing Xen addresses #ifdef FAST_HYPERPRIVOP_CNT - movl r20=fast_hyperpriv_cnt+(8*HYPERPRIVOP_PTC_GA);; - ld8 r21=[r20];; + movl r20=FAST_HYPERPRIVOP_PERFC(HYPERPRIVOP_PTC_GA);; + ld4 r21=[r20];; adds r21=1,r21;; - st8 [r20]=r21;; + st4 [r20]=r21;; #endif mov r28=r8 extr.u r19=r9,2,6 // addr_range=1<<((r9&0xfc)>>2) @@ -2011,9 +2016,9 @@ ENTRY(recover_and_dispatch_break_fault) ENTRY(recover_and_dispatch_break_fault) #ifdef PERF_COUNTERS movl r21=perfcounters + RECOVER_TO_BREAK_FAULT_PERFC_OFS;; - ld8 r22=[r21];; + ld4 r22=[r21];; adds r22=1,r22;; - st8 [r21]=r22;; + st4 [r21]=r22;; #endif mov b0=r29 ;; br.sptk.many dispatch_break_fault;; @@ -2054,11 +2059,11 @@ hyper_itc_d: (p7) br.spnt.many dispatch_break_fault ;; #ifdef FAST_HYPERPRIVOP_CNT cmp.eq p6,p7=HYPERPRIVOP_ITC_D,r17;; -(p6) movl r20=fast_hyperpriv_cnt+(8*HYPERPRIVOP_ITC_D);; -(p7) movl r20=fast_hyperpriv_cnt+(8*HYPERPRIVOP_ITC_I);; - ld8 r21=[r20];; +(p6) movl r20=FAST_HYPERPRIVOP_PERFC(HYPERPRIVOP_ITC_D);; +(p7) movl r20=FAST_HYPERPRIVOP_PERFC(HYPERPRIVOP_ITC_I);; + ld4 r21=[r20];; adds r21=1,r21;; - st8 [r20]=r21;; + st4 [r20]=r21;; #endif (p6) mov r17=2;; (p7) mov r17=3;; diff -r 6c4b7669876b -r b23585cd4e70 xen/arch/ia64/xen/privop.c --- a/xen/arch/ia64/xen/privop.c Fri Aug 04 11:51:09 2006 +0200 +++ b/xen/arch/ia64/xen/privop.c Fri Aug 04 12:14:16 2006 +0200 @@ -275,7 +275,7 @@ static IA64FAULT priv_mov_to_cr(VCPU *vc static IA64FAULT priv_mov_to_cr(VCPU *vcpu, INST64 inst) { UINT64 val = vcpu_get_gr(vcpu, inst.M32.r2); - privcnt.to_cr_cnt[inst.M32.cr3]++; + perfc_incra(mov_to_cr,inst.M32.cr3); switch (inst.M32.cr3) { case 0: return vcpu_set_dcr(vcpu,val); case 1: return vcpu_set_itm(vcpu,val); @@ -417,7 +417,7 @@ static IA64FAULT priv_mov_from_cr(VCPU * UINT64 val; IA64FAULT fault; - privcnt.from_cr_cnt[inst.M33.cr3]++; + perfc_incra(mov_from_cr,inst.M33.cr3); switch (inst.M33.cr3) { case 0: return cr_get(dcr); case 1: return cr_get(itm); @@ -563,15 +563,15 @@ priv_handle_op(VCPU *vcpu, REGS *regs, i #endif if (inst.M29.x3 != 0) break; if (inst.M30.x4 == 8 && inst.M30.x2 == 2) { - privcnt.mov_to_ar_imm++; + perfc_incrc(mov_to_ar_imm); return priv_mov_to_ar_imm(vcpu,inst); } if (inst.M44.x4 == 6) { - privcnt.ssm++; + perfc_incrc(ssm); return priv_ssm(vcpu,inst); } if (inst.M44.x4 == 7) { - privcnt.rsm++; + perfc_incrc(rsm); return priv_rsm(vcpu,inst); } break; @@ -580,8 +580,9 @@ priv_handle_op(VCPU *vcpu, REGS *regs, i x6 = inst.M29.x6; if (x6 == 0x2a) { if (privify_en && inst.M29.r2 > 63 && inst.M29.ar3 < 8) - privcnt.mov_from_ar++; // privified mov from kr - else privcnt.mov_to_ar_reg++; + perfc_incrc(mov_from_ar); // privified mov from kr + else + perfc_incrc(mov_to_ar_reg); return priv_mov_to_ar_reg(vcpu,inst); } if (inst.M29.x3 != 0) break; @@ -593,31 +594,32 @@ priv_handle_op(VCPU *vcpu, REGS *regs, i } } if (privify_en && x6 == 52 && inst.M28.r3 > 63) - privcnt.fc++; + perfc_incrc(fc); else if (privify_en && x6 == 16 && inst.M43.r3 > 63) - privcnt.cpuid++; - else privcnt.Mpriv_cnt[x6]++; + perfc_incrc(cpuid); + else perfc_incra(misc_privop, x6); return (*pfunc)(vcpu,inst); break; case B: if (inst.generic.major != 0) break; if (inst.B8.x6 == 0x08) { IA64FAULT fault; - privcnt.rfi++; + perfc_incrc(rfi); fault = priv_rfi(vcpu,inst); if (fault == IA64_NO_FAULT) fault = IA64_RFI_IN_PROGRESS; return fault; } if (inst.B8.x6 == 0x0c) { - privcnt.bsw0++; + perfc_incrc(bsw0); return priv_bsw0(vcpu,inst); } if (inst.B8.x6 == 0x0d) { - privcnt.bsw1++; + perfc_incrc(bsw1); return priv_bsw1(vcpu,inst); } - if (inst.B8.x6 == 0x0) { // break instr for privified cover - privcnt.cover++; + if (inst.B8.x6 == 0x0) { + // break instr for privified cover + perfc_incrc(cover); return priv_cover(vcpu,inst); } break; @@ -625,19 +627,20 @@ priv_handle_op(VCPU *vcpu, REGS *regs, i if (inst.generic.major != 0) break; #if 0 if (inst.I26.x6 == 0 && inst.I26.x3 == 0) { - privcnt.cover++; + perfc_incrc(cover); return priv_cover(vcpu,inst); } #endif if (inst.I26.x3 != 0) break; // I26.x3 == I27.x3 if (inst.I26.x6 == 0x2a) { if (privify_en && inst.I26.r2 > 63 && inst.I26.ar3 < 8) - privcnt.mov_from_ar++; // privified mov from kr - else privcnt.mov_to_ar_reg++; + perfc_incrc(mov_from_ar); // privified mov from kr + else + perfc_incrc(mov_to_ar_reg); return priv_mov_to_ar_reg(vcpu,inst); } if (inst.I27.x6 == 0x0a) { - privcnt.mov_to_ar_imm++; + perfc_incrc(mov_to_ar_imm); return priv_mov_to_ar_imm(vcpu,inst); } break; @@ -705,7 +708,7 @@ ia64_hyperprivop(unsigned long iim, REGS iim, regs->cr_iip); return 1; } - slow_hyperpriv_cnt[iim]++; + perfc_incra (slow_hyperprivop, iim); switch(iim) { case HYPERPRIVOP_RFI: (void)vcpu_rfi(v); diff -r 6c4b7669876b -r b23585cd4e70 xen/arch/ia64/xen/privop_stat.c --- a/xen/arch/ia64/xen/privop_stat.c Fri Aug 04 11:51:09 2006 +0200 +++ b/xen/arch/ia64/xen/privop_stat.c Fri Aug 04 12:14:16 2006 +0200 @@ -2,14 +2,6 @@ #include #include #include - -unsigned long slow_hyperpriv_cnt[HYPERPRIVOP_MAX+1] = { 0 }; -unsigned long fast_hyperpriv_cnt[HYPERPRIVOP_MAX+1] = { 0 }; - -unsigned long slow_reflect_count[0x80] = { 0 }; -unsigned long fast_reflect_count[0x80] = { 0 }; - -struct privop_counters privcnt; #ifdef PRIVOP_ADDR_COUNT #define PRIVOP_COUNT_NINSTS 2 @@ -85,6 +77,7 @@ Privileged operation instrumentation rou Privileged operation instrumentation routines **************************************************************************/ +#if 0 static const char * const Mpriv_str[64] = { "mov_to_rr", "mov_to_dbr", "mov_to_ibr", "mov_to_pkr", "mov_to_pmc", "mov_to_pmd", "<0x06>", "<0x07>", @@ -120,185 +113,12 @@ static const char * const cr_str[128] = RS,RS,RS,RS,RS,RS,RS,RS }; -// FIXME: should use snprintf to ensure no buffer overflow -static int dump_privop_counts(char *buf) -{ - int i, j; - unsigned long sum = 0; - char *s = buf; - - // this is ugly and should probably produce sorted output - // but it will have to do for now - sum += privcnt.mov_to_ar_imm; sum += privcnt.mov_to_ar_reg; - sum += privcnt.ssm; sum += privcnt.rsm; - sum += privcnt.rfi; sum += privcnt.bsw0; - sum += privcnt.bsw1; sum += privcnt.cover; - for (i=0; i < 64; i++) - sum += privcnt.Mpriv_cnt[i]; - s += sprintf(s,"Privop statistics: (Total privops: %ld)\n",sum); - if (privcnt.mov_to_ar_imm) - s += sprintf(s,"%10ld %s [%ld%%]\n", privcnt.mov_to_ar_imm, - "mov_to_ar_imm", (privcnt.mov_to_ar_imm*100L)/sum); - if (privcnt.mov_to_ar_reg) - s += sprintf(s,"%10ld %s [%ld%%]\n", privcnt.mov_to_ar_reg, - "mov_to_ar_reg", (privcnt.mov_to_ar_reg*100L)/sum); - if (privcnt.mov_from_ar) - s += sprintf(s,"%10ld %s [%ld%%]\n", privcnt.mov_from_ar, - "privified-mov_from_ar", (privcnt.mov_from_ar*100L)/sum); - if (privcnt.ssm) - s += sprintf(s,"%10ld %s [%ld%%]\n", privcnt.ssm, - "ssm", (privcnt.ssm*100L)/sum); - if (privcnt.rsm) - s += sprintf(s,"%10ld %s [%ld%%]\n", privcnt.rsm, - "rsm", (privcnt.rsm*100L)/sum); - if (privcnt.rfi) - s += sprintf(s,"%10ld %s [%ld%%]\n", privcnt.rfi, - "rfi", (privcnt.rfi*100L)/sum); - if (privcnt.bsw0) - s += sprintf(s,"%10ld %s [%ld%%]\n", privcnt.bsw0, - "bsw0", (privcnt.bsw0*100L)/sum); - if (privcnt.bsw1) - s += sprintf(s,"%10ld %s [%ld%%]\n", privcnt.bsw1, - "bsw1", (privcnt.bsw1*100L)/sum); - if (privcnt.cover) - s += sprintf(s,"%10ld %s [%ld%%]\n", privcnt.cover, - "cover", (privcnt.cover*100L)/sum); - if (privcnt.fc) - s += sprintf(s,"%10ld %s [%ld%%]\n", privcnt.fc, - "privified-fc", (privcnt.fc*100L)/sum); - if (privcnt.cpuid) - s += sprintf(s,"%10ld %s [%ld%%]\n", privcnt.cpuid, - "privified-getcpuid", (privcnt.cpuid*100L)/sum); - for (i=0; i < 64; i++) if (privcnt.Mpriv_cnt[i]) { - if (!Mpriv_str[i]) s += sprintf(s,"PRIVSTRING NULL!!\n"); - else s += sprintf(s,"%10ld %s [%ld%%]\n", privcnt.Mpriv_cnt[i], - Mpriv_str[i], (privcnt.Mpriv_cnt[i]*100L)/sum); - if (i == 0x24) { // mov from CR - s += sprintf(s," ["); - for (j=0; j < 128; j++) if (privcnt.from_cr_cnt[j]) { - if (!cr_str[j]) - s += sprintf(s,"PRIVSTRING NULL!!\n"); - else - s += sprintf(s,"%s(%ld),",cr_str[j], - privcnt.from_cr_cnt[j]); - } - s += sprintf(s,"]\n"); - } - else if (i == 0x2c) { // mov to CR - s += sprintf(s," ["); - for (j=0; j < 128; j++) if (privcnt.to_cr_cnt[j]) { - if (!cr_str[j]) - s += sprintf(s,"PRIVSTRING NULL!!\n"); - else - s += sprintf(s,"%s(%ld),",cr_str[j], - privcnt.to_cr_cnt[j]); - } - s += sprintf(s,"]\n"); - } - } - return s - buf; -} - -static int zero_privop_counts(char *buf) -{ - int i, j; - char *s = buf; - - // this is ugly and should probably produce sorted output - // but it will have to do for now - privcnt.mov_to_ar_imm = 0; - privcnt.mov_to_ar_reg = 0; - privcnt.mov_from_ar = 0; - privcnt.ssm = 0; privcnt.rsm = 0; - privcnt.rfi = 0; privcnt.bsw0 = 0; - privcnt.bsw1 = 0; privcnt.cover = 0; - privcnt.fc = 0; privcnt.cpuid = 0; - for (i=0; i < 64; i++) - privcnt.Mpriv_cnt[i] = 0; - for (j=0; j < 128; j++) - privcnt.from_cr_cnt[j] = 0; - for (j=0; j < 128; j++) - privcnt.to_cr_cnt[j] = 0; - s += sprintf(s,"All privop statistics zeroed\n"); - return s - buf; -} - static const char * const hyperpriv_str[HYPERPRIVOP_MAX+1] = { 0, "rfi", "rsm.dt", "ssm.dt", "cover", "itc.d", "itc.i", "ssm.i", "=ivr", "=tpr", "tpr=", "eoi", "itm=", "thash", "ptc.ga", "itr.d", "=rr", "rr=", "kr=", "fc", "=cpuid", "=pmd", "=ar.eflg", "ar.eflg=" }; - - -static int dump_hyperprivop_counts(char *buf) -{ - int i; - char *s = buf; - unsigned long total = 0; - for (i = 1; i <= HYPERPRIVOP_MAX; i++) - total += slow_hyperpriv_cnt[i]; - s += sprintf(s,"Slow hyperprivops (total %ld):\n",total); - for (i = 1; i <= HYPERPRIVOP_MAX; i++) - if (slow_hyperpriv_cnt[i]) - s += sprintf(s,"%10ld %s\n", - slow_hyperpriv_cnt[i], hyperpriv_str[i]); - total = 0; - for (i = 1; i <= HYPERPRIVOP_MAX; i++) - total += fast_hyperpriv_cnt[i]; - s += sprintf(s,"Fast hyperprivops (total %ld):\n",total); - for (i = 1; i <= HYPERPRIVOP_MAX; i++) - if (fast_hyperpriv_cnt[i]) - s += sprintf(s,"%10ld %s\n", - fast_hyperpriv_cnt[i], hyperpriv_str[i]); - return s - buf; -} - -static void zero_hyperprivop_counts(void) -{ - int i; - for (i = 0; i <= HYPERPRIVOP_MAX; i++) - slow_hyperpriv_cnt[i] = 0; - for (i = 0; i <= HYPERPRIVOP_MAX; i++) - fast_hyperpriv_cnt[i] = 0; -} - -static void zero_reflect_counts(void) -{ - int i; - for (i=0; i < 0x80; i++) - slow_reflect_count[i] = 0; - for (i=0; i < 0x80; i++) - fast_reflect_count[i] = 0; -} - -static int dump_reflect_counts(char *buf) -{ - int i,j,cnt; - char *s = buf; - - s += sprintf(s,"Slow reflections by vector:\n"); - for (i = 0, j = 0; i < 0x80; i++) { - if ( (cnt = slow_reflect_count[i]) != 0 ) { - s += sprintf(s,"0x%02x00:%10d, ",i,cnt); - if ((j++ & 3) == 3) - s += sprintf(s,"\n"); - } - } - if (j & 3) - s += sprintf(s,"\n"); - s += sprintf(s,"Fast reflections by vector:\n"); - for (i = 0, j = 0; i < 0x80; i++) { - if ( (cnt = fast_reflect_count[i]) != 0 ) { - s += sprintf(s,"0x%02x00:%10d, ",i,cnt); - if ((j++ & 3) == 3) - s += sprintf(s,"\n"); - } - } - if (j & 3) - s += sprintf(s,"\n"); - return s - buf; -} - +#endif #define TMPBUFLEN 8*1024 int dump_privop_counts_to_user(char __user *ubuf, int len) @@ -309,9 +129,7 @@ int dump_privop_counts_to_user(char __us if (len < TMPBUFLEN) return -1; - n = dump_privop_counts(buf); - n += dump_hyperprivop_counts(buf + n); - n += dump_reflect_counts(buf + n); + n = 0; #ifdef PRIVOP_ADDR_COUNT n += dump_privop_addrs(buf + n); #endif @@ -323,21 +141,8 @@ int dump_privop_counts_to_user(char __us int zero_privop_counts_to_user(char __user *ubuf, int len) { - char buf[TMPBUFLEN]; - int n; - - if (len < TMPBUFLEN) - return -1; - - n = zero_privop_counts(buf); - - zero_hyperprivop_counts(); #ifdef PRIVOP_ADDR_COUNT zero_privop_addrs(); #endif - zero_vhpt_stats(); - zero_reflect_counts(); - if (__copy_to_user(ubuf,buf,n)) - return -1; - return n; + return 0; } diff -r 6c4b7669876b -r b23585cd4e70 xen/arch/ia64/xen/vhpt.c --- a/xen/arch/ia64/xen/vhpt.c Fri Aug 04 11:51:09 2006 +0200 +++ b/xen/arch/ia64/xen/vhpt.c Fri Aug 04 12:14:16 2006 +0200 @@ -261,11 +261,6 @@ void flush_tlb_mask(cpumask_t mask) (cpu, (void (*)(void *))flush_tlb_vhpt_all, NULL, 1, 1); } -void zero_vhpt_stats(void) -{ - return; -} - int dump_vhpt_stats(char *buf) { int i, cpu; diff -r 6c4b7669876b -r b23585cd4e70 xen/common/page_alloc.c --- a/xen/common/page_alloc.c Fri Aug 04 11:51:09 2006 +0200 +++ b/xen/common/page_alloc.c Fri Aug 04 12:14:16 2006 +0200 @@ -24,7 +24,6 @@ #include #include #include -#include #include #include #include @@ -33,6 +32,7 @@ #include #include #include +#include #include /* diff -r 6c4b7669876b -r b23585cd4e70 xen/include/asm-ia64/perfc_defn.h --- a/xen/include/asm-ia64/perfc_defn.h Fri Aug 04 11:51:09 2006 +0200 +++ b/xen/include/asm-ia64/perfc_defn.h Fri Aug 04 12:14:16 2006 +0200 @@ -1,21 +1,42 @@ /* This file is legitimately included multiple times. */ -PERFCOUNTER_CPU(dtlb_translate, "dtlb hit") +PERFCOUNTER_CPU(dtlb_translate, "dtlb hit") -PERFCOUNTER_CPU(tr_translate, "TR hit") +PERFCOUNTER_CPU(tr_translate, "TR hit") -PERFCOUNTER_CPU(vhpt_translate, "virtual vhpt translation") -PERFCOUNTER_CPU(fast_vhpt_translate, "virtual vhpt fast translation") +PERFCOUNTER_CPU(vhpt_translate, "virtual vhpt translation") +PERFCOUNTER_CPU(fast_vhpt_translate, "virtual vhpt fast translation") -PERFCOUNTER(recover_to_page_fault, "recoveries to page fault") -PERFCOUNTER(recover_to_break_fault, "recoveries to break fault") +PERFCOUNTER(recover_to_page_fault, "recoveries to page fault") +PERFCOUNTER(recover_to_break_fault, "recoveries to break fault") -PERFCOUNTER_CPU(phys_translate, "metaphysical translation") +PERFCOUNTER_CPU(phys_translate, "metaphysical translation") -PERFCOUNTER_CPU(idle_when_pending, "vcpu idle at event") +PERFCOUNTER_CPU(idle_when_pending, "vcpu idle at event") -PERFCOUNTER_CPU(pal_halt_light, "calls to pal_halt_light") +PERFCOUNTER_CPU(pal_halt_light, "calls to pal_halt_light") -PERFCOUNTER_CPU(context_switch, "context switch") +PERFCOUNTER_CPU(lazy_cover, "lazy cover") -PERFCOUNTER_CPU(lazy_cover, "lazy cover") +PERFCOUNTER_CPU(mov_to_ar_imm, "privop mov_to_ar_imm") +PERFCOUNTER_CPU(mov_to_ar_reg, "privop mov_to_ar_reg") +PERFCOUNTER_CPU(mov_from_ar, "privop privified-mov_from_ar") +PERFCOUNTER_CPU(ssm, "privop ssm") +PERFCOUNTER_CPU(rsm, "privop rsm") +PERFCOUNTER_CPU(rfi, "privop rfi") +PERFCOUNTER_CPU(bsw0, "privop bsw0") +PERFCOUNTER_CPU(bsw1, "privop bsw1") +PERFCOUNTER_CPU(cover, "privop cover") +PERFCOUNTER_CPU(fc, "privop privified-fc") +PERFCOUNTER_CPU(cpuid, "privop privified-cpuid") + +PERFCOUNTER_ARRAY(mov_to_cr, "privop mov to cr", 128) +PERFCOUNTER_ARRAY(mov_from_cr, "privop mov from cr", 128) + +PERFCOUNTER_ARRAY(misc_privop, "privop misc", 64) + +PERFCOUNTER_ARRAY(slow_hyperprivop, "slow hyperprivops", HYPERPRIVOP_MAX + 1) +PERFCOUNTER_ARRAY(fast_hyperprivop, "fast hyperprivops", HYPERPRIVOP_MAX + 1) + +PERFCOUNTER_ARRAY(slow_reflect, "slow reflection", 0x80) +PERFCOUNTER_ARRAY(fast_reflect, "fast reflection", 0x80) diff -r 6c4b7669876b -r b23585cd4e70 xen/include/asm-ia64/privop_stat.h --- a/xen/include/asm-ia64/privop_stat.h Fri Aug 04 11:51:09 2006 +0200 +++ b/xen/include/asm-ia64/privop_stat.h Fri Aug 04 12:14:16 2006 +0200 @@ -6,32 +6,6 @@ extern int zero_privop_counts_to_user(ch extern int zero_privop_counts_to_user(char *, int); #define PRIVOP_ADDR_COUNT - -extern unsigned long slow_hyperpriv_cnt[HYPERPRIVOP_MAX+1]; -extern unsigned long fast_hyperpriv_cnt[HYPERPRIVOP_MAX+1]; - -extern unsigned long slow_reflect_count[0x80]; -extern unsigned long fast_reflect_count[0x80]; - -struct privop_counters { - unsigned long mov_to_ar_imm; - unsigned long mov_to_ar_reg; - unsigned long mov_from_ar; - unsigned long ssm; - unsigned long rsm; - unsigned long rfi; - unsigned long bsw0; - unsigned long bsw1; - unsigned long cover; - unsigned long fc; - unsigned long cpuid; - unsigned long Mpriv_cnt[64]; - - unsigned long to_cr_cnt[128]; /* Number of mov to cr privop. */ - unsigned long from_cr_cnt[128]; /* Number of mov from cr privop. */ -}; - -extern struct privop_counters privcnt; #ifdef PRIVOP_ADDR_COUNT diff -r 6c4b7669876b -r b23585cd4e70 xen/include/asm-ia64/vhpt.h --- a/xen/include/asm-ia64/vhpt.h Fri Aug 04 11:51:09 2006 +0200 +++ b/xen/include/asm-ia64/vhpt.h Fri Aug 04 12:14:16 2006 +0200 @@ -36,7 +36,6 @@ struct vhpt_lf_entry { #define INVALID_TI_TAG 0x8000000000000000L extern void vhpt_init (void); -extern void zero_vhpt_stats(void); extern int dump_vhpt_stats(char *buf); extern void vhpt_multiple_insert(unsigned long vaddr, unsigned long pte, unsigned long logps);