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

Re: [Xen-devel] [PATCH for 4.6] VT-d: Create IOMMU mappings for RMRR regions if shared EPT is not being used



On 8/27/2015 4:40 PM, Malcolm Crossley wrote:
On 27/08/15 03:59, Chen, Tiejun wrote:
This kind of issue is already gone.

https://www.mail-archive.com/xen-devel@xxxxxxxxxxxxx/msg32464.html

There is a bug in the code you refer to above which results in no IOMMU page 
table
mappings being created if the guest domain is not sharing it's EPT page tables 
with
the IOMMU.

set_identity_p2m_entry only configures the EPT page tables and does not 
configure
the IOMMU page tables.

Okay, I got what you mean.

Instead, could you insert iommu_{map,unmap_page() into {set,clear}_identity_p2m_entry()? I think this can make {set,clear}_identity_p2m_entry approachable in all circumstances.

Kevin and Jan,

Is this fine?

Thanks
Tiejun


We had a real world regression (with xen 4.6-rc1) on a Intel Haswell system with
integrated graphics.

The patch below resolves the regression.

Malcolm


Thanks
Tiejun

On 8/26/2015 11:49 PM, Malcolm Crossley wrote:
Add RMRR 1:1 IOMMU mappings to IOMMU page tables if EPT page table are not being
shared with the IOMMU.

This is a regression in behaviour versus Xen 4.5.

Signed-off-by: Malcolm Crossley <malcolm.crossley@xxxxxxxxxx>
---
  xen/drivers/passthrough/vtd/iommu.c | 23 ++++++++++++++++++++---
  1 file changed, 20 insertions(+), 3 deletions(-)

diff --git a/xen/drivers/passthrough/vtd/iommu.c 
b/xen/drivers/passthrough/vtd/iommu.c
index 836aed5..89de741 100644
--- a/xen/drivers/passthrough/vtd/iommu.c
+++ b/xen/drivers/passthrough/vtd/iommu.c
@@ -1839,8 +1839,16 @@ static int rmrr_identity_mapping(struct domain *d, 
bool_t map,

              while ( base_pfn < end_pfn )
              {
-                if (   (d, base_pfn) )
-                    ret = -ENXIO;
+                if ( iommu_use_hap_pt(d) )
+                {
+                    if ( clear_identity_p2m_entry(d, base_pfn) )
+                            ret = -ENXIO;
+                }
+                else
+                {
+                    if ( intel_iommu_unmap_page(d, base_pfn) )
+                        ret = -ENXIO;
+                }
                  base_pfn++;
              }

@@ -1855,7 +1863,16 @@ static int rmrr_identity_mapping(struct domain *d, 
bool_t map,

      while ( base_pfn < end_pfn )
      {
-        int err = set_identity_p2m_entry(d, base_pfn, p2m_access_rw, flag);
+        int err;
+        if ( iommu_use_hap_pt(d) )
+        {
+            err = set_identity_p2m_entry(d, base_pfn, p2m_access_rw, flag);
+        }
+        else
+        {
+            err = intel_iommu_map_page(d, base_pfn, base_pfn,
+                                       IOMMUF_readable|IOMMUF_writable);
+        }

          if ( err )
              return err;




_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

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