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

Re: [PATCH v3] vpci/msix: fix PBA accesses


  • To: Jan Beulich <jbeulich@xxxxxxxx>
  • From: Roger Pau Monné <roger.pau@xxxxxxxxxx>
  • Date: Mon, 7 Mar 2022 17:06:59 +0100
  • Arc-authentication-results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=citrix.com; dmarc=pass action=none header.from=citrix.com; dkim=pass header.d=citrix.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=Sbaen9etnTXnRwjhhj6twHBeqnDJQHKTfmp/QQ6Rkio=; b=IQqDGV3eQe7a8AnEjd8Eaz+eTfr3Soc2dsqSX3pmqnZVYaJtOHbQDKjAkFJIVslY7w7tPitV9HLBYyTa0f/ktURJ8KSamrOYhfC1KuDfozVoMlh1HGoCJz0viZRCxghb/x8zOixPW1tzdHX5xqC5RcCnIM0w47T2rcdfw+ACuSxE1kIcHTWUkOHQ+pus51H7BEcOoIJC7gV0n5gIo2Ielk8v3fd01MEJNHIdrdI9mfoNOOhopDb9PGxTczTgluQmQ8MAfRdE2zjzBqLcIYwwZiVWASXoyfbrLLihZPKpMZd/YtQ3tUebfoK6QfETh4yF8uqnQQ1kN+l3pCZbCtmgtQ==
  • Arc-seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=LUUBCTjewF9WnDiDt2zQqLaD8Sv0lP/6cYJJ+tFPdwto3lGxYUHiAGOMX4RfAM8O9mkt3crEhPtyZGpIHCUZOryBkKch5umHMXVgPddE8WN+k2G9CJPoDECwEDY4+Tk2UqBvcEiwUaXiBbqRiVak6GGuNn3YZHqW5ilfA9KltOnsznTAjZEuPSUhvmdz9OP3yolKI+/QZqmC/zgoyHzrHxTtdRT1xFe0u8jeQRB/SBDUKunz64KEgJULxY4h1yanQ8u9ze5SV0blWDOuNEZvJ93vY7QjZJoBVtDYpzdwGwJXAFxuW55ib1ovmxX/J0kvJ5mK2RVbfIWQSPkSmOCYfA==
  • Authentication-results: esa1.hc3370-68.iphmx.com; dkim=pass (signature verified) header.i=@citrix.onmicrosoft.com
  • Cc: Alex Olson <this.is.a0lson@xxxxxxxxx>, <xen-devel@xxxxxxxxxxxxxxxxxxxx>
  • Delivery-date: Mon, 07 Mar 2022 16:07:14 +0000
  • Ironport-data: A9a23:xygFr6iRxDbnjcaagWvOo4nTX161fxAKZh0ujC45NGQN5FlHY01je htvCziHPfqJYWD8eNp2Yd+wpEsO65DUnYRnSlFtqCs0QXkb9cadCdqndUqhZCn6wu8v7a5EA 2fyTvGacajYm1eF/k/F3oDJ9CU6jefSLlbFILas1hpZHGeIcw98z0M78wIFqtQw24LhWFvS4 YmaT/D3YzdJ5RYlagr41IrbwP9flKyaVOQw5wFWiVhj5TcyplFNZH4tDfjZw0jQG+G4KtWSV efbpIxVy0uCl/sb5nFJpZ6gGqECaua60QFjERO6UYD66vRJjnRaPqrWqJPwwKqY4tmEt4kZ9 TlDiXC/YUApD/X0tcUhbwkGMDlhIZR45LbJB3fq5KR/z2WeG5ft6/BnDUVwNowE4OdnR2pJ8 JT0KhhUMErF3bjvhuvmFK883azPL+GyVG8bkmtnwjzDS+4vXLjIQrnQ5M8e1zA17ixLNaiAP 5BJN2MzBPjGS0QXPg8QGogwp9y12Eb8eWFj82iw5oNitgA/yyQuieOwYbI5YOeiVchT20qVu G/C12D4GQ0BcsySzyKf9XChjfOJmjn0MKoOFLyjsP9xxlTLwncUDjUZUFK6pb+yjUvWc9BVJ lEQ+yEuhbMv70HtRd74NyBUu1bd4ERaAYAJVbRntkfdkcI4/jp1GEBDTg8ZUPEHiPMmGx8yy UOwoc/gCxpg5ej9pW2myp+Yqja7OC4wJGAEZDMZQQZt3+QPsL3fnTqUEI89TffdYsndXGipn mvU9HRWa6A70JZTv5hX62wrlN5FSnLhagcurjvaUWu+hu+STN70Ptf4gbQ3ABspEWp4crVjl CVe8yR9xLpXZX1oqMBqaL9RdIxFH97fbFXhbadHRvHNDQiF9X+5Zpx36zpjPkpvOctsUWa3P BGO6F0Ju8QDbCfCgUpLj2WZUZhC8EQdPY69CqC8giRmOPCdizNrDAkxPBXNjggBYWAnkL0lO IfzTCpfJS1yNEiT9xLvH711+eZynkgWnDqPLbiilkTP+efONRa9FOZeWHPTP79R0U9xiFiMm zqpH5DRkEs3vSyXSnS/zLP/2nhRdSlrXc2t8pcPHgNBSyI/cFwc5zbq6epJU6RunrhPl/eO+ Xe4W0RCz0H4i2GBIgKPAk2Popu1NXqjhRrX5RARAGs=
  • Ironport-hdrordr: A9a23:S9r6cqCCK7eotEHlHemo55DYdb4zR+YMi2TDsHoBLiC9E/bo8/ xG+c5x6faaslossR0b9uxoW5PhfZq/z/BICOAqVN/JMTUO01HIEKhSqafk3j38C2nf24dmpM JdmnFFeb7N5I5B/KTH3DU=
  • List-id: Xen developer discussion <xen-devel.lists.xenproject.org>

On Mon, Mar 07, 2022 at 03:12:32PM +0100, Jan Beulich wrote:
> On 07.03.2022 13:53, Roger Pau Monne wrote:
> > --- a/xen/drivers/vpci/msix.c
> > +++ b/xen/drivers/vpci/msix.c
> > @@ -182,6 +182,33 @@ static struct vpci_msix_entry *get_entry(struct 
> > vpci_msix *msix,
> >      return &msix->entries[(addr - start) / PCI_MSIX_ENTRY_SIZE];
> >  }
> >  
> > +static void __iomem *get_pba(struct vpci *vpci)
> > +{
> > +    struct vpci_msix *msix = vpci->msix;
> > +    void __iomem *pba;
> > +
> > +    /*
> > +     * PBA will only be unmapped when the device is deassigned, so access 
> > it
> > +     * without holding the vpci lock.
> > +     */
> > +    if ( likely(msix->pba) )
> > +        return msix->pba;
> > +
> > +    pba = ioremap(vmsix_table_addr(vpci, VPCI_MSIX_PBA),
> > +                  vmsix_table_size(vpci, VPCI_MSIX_PBA));
> > +    if ( !pba )
> > +        return msix->pba;
> 
> For this particular purpose may want to consider using ACCESS_ONCE() for
> all accesses to this field.

Hm, I think I've asked before, but we do assume that ACCESS_ONCE will
generate a single instruction, or else we would have to use
read_atomic.

> > +    spin_lock(&vpci->lock);
> > +    if ( !msix->pba )
> > +        msix->pba = pba;

Here we would then use write_atomic.

> > +    else
> > +        iounmap(pba);
> > +    spin_unlock(&vpci->lock);
> 
> Whenever possible I think we should try to do things, in particular ones
> involving further locks, with as few locks held as possible. IOW I'd like
> to ask that you pull out the iounmap().
> 
> > @@ -200,6 +227,10 @@ static int cf_check msix_read(
> >  
> >      if ( VMSIX_ADDR_IN_RANGE(addr, msix->pdev->vpci, VPCI_MSIX_PBA) )
> >      {
> > +        struct vpci *vpci = msix->pdev->vpci;
> > +        unsigned int idx = addr - vmsix_table_addr(vpci, VPCI_MSIX_PBA);
> > +        void __iomem *pba = get_pba(vpci);
> 
> const?

Sure.

Thanks, Roger.



 


Rackspace

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