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

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


  • To: Tamas K Lengyel <tamas.k.lengyel@xxxxxxxxx>
  • From: Jan Beulich <jbeulich@xxxxxxxx>
  • Date: Thu, 29 Sep 2022 15:07:18 +0200
  • Arc-authentication-results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=suse.com; dmarc=pass action=none header.from=suse.com; dkim=pass header.d=suse.com; arc=none
  • Arc-message-signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=CbUiIJBfrFotvWwnCl6u8JrOebjzPe2CR3v7xnTIDoU=; b=RzI77qdvTT+3gcXTpyZq+vTcZHEi811I78dW2crgjm3dt/sKNsZFJydwhLpvDK7zKaxxzDImm6Yl9VO9Knd80QMNfXp9Dr5ejwfwo1aLY6xfR+64/TTfwkcx4ikKAbPbIU0LcZJSTdIQ4sWnyodHVKammCBd2x0jSKFWR8gd5RModiuWVvs8iV4BGEBb4ugpj0oJTdG8Co2c/nq6Dw79S/USNW6mHdMFR5GGpPHQ+IXXuAuNVNgc1OCTHyRRbUVtpVrEc5h1Sj+qga6K6ex3lSlHTKzpsMTRMx9dRdOd3Ps8fRKxBnVsWZVh65DvgWra/T8ZPvTAAsFgoOE3LolA3A==
  • Arc-seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=iIGduCOaAG9+ABf0J0xeynLvK1ci1wVth51loXunr61/Chu214LyzbmUNhEejLbK/zJZlKfKzFMHTQK7HZY0Ki0eZKsuyMk/BUhG8EoaICbdxM79LyyVF4WAu6nLl8gDpKlm/1yzhGAiRy2xnXwv6G2egXOP7qlDuZZHKLpG6pxO7FwrxGlpZB4oda5H9yyFTxOJy4NSK9gTA5pbh9B1BAml0q6Hv6Mb08ZLft9eWgY3bzgeHW7ZqVm567CrneQJ4wPpgpEuhE/EjUZsk5lDZaK9QxdaBOlacWrIBa1pTLaixq0kbvXyknYPaNxjlbSrdrKr4pp671wM+8El75aXew==
  • Authentication-results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=suse.com;
  • Cc: Tamas K Lengyel <tamas.lengyel@xxxxxxxxx>, Andrew Cooper <andrew.cooper3@xxxxxxxxxx>, Roger Pau Monné <roger.pau@xxxxxxxxxx>, Wei Liu <wl@xxxxxxx>, xen-devel@xxxxxxxxxxxxxxxxxxxx, Boris Ostrovsky <boris.ostrovsky@xxxxxxxxxx>
  • Delivery-date: Thu, 29 Sep 2022 13:07:28 +0000
  • List-id: Xen developer discussion <xen-devel.lists.xenproject.org>

On 26.09.2022 16:22, Tamas K Lengyel wrote:
> 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.

While I see your point, I'm afraid I don't think I can ack this
change without knowing whether the other uses don't expose a similar
issue. It would feel wrong to fix only one half of a problem. I may,
somewhat hesitantly, give an ack if e.g. Boris offered his R-b.
Else the only other option I see is that some other maintainer give
their ack.

Jan



 


Rackspace

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