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

[PATCH v7 1/8] AMD/IOMMU: check / convert IVMD ranges for being / to be reserved


  • To: "xen-devel@xxxxxxxxxxxxxxxxxxxx" <xen-devel@xxxxxxxxxxxxxxxxxxxx>
  • From: Jan Beulich <jbeulich@xxxxxxxx>
  • Date: Thu, 26 Aug 2021 09:23:01 +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-SenderADCheck; bh=uF1wv1gdmsz5Xtdqg+XbsQZg1yCtv7jjQCf7Xzg5lVM=; b=cv3xNnaw5kPNFQEoq303t49hgqRiVhegNAipT/rIginw5CIk6l1qLHpHf/k/YZAth6QSY8iC0FwuPE1Rb5fHIR6bEUqY4Tlswo8L3oAYauoRNgYdy1i4WB1d8g8MoNF8Ag1RFPNrzcJZm6gvfBD9R/xTKuc7b/vPyA5uxfhQnA2/vx2YWKbomt8gU9I7sO7vugkLdQ2pfzXzp0CLUIghtKs3UaloUZrfQrxD3vZymoR5aHAVNUsBJbXyZq5AZAelF8HNvcAQSOUKwcK0t7wDgEiCZWbpCxSlqdxU+v8KjOgimS1dw7DDmDoZkv2U7gu5rgTVu8vuU2265DPnizfhWg==
  • Arc-seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=IuWsx2RdGja91hF+qmMJ4/2Z5xLB1Zx8P0gP0IaLXgNJ8O4Sija4bsO3pISdJQpXFCG1YWdtnFsJUuZSRbOZPaizcIpEhCkiUhtLCHWDD0nzOZdwN+6vmIDXMPmTqYAp+kBCllC7YQllHF+OfzxfpqnvtNnWVz7HB/J4hONPJe4VdG4lh4IUHkRHnyK0PW7suNuA4uUikFLLZSoH8LdaEwTpsAQq/BI4qRV1V/3AU/CZrx9mRMIx4AuJXg0eHy2/WgdV5M5oco1/d5n20I5zkagUK8HxeQCVCd3TECyM7UwS49QTato+NZrMK/sdJKm5LEJsiUTlKCR+iutAMw1n1A==
  • Authentication-results: xen.org; dkim=none (message not signed) header.d=none;xen.org; dmarc=none action=none header.from=suse.com;
  • Cc: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>, Paul Durrant <paul@xxxxxxx>
  • Delivery-date: Thu, 26 Aug 2021 07:23:10 +0000
  • List-id: Xen developer discussion <xen-devel.lists.xenproject.org>

While the specification doesn't say so, just like for VT-d's RMRRs no
good can come from these ranges being e.g. conventional RAM or entirely
unmarked and hence usable for placing e.g. PCI device BARs. Check
whether they are, and put in some limited effort to convert to reserved.
(More advanced logic can be added if actual problems are found with this
simplistic variant.)

Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx>
Reviewed-by: Paul Durrant <paul@xxxxxxx>
---
v7: Re-base.
v5: New.

--- a/xen/drivers/passthrough/amd/iommu_acpi.c
+++ b/xen/drivers/passthrough/amd/iommu_acpi.c
@@ -384,6 +384,38 @@ static int __init parse_ivmd_block(const
     AMD_IOMMU_DEBUG("IVMD Block: type %#x phys %#lx len %#lx\n",
                     ivmd_block->header.type, start_addr, mem_length);
 
+    if ( !e820_all_mapped(base, limit + PAGE_SIZE, E820_RESERVED) )
+    {
+        paddr_t addr;
+
+        AMD_IOMMU_DEBUG("IVMD: [%lx,%lx) is not (entirely) in reserved 
memory\n",
+                        base, limit + PAGE_SIZE);
+
+        for ( addr = base; addr <= limit; addr += PAGE_SIZE )
+        {
+            unsigned int type = page_get_ram_type(maddr_to_mfn(addr));
+
+            if ( type == RAM_TYPE_UNKNOWN )
+            {
+                if ( e820_add_range(&e820, addr, addr + PAGE_SIZE,
+                                    E820_RESERVED) )
+                    continue;
+                AMD_IOMMU_DEBUG("IVMD Error: Page at %lx couldn't be 
reserved\n",
+                                addr);
+                return -EIO;
+            }
+
+            /* Types which won't be handed out are considered good enough. */
+            if ( !(type & (RAM_TYPE_RESERVED | RAM_TYPE_ACPI |
+                           RAM_TYPE_UNUSABLE)) )
+                continue;
+
+            AMD_IOMMU_DEBUG("IVMD Error: Page at %lx can't be converted\n",
+                            addr);
+            return -EIO;
+        }
+    }
+
     if ( ivmd_block->header.flags & ACPI_IVMD_EXCLUSION_RANGE )
         exclusion = true;
     else if ( ivmd_block->header.flags & ACPI_IVMD_UNITY )




 


Rackspace

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