From mboxrd@z Thu Jan 1 00:00:00 1970 From: Andrew Cooper Subject: Re: [PATCH] VT-d: print_vtd_entries() should cope with superpages Date: Fri, 27 Feb 2015 10:41:46 +0000 Message-ID: <54F049EA.9060904@citrix.com> References: <54F04C5602000078000647B4@mail.emea.novell.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="===============0369391010586393277==" Return-path: Received: from mail6.bemta3.messagelabs.com ([195.245.230.39]) by lists.xen.org with esmtp (Exim 4.72) (envelope-from ) id 1YRIN9-00078g-9l for xen-devel@lists.xenproject.org; Fri, 27 Feb 2015 10:42:19 +0000 In-Reply-To: <54F04C5602000078000647B4@mail.emea.novell.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: Jan Beulich , xen-devel Cc: Yang Z Zhang , Kevin Tian , Roger Pau Monne List-Id: xen-devel@lists.xenproject.org --===============0369391010586393277== Content-Type: multipart/alternative; boundary="------------040200080604080201020105" --------------040200080604080201020105 Content-Type: text/plain; charset="windows-1252" Content-Transfer-Encoding: 7bit On 27/02/15 09:52, Jan Beulich wrote: > Even if VT-d code alone (i.e. when not sharing tables with EPT) still > doesn't support superpages, this function - invoked upon DMA remapping > faults - needs to cope with such. > > While at it also replace a few more plain numbers with suitable named > constants. > > Signed-off-by: Jan Beulich Reviewed-by: Andrew Cooper > > --- a/xen/drivers/passthrough/vtd/iommu.h > +++ b/xen/drivers/passthrough/vtd/iommu.h > @@ -268,18 +268,22 @@ struct dma_pte { > }; > #define DMA_PTE_READ (1) > #define DMA_PTE_WRITE (2) > +#define DMA_PTE_PROT (DMA_PTE_READ | DMA_PTE_WRITE) > +#define DMA_PTE_SP (1 << 7) > #define DMA_PTE_SNP (1 << 11) > #define dma_clear_pte(p) do {(p).val = 0;} while(0) > #define dma_set_pte_readable(p) do {(p).val |= DMA_PTE_READ;} while(0) > #define dma_set_pte_writable(p) do {(p).val |= DMA_PTE_WRITE;} while(0) > -#define dma_set_pte_superpage(p) do {(p).val |= (1 << 7);} while(0) > +#define dma_set_pte_superpage(p) do {(p).val |= DMA_PTE_SP;} while(0) > #define dma_set_pte_snp(p) do {(p).val |= DMA_PTE_SNP;} while(0) > -#define dma_set_pte_prot(p, prot) \ > - do {(p).val = ((p).val & ~3) | ((prot) & 3); } while (0) > +#define dma_set_pte_prot(p, prot) do { \ > + (p).val = ((p).val & ~DMA_PTE_PROT) | ((prot) & DMA_PTE_PROT); \ > + } while (0) > #define dma_pte_addr(p) ((p).val & PADDR_MASK & PAGE_MASK_4K) > #define dma_set_pte_addr(p, addr) do {\ > (p).val |= ((addr) & PAGE_MASK_4K); } while (0) > -#define dma_pte_present(p) (((p).val & 3) != 0) > +#define dma_pte_present(p) (((p).val & DMA_PTE_PROT) != 0) > +#define dma_pte_superpage(p) (((p).val & DMA_PTE_SP) != 0) > > /* interrupt remap entry */ > struct iremap_entry { > --- a/xen/drivers/passthrough/vtd/utils.c > +++ b/xen/drivers/passthrough/vtd/utils.c > @@ -179,6 +179,8 @@ void print_vtd_entries(struct iommu *iom > printk(" l%d[%x] not present\n", level, l_index); > break; > } > + if ( dma_pte_superpage(pte) ) > + break; > val = dma_pte_addr(pte); > } while ( --level ); > } > > > > > > _______________________________________________ > Xen-devel mailing list > Xen-devel@lists.xen.org > http://lists.xen.org/xen-devel --------------040200080604080201020105 Content-Type: text/html; charset="windows-1252" Content-Transfer-Encoding: 7bit
On 27/02/15 09:52, Jan Beulich wrote:
Even if VT-d code alone (i.e. when not sharing tables with EPT) still
doesn't support superpages, this function - invoked upon DMA remapping
faults - needs to cope with such.

While at it also replace a few more plain numbers with suitable named
constants.

Signed-off-by: Jan Beulich <jbeulich@suse.com>

Reviewed-by: Andrew Cooper <andrew.cooper3@citrix.com>


--- a/xen/drivers/passthrough/vtd/iommu.h
+++ b/xen/drivers/passthrough/vtd/iommu.h
@@ -268,18 +268,22 @@ struct dma_pte {
 };
 #define DMA_PTE_READ (1)
 #define DMA_PTE_WRITE (2)
+#define DMA_PTE_PROT (DMA_PTE_READ | DMA_PTE_WRITE)
+#define DMA_PTE_SP   (1 << 7)
 #define DMA_PTE_SNP  (1 << 11)
 #define dma_clear_pte(p)    do {(p).val = 0;} while(0)
 #define dma_set_pte_readable(p) do {(p).val |= DMA_PTE_READ;} while(0)
 #define dma_set_pte_writable(p) do {(p).val |= DMA_PTE_WRITE;} while(0)
-#define dma_set_pte_superpage(p) do {(p).val |= (1 << 7);} while(0)
+#define dma_set_pte_superpage(p) do {(p).val |= DMA_PTE_SP;} while(0)
 #define dma_set_pte_snp(p)  do {(p).val |= DMA_PTE_SNP;} while(0)
-#define dma_set_pte_prot(p, prot) \
-            do {(p).val = ((p).val & ~3) | ((prot) & 3); } while (0)
+#define dma_set_pte_prot(p, prot) do { \
+        (p).val = ((p).val & ~DMA_PTE_PROT) | ((prot) & DMA_PTE_PROT); \
+    } while (0)
 #define dma_pte_addr(p) ((p).val & PADDR_MASK & PAGE_MASK_4K)
 #define dma_set_pte_addr(p, addr) do {\
             (p).val |= ((addr) & PAGE_MASK_4K); } while (0)
-#define dma_pte_present(p) (((p).val & 3) != 0)
+#define dma_pte_present(p) (((p).val & DMA_PTE_PROT) != 0)
+#define dma_pte_superpage(p) (((p).val & DMA_PTE_SP) != 0)
 
 /* interrupt remap entry */
 struct iremap_entry {
--- a/xen/drivers/passthrough/vtd/utils.c
+++ b/xen/drivers/passthrough/vtd/utils.c
@@ -179,6 +179,8 @@ void print_vtd_entries(struct iommu *iom
             printk("    l%d[%x] not present\n", level, l_index);
             break;
         }
+        if ( dma_pte_superpage(pte) )
+            break;
         val = dma_pte_addr(pte);
     } while ( --level );
 }





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

--------------040200080604080201020105-- --===============0369391010586393277== Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline _______________________________________________ Xen-devel mailing list Xen-devel@lists.xen.org http://lists.xen.org/xen-devel --===============0369391010586393277==--