> +static void auto_switch_lbr_msrs(struct vcpu_vmx *vmx)
> +{
> +     int i;
> +     struct perf_lbr_stack lbr_stack;
> +
> +     perf_get_lbr_stack(&lbr_stack);
> +
> +     add_atomic_switch_msr(vmx, MSR_LBR_SELECT, 0, 0);
> +     add_atomic_switch_msr(vmx, lbr_stack.lbr_tos, 0, 0);
> +
> +     for (i = 0; i < lbr_stack.lbr_nr; i++) {
> +             add_atomic_switch_msr(vmx, lbr_stack.lbr_from + i, 0, 0);
> +             add_atomic_switch_msr(vmx, lbr_stack.lbr_to + i, 0, 0);
> +             if (lbr_stack.lbr_info)
> +                     add_atomic_switch_msr(vmx, lbr_stack.lbr_info + i, 0,
> +                                           0);
> +     }

That will be really expensive and add a lot of overhead to every entry/exit.
perf can already context switch the LBRs on task context switch. With that
you can just switch LBR_SELECT, which is *much* cheaper because there
are far less context switches than exit/entries.

It implies that when KVM is running it needs to prevent perf from enabling
LBRs in the context of KVM, but that should be straight forward.

-Andi

Reply via email to