Re: [PATCH] x86/pmu: Disable inlining of measure()

Paolo Bonzini
2022-11-02T17:38:14Z

On 6/1/22 18:30, Bill Wendling wrote:
> From: Bill Wendling <isanbard@gmail.com>
>
> Clang can be more aggressive at inlining than GCC and will fully inline
> calls to measure(). This can mess with the counter overflow check. To
> set up the PMC overflow, check_counter_overflow() first records the
> number of instructions retired in an invocation of measure() and checks
> to see that subsequent calls to measure() retire the same number of
> instructions. If inlining occurs, those numbers can be different and the
> overflow test fails.
>
> FAIL: overflow: cntr-0
> PASS: overflow: status-0
> PASS: overflow: status clear-0
> PASS: overflow: irq-0
> FAIL: overflow: cntr-1
> PASS: overflow: status-1
> PASS: overflow: status clear-1
> PASS: overflow: irq-1
> FAIL: overflow: cntr-2
> PASS: overflow: status-2
> PASS: overflow: status clear-2
> PASS: overflow: irq-2
> FAIL: overflow: cntr-3
> PASS: overflow: status-3
> PASS: overflow: status clear-3
> PASS: overflow: irq-3
>
> Disabling inlining of measure() keeps the assumption that all calls to
> measure() retire the same number of instructions.
>
> Cc: Jim Mattson <jmattson@google.com>
> Signed-off-by: Bill Wendling <morbo@google.com>
> ---
> x86/pmu.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/x86/pmu.c b/x86/pmu.c
> index a46bdbf4788c..bbfd268aafa4 100644
> --- a/x86/pmu.c
> +++ b/x86/pmu.c
> @@ -211,7 +211,7 @@ static void stop_event(pmu_counter_t *evt)
> evt->count = rdmsr(evt->ctr);
> }
>
> -static void measure(pmu_counter_t *evt, int count)
> +static noinline void measure(pmu_counter_t *evt, int count)
> {
> int i;
> for (i = 0; i < count; i++)

Queued, thanks.

Paolo