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

[PATCH 1/3] VT-d: prune SAGAW recognition


  • To: "xen-devel@xxxxxxxxxxxxxxxxxxxx" <xen-devel@xxxxxxxxxxxxxxxxxxxx>
  • From: Jan Beulich <jbeulich@xxxxxxxx>
  • Date: Tue, 23 Nov 2021 14:39:38 +0100
  • 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=kTVWcpgaN5RHhZXfVu5ub8/JYsiP0odQFTntwSRApa0=; b=IH2cVGt8Tg6wVdbEgiHhvCcoRCIj5CWZXMUHKO88cXXx96vTEiyAFaQI4p5iv6naNNOM66uALAYz+i9YWQgdZzGFvzCNPiW9rcQEb75Eby0iK4VZ8IGzYKrQjwYmfDv59uOqU5k0Qig1HXRxbC43wrnx2ttY8n54dHPUtXYwR+wzMCKM7sNYZK2mjnsmTrzfekdrvheJqVyWaJNNnJnq8gqZol5aIfSj8ejwSgExEYeisWy2cqrMMuPuiAdOv3rel5OheVfLaugTAqe2gvb5EYHkM57YzqCGO/HDmzLjbsnHh93Y2FPpEmaW0XZo8pmvaZNRMaPt0HSxQ57AGC4ZbA==
  • Arc-seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=B8j9p7I8Wx84jFOj2U8bcWWNLUrr6LbvIXfypckMNEFZ78qZ665pHshKVYxAjRHOv3gDqbxRXyFQzgPf0QEkhFGPHhXvKb4KsQ6JxNxVZUGJ6bzH3n49QJwbWI8UCSnyRyG9WNgbeEtDajYsTwi5MumdqSBxvz3/PAXV4cmmQfIaPKeSf3FoA1UGWEOrlXgsIySwc/A3Xwc4l3ztKW7BcSdDLqih6+Gu7lI8oXNTj0KwXEGG1TXAzXeoOKvc58CzotFOGgb3AXUZHYM8mgTyIJP3YLVEPtbBl2X7WNQEFaM4iOCjPl7xOkUjFj5YqJPP63uhvKu8o1fhQM0KttnK3A==
  • Authentication-results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=suse.com;
  • Cc: Kevin Tian <kevin.tian@xxxxxxxxx>
  • Delivery-date: Tue, 23 Nov 2021 13:39:55 +0000
  • List-id: Xen developer discussion <xen-devel.lists.xenproject.org>

Bit 0 of the capability register field has become reserved at or before
spec version 2.2. Treat it as such. Replace the effective open-coding of
find_first_set_bit(). Adjust local variable types.

Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx>
---
Strictly speaking IOMMUs supporting only 3-level tables ought to result
in guests seeing a suitably reduced physical address width in CPUID.
And then the same would apply to restrictions resulting from MGAW.

--- a/xen/drivers/passthrough/vtd/iommu.c
+++ b/xen/drivers/passthrough/vtd/iommu.c
@@ -356,7 +356,7 @@ static uint64_t domain_pgd_maddr(struct
         pgd_maddr = hd->arch.vtd.pgd_maddr;
     }
 
-    /* Skip top levels of page tables for 2- and 3-level DRHDs. */
+    /* Skip top level(s) of page tables for less-than-maximum level DRHDs. */
     for ( agaw = level_to_agaw(4);
           agaw != level_to_agaw(nr_pt_levels);
           agaw-- )
@@ -1183,8 +1183,7 @@ static int __init iommu_set_interrupt(st
 int __init iommu_alloc(struct acpi_drhd_unit *drhd)
 {
     struct vtd_iommu *iommu;
-    unsigned long sagaw, nr_dom;
-    int agaw;
+    unsigned int sagaw, agaw = 0, nr_dom;
 
     iommu = xzalloc(struct vtd_iommu);
     if ( iommu == NULL )
@@ -1237,14 +1236,13 @@ int __init iommu_alloc(struct acpi_drhd_
         return -ENODEV;
     }
 
-    /* Calculate number of pagetable levels: between 2 and 4. */
+    /* Calculate number of pagetable levels: 3 or 4. */
     sagaw = cap_sagaw(iommu->cap);
-    for ( agaw = level_to_agaw(4); agaw >= 0; agaw-- )
-        if ( test_bit(agaw, &sagaw) )
-            break;
-    if ( agaw < 0 )
+    if ( sagaw & 6 )
+        agaw = find_first_set_bit(sagaw & 6);
+    if ( !agaw )
     {
-        printk(XENLOG_ERR VTDPREFIX "IOMMU: unsupported sagaw %lx\n", sagaw);
+        printk(XENLOG_ERR VTDPREFIX "IOMMU: unsupported sagaw %x\n", sagaw);
         print_iommu_regs(drhd);
         return -ENODEV;
     }




 


Rackspace

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