From mboxrd@z Thu Jan 1 00:00:00 1970 From: Malcolm Crossley Subject: Re: [PATCH for 4.6] VT-d: Create IOMMU mappings for RMRR regions if shared EPT is not being used Date: Thu, 27 Aug 2015 09:40:58 +0100 Message-ID: <55DECD1A.8020704@citrix.com> References: <1440604165-23738-1-git-send-email-malcolm.crossley@citrix.com> <55DE7D2F.90105@intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: Received: from mail6.bemta14.messagelabs.com ([193.109.254.103]) by lists.xen.org with esmtp (Exim 4.72) (envelope-from ) id 1ZUsk3-0003M7-9U for xen-devel@lists.xenproject.org; Thu, 27 Aug 2015 08:41:03 +0000 In-Reply-To: <55DE7D2F.90105@intel.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org To: "Chen, Tiejun" , xen-devel@lists.xenproject.org Cc: yang.z.zhang@intel.com, kevin.tian@intel.com, JBeulich@suse.com List-Id: xen-devel@lists.xenproject.org On 27/08/15 03:59, Chen, Tiejun wrote: > This kind of issue is already gone. > > https://www.mail-archive.com/xen-devel@lists.xen.org/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. 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 >> --- >> 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 ( clear_identity_p2m_entry(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; >>