|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH] xen: arm: enable perf counters
On 05/15/2014 03:17 PM, Ian Campbell wrote:
> As well as the existing common perf counters add a bunch of ARM specifics,
> including the various trap types, vuart/vgic/vtimer accesses and different
> types of interrupt.
Performance counters in vgic don't make sense for me as we need to trap
it in any case.
But we might want perf counter in p2m_lookup because this function is
costly.
I would also add one in flush_tlb_* functions, such as flush_tlb_domain.
It will help us optimizing TLBs.
> PSCI_RESULT_REG(regs) = psci_call(PSCI_ARGS(regs));
> }
>
> @@ -1135,15 +1138,19 @@ static void do_trap_hypercall(struct cpu_user_regs
> *regs, register_t *nr,
> register_t orig_pc = regs->pc;
> #endif
>
> + BUILD_BUG_ON(NR_hypercalls < ARRAY_SIZE(arm_hypercall_table) );
> +
> if ( iss != XEN_HYPERCALL_TAG )
> domain_crash_synchronous();
>
> if ( *nr >= ARRAY_SIZE(arm_hypercall_table) )
> {
> + perfc_incr(invalid_hypercalls);
> HYPERCALL_RESULT_REG(regs) = -ENOSYS;
> return;
> }
>
> + perfc_incra(hypercalls, *nr);
> call = arm_hypercall_table[*nr].fn;
> if ( call == NULL )
> {
> @@ -1283,8 +1290,10 @@ static int check_conditional_instr(struct
> cpu_user_regs *regs, union hsr hsr)
> cpsr_cond = cpsr >> 28;
>
> if ( !((cc_map[cond] >> cpsr_cond) & 1) )
> + {
> + perfc_incr(trap_uncond);
trap_uncond alone doesn't have much meaning. Can you add a perf_counter
to count the number of call for this function (i.e check_conditional_instr)?
> return 0;
> -
> + }
> return 1;
> }
>
> @@ -1664,6 +1673,7 @@ asmlinkage void do_trap_hypervisor(struct cpu_user_regs
> *regs)
>
> switch (hsr.ec) {
> case HSR_EC_WFI_WFE:
> + perfc_incr(trap_wfi_wfe);
Can you add a perf counter to count the number of WFI and WFE? (actually
the last one is not trap for now).
> if ( !check_conditional_instr(regs, hsr) )
> {
> advance_pc(regs, hsr);
> @@ -1684,38 +1694,51 @@ asmlinkage void do_trap_hypervisor(struct
> cpu_user_regs *regs)
> case HSR_EC_CP15_32:
> if ( !is_32bit_domain(current->domain) )
> goto bad_trap;
> + perfc_incr(trap_cp15_32);
> do_cp15_32(regs, hsr);
> break;
> case HSR_EC_CP15_64:
> if ( !is_32bit_domain(current->domain) )
> goto bad_trap;
> + perfc_incr(trap_cp15_32);
Did you mean trap_cp15_64?
[..]
> case HSR_EC_HVC32:
> + perfc_incr(trap_hvc32);
> #ifndef NDEBUG
> if ( (hsr.iss & 0xff00) == 0xff00 )
> return do_debug_trap(regs, hsr.iss & 0x00ff);
> #endif
> if ( hsr.iss == 0 )
> return do_trap_psci(regs);
> +
Spurious change?
[..]
> case HSR_EC_INSTR_ABORT_LOWER_EL:
> + perfc_incr(trap_iabt);
> do_trap_instr_abort_guest(regs, hsr);
> break;
> case HSR_EC_DATA_ABORT_LOWER_EL:
> + perfc_incr(trap_dabt);
> do_trap_data_abort_guest(regs, hsr);
> break;
> default:
> bad_trap:
> + perfc_incr(trap_bad);
The perfc_incr seems pointless here. Indeed, do_unexcepted_trap will
basically break the current PCPU and can be worst when it's occurs on CPU0.
[..]
> diff --git a/xen/include/asm-arm/config.h b/xen/include/asm-arm/config.h
> index ef291ff..0de6f7e 100644
> --- a/xen/include/asm-arm/config.h
> +++ b/xen/include/asm-arm/config.h
> @@ -178,6 +178,8 @@
> #define PAGE_MASK (~(PAGE_SIZE-1))
> #define PAGE_FLAG_MASK (~0)
>
> +#define NR_hypercalls 64
> +
Should not it be define in common code?
Regards,
--
Julien Grall
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |