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

RE: [PATCH 5/6] VT-d: introduce helper to convert DID to domid_t


  • To: Jan Beulich <jbeulich@xxxxxxxx>, "xen-devel@xxxxxxxxxxxxxxxxxxxx" <xen-devel@xxxxxxxxxxxxxxxxxxxx>
  • From: "Tian, Kevin" <kevin.tian@xxxxxxxxx>
  • Date: Mon, 15 Nov 2021 05:54:07 +0000
  • Accept-language: en-US
  • Arc-authentication-results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=intel.com; dmarc=pass action=none header.from=intel.com; dkim=pass header.d=intel.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=VVpavmkP0FeBQX2wQMFqmNj+Snyy+1Vblo4nB/C8pcU=; b=Cqifue8T0LdscETR5TZU+9VpolRHg3fmqxVUmP6I3KzBoB4aIxJczPzoHfvzbdsk/XHJs9Jp2iVcZkq/iwcXjJw0bQHh/K4hUioH5ROEfeb5+pN11aHeWBB3AoVmyUD8kyqPJNK1ZIk8n4br5hoZ/LPGI01bDoIe8CXzUicWKn6elln8TyngQ0R40NzSWSlM4kfhndA4WeO4k9FlAp6fkspSlAz0/a1sHVIHoIItQUXLuoJbT7L3RY0HMnlipJPaE+mwvMZROB8hh31UT2hIXT7lrAjZkOb6JPIAt1/vxqByehFRPFQGl16jDWklc9GYGEcAJqDptEOBOXZUXnggKA==
  • Arc-seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=GScx8rPdToPM605djY6x+lOgP7z52LMOpxHbtlN2Y8P5liUGAfzRDJaYC0047EsX9c9jbwrFCiKlU7uYnwFFeXXh5dU+R6IcFR/OdCSCgS/r2X1P7r4rgsaydERSMMV4iB1WFaOxRuEGmQCEONk0C0ScGVEk81Mdj7x8L+MvDxkGFucnYlL5xJGoZ9A04yuP5+lRPFU4sPMLF3Sbj8q0S3YuPdvPrfk1EPDoNs5XYSwXM49BoaEtRsL4MeVTvPvmKGXVBw0qig7DVECpO8Ji8IzWlLejqickwcfx62Qk13ZBAZthgJbe9puG3RJQp/nGw/i9ZWOYiulY3WOwcoZdCw==
  • Authentication-results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=intel.com;
  • Delivery-date: Mon, 15 Nov 2021 05:54:18 +0000
  • List-id: Xen developer discussion <xen-devel.lists.xenproject.org>
  • Thread-index: AQHX16qieR9jhpz27Ey6PyooEs35QawEGvOw
  • Thread-topic: [PATCH 5/6] VT-d: introduce helper to convert DID to domid_t

> From: Jan Beulich <jbeulich@xxxxxxxx>
> Sent: Friday, November 12, 2021 5:50 PM
> 
> This is in preparation of adding another "translation" method. Take the
> combination of the extra validation both previously open-coded have been
> doing: Bounds check and bitmap check. But don't propagate the previous
> pointless check of whether ->domid_map[] was actually allocated, as
> failure there would lead to overall failure of IOMMU initialization
> anyway.
> 
> Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx>

Reviewed-by: Kevin Tian <kevin.tian@xxxxxxxxx>

> 
> --- a/xen/drivers/passthrough/vtd/extern.h
> +++ b/xen/drivers/passthrough/vtd/extern.h
> @@ -45,6 +45,8 @@ void disable_intremap(struct vtd_iommu *
>  int iommu_alloc(struct acpi_drhd_unit *drhd);
>  void iommu_free(struct acpi_drhd_unit *drhd);
> 
> +domid_t did_to_domain_id(const struct vtd_iommu *iommu, unsigned int
> did);
> +
>  int iommu_flush_iec_global(struct vtd_iommu *iommu);
>  int iommu_flush_iec_index(struct vtd_iommu *iommu, u8 im, u16 iidx);
>  void clear_fault_bits(struct vtd_iommu *iommu);
> --- a/xen/drivers/passthrough/vtd/iommu.c
> +++ b/xen/drivers/passthrough/vtd/iommu.c
> @@ -123,15 +123,16 @@ static int context_get_domain_id(const s
> 
>      if ( iommu && context )
>      {
> -        unsigned int nr_dom = cap_ndoms(iommu->cap);
>          unsigned int dom_index = context_domain_id(*context);
> 
> -        if ( dom_index < nr_dom && iommu->domid_map )
> -            domid = iommu->domid_map[dom_index];
> -        else
> +        domid = did_to_domain_id(iommu, dom_index);
> +        if ( domid == DOMID_INVALID )
> +        {
>              dprintk(XENLOG_DEBUG VTDPREFIX,
> -                    "dom_index %u exceeds nr_dom %u or iommu has no
> domid_map\n",
> -                    dom_index, nr_dom);
> +                    "no domid for did %u (nr_dom %u)\n",
> +                    dom_index, cap_ndoms(iommu->cap));
> +            domid = -1;
> +        }
>      }
> 
>      return domid;
> @@ -193,6 +194,14 @@ static void check_cleanup_domid_map(stru
>      }
>  }
> 
> +domid_t did_to_domain_id(const struct vtd_iommu *iommu, unsigned int
> did)
> +{
> +    if ( did >= cap_ndoms(iommu->cap) || !test_bit(did, iommu-
> >domid_bitmap) )
> +        return DOMID_INVALID;
> +
> +    return iommu->domid_map[did];
> +}
> +
>  static void sync_cache(const void *addr, unsigned int size)
>  {
>      static unsigned long clflush_size = 0;
> --- a/xen/drivers/passthrough/vtd/qinval.c
> +++ b/xen/drivers/passthrough/vtd/qinval.c
> @@ -229,10 +229,7 @@ static int __must_check dev_invalidate_s
>      rc = queue_invalidate_wait(iommu, 0, 1, 1, 1);
>      if ( rc == -ETIMEDOUT )
>      {
> -        struct domain *d = NULL;
> -
> -        if ( test_bit(did, iommu->domid_bitmap) )
> -            d = rcu_lock_domain_by_id(iommu->domid_map[did]);
> +        struct domain *d = rcu_lock_domain_by_id(did_to_domain_id(iommu,
> did));
> 
>          /*
>           * In case the domain has been freed or the IOMMU domid bitmap is


 


Rackspace

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