[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH v2] x86/vpmu: Fix race-condition in vpmu_load





On Mon, Sep 26, 2022 at 10:12 AM Jan Beulich <jbeulich@xxxxxxxx> wrote:
On 22.09.2022 22:48, Tamas K Lengyel wrote:
> --- a/xen/arch/x86/cpu/vpmu.c
> +++ b/xen/arch/x86/cpu/vpmu.c
> @@ -376,57 +376,24 @@ void vpmu_save(struct vcpu *v)
>      vpmu->last_pcpu = pcpu;
>      per_cpu(last_vcpu, pcpu) = v;

> +    vpmu_set(vpmu, VPMU_CONTEXT_SAVE);
> +
>      if ( alternative_call(vpmu_ops.arch_vpmu_save, v, 0) )
>          vpmu_reset(vpmu, VPMU_CONTEXT_LOADED);

> +    vpmu_reset(vpmu, VPMU_CONTEXT_SAVE);
> +
>      apic_write(APIC_LVTPC, PMU_APIC_VECTOR | APIC_LVT_MASKED);
>  }

>  int vpmu_load(struct vcpu *v, bool_t from_guest)
>  {
>      struct vpmu_struct *vpmu = vcpu_vpmu(v);
> -    int pcpu = smp_processor_id(), ret;
> -    struct vcpu *prev = NULL;
> +    int ret;

>      if ( !vpmu_is_set(vpmu, VPMU_CONTEXT_ALLOCATED) )
>          return 0;

> -    /* First time this VCPU is running here */
> -    if ( vpmu->last_pcpu != pcpu )
> -    {
> -        /*
> -         * Get the context from last pcpu that we ran on. Note that if another
> -         * VCPU is running there it must have saved this VPCU's context before
> -         * startig to run (see below).
> -         * There should be no race since remote pcpu will disable interrupts
> -         * before saving the context.
> -         */
> -        if ( vpmu_is_set(vpmu, VPMU_CONTEXT_LOADED) )
> -        {
> -            on_selected_cpus(cpumask_of(vpmu->last_pcpu),
> -                             vpmu_save_force, (void *)v, 1);
> -            vpmu_reset(vpmu, VPMU_CONTEXT_LOADED);
> -        }
> -    }
> -
> -    /* Prevent forced context save from remote CPU */
> -    local_irq_disable();
> -
> -    prev = per_cpu(last_vcpu, pcpu);
> -
> -    if ( prev != v && prev )
> -    {
> -        vpmu = vcpu_vpmu(prev);
> -
> -        /* Someone ran here before us */
> -        vpmu_save_force(prev);
> -        vpmu_reset(vpmu, VPMU_CONTEXT_LOADED);
> -
> -        vpmu = vcpu_vpmu(v);
> -    }
> -
> -    local_irq_enable();
> -
>      /* Only when PMU is counting, we load PMU context immediately. */
>      if ( !vpmu_is_set(vpmu, VPMU_RUNNING) ||
>           (!has_vlapic(vpmu_vcpu(vpmu)->domain) &&

What about the other two uses of vpmu_save_force() in this file? I looks
to me as if only the use in mem_sharing.c needs to be retained.

I don't know, maybe. I rather focus this patch only on the issue and its fix as I don't want to introduce unintended side effects by doing a cleanup/consolidation at other code-paths when not strictly necessary.

Tamas

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.