<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:#0563C1;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:#954F72;
        text-decoration:underline;}
pre
        {mso-style-priority:99;
        mso-style-link:"HTML Preformatted Char";
        margin:0in;
        margin-bottom:.0001pt;
        font-size:10.0pt;
        font-family:"Courier New";}
p.MsoListParagraph, li.MsoListParagraph, div.MsoListParagraph
        {mso-style-priority:34;
        margin-top:0in;
        margin-right:0in;
        margin-bottom:0in;
        margin-left:.5in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
span.EmailStyle17
        {mso-style-type:personal-compose;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
span.pl-k
        {mso-style-name:pl-k;}
span.pl-c
        {mso-style-name:pl-c;}
span.pl-c1
        {mso-style-name:pl-c1;}
span.pl-s
        {mso-style-name:pl-s;}
span.pl-pds
        {mso-style-name:pl-pds;}
span.pl-smi
        {mso-style-name:pl-smi;}
span.pl-en
        {mso-style-name:pl-en;}
span.HTMLPreformattedChar
        {mso-style-name:"HTML Preformatted Char";
        mso-style-priority:99;
        mso-style-link:"HTML Preformatted";
        font-family:"Courier New";}
.MsoChpDefault
        {mso-style-type:export-only;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
/* List Definitions */
@list l0
        {mso-list-id:237440891;
        mso-list-type:hybrid;
        mso-list-template-ids:-788641520 67698703 67698713 67698715 67698703 67698713 67698715 67698703 67698713 67698715;}
@list l0:level1
        {mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l0:level2
        {mso-level-number-format:alpha-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l0:level3
        {mso-level-number-format:roman-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:right;
        text-indent:-9.0pt;}
@list l0:level4
        {mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l0:level5
        {mso-level-number-format:alpha-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l0:level6
        {mso-level-number-format:roman-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:right;
        text-indent:-9.0pt;}
@list l0:level7
        {mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l0:level8
        {mso-level-number-format:alpha-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l0:level9
        {mso-level-number-format:roman-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:right;
        text-indent:-9.0pt;}
@list l1
        {mso-list-id:513155815;
        mso-list-type:hybrid;
        mso-list-template-ids:1129371360 67698703 67698713 67698715 67698703 67698713 67698715 67698703 67698713 67698715;}
@list l1:level1
        {mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l1:level2
        {mso-level-number-format:alpha-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l1:level3
        {mso-level-number-format:roman-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:right;
        text-indent:-9.0pt;}
@list l1:level4
        {mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l1:level5
        {mso-level-number-format:alpha-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l1:level6
        {mso-level-number-format:roman-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:right;
        text-indent:-9.0pt;}
@list l1:level7
        {mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l1:level8
        {mso-level-number-format:alpha-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l1:level9
        {mso-level-number-format:roman-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:right;
        text-indent:-9.0pt;}
ol
        {margin-bottom:0in;}
ul
        {margin-bottom:0in;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-US" link="#0563C1" vlink="#954F72">
<div class="WordSection1">
<p class="MsoNormal">Hi,<o:p></o:p></p>
<p class="MsoNormal">I have some doubts in registering different types of memory for dma using vfio. Currently I have 4.15 kernel and have attached P4800X to vfio.<o:p></o:p></p>
<p class="MsoNormal">I followed the examples in the vfio kernel doc at (<a href="https://www.kernel.org/doc/Documentation/vfio.txt">https://www.kernel.org/doc/Documentation/vfio.txt</a>). Everything is fine with anonymous mapped memory in the example. I also
 tried to  register two other types of memory: <o:p></o:p></p>
<ol style="margin-top:0in" start="1" type="1">
<li class="MsoListParagraph" style="margin-left:0in;mso-list:l0 level1 lfo1">Mapped from device dax.<o:p></o:p></li><li class="MsoListParagraph" style="margin-left:0in;mso-list:l0 level1 lfo1">Kernel memory memory exposed to userspace using remap_pfn_range.
<o:p></o:p></li></ol>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">```<o:p></o:p></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">  switch (mem_type) {<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">  case MEM_TYPE_DEVDAX:<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">    // https://github.com/axboe/fio/blob/master/engines/dev-dax.c<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">    fd = open("/dev/dax0.0", O_RDWR, 0666);<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">    assert(fd != -1);<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">    ptr = mmap(NULL, map_size, PROT_READ | PROT_WRITE,<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">               MAP_SHARED, fd, 0);<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">    assert(ptr != MAP_FAILED);<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">    // memset(ptr, 0xff, map_size);<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New""><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">    break;<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New""><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">  case MEM_TYPE_DUMMYMAP:<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">    fd = open("/dev/dummymap", O_RDWR, 0666); // see below for dummymap kernel module<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">    assert(fd != -1);<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">    ptr = mmap(target_addr, map_size, PROT_READ | PROT_WRITE,<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">               MAP_SHARED | MAP_FIXED, fd, 0);<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">    assert(ptr != MAP_FAILED);<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">    // memset(ptr, 0xff, map_size);<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New""><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">    break;<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">  case MEM_TYPE_ANON_REGULAR:<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">  default:<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">    ptr = mmap(target_addr, map_size, PROT_READ | PROT_WRITE,<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">                         MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, 0, 0);<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">    assert(ptr != MAP_FAILED);<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">  }<o:p></o:p></span></p>
<pre>  dma_map.vaddr = ptr;<o:p></o:p></pre>
<pre>  dma_map.size = map_size;<o:p></o:p></pre>
<pre>  dma_map.iova = 0x900000000; /* 1MB starting at 0x900000000 from device view */<o:p></o:p></pre>
<pre>  dma_map.flags = VFIO_DMA_MAP_FLAG_READ | VFIO_DMA_MAP_FLAG_WRITE;<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>  if (0 > ioctl(container, VFIO_IOMMU_MAP_DMA, &dma_map)) {<o:p></o:p></pre>
<pre>    PERR("VFIO_IO_MMU_MAP_DMA failed with errno %s", strerror(errno));<o:p></o:p></pre>
<pre>    return -1;<o:p></o:p></pre>
<pre>  } else {<o:p></o:p></pre>
<pre>    PINF("DMA memory setup succeed!");<o:p></o:p></pre>
<pre>  }<o:p></o:p></pre>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New""><o:p> </o:p></span></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">```<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">The “dummy map” is a kernel module which allocates kernel memory and map it to user space using remap_pfn_range:<o:p></o:p></p>
<p class="MsoNormal">```<o:p></o:p></p>
<pre>static int fop_mmap(struct file *file, struct vm_area_struct *vma) {<o:p></o:p></pre>
<pre>  size_t map_size;<o:p></o:p></pre>
<pre>  void *dma_virtaddr;<o:p></o:p></pre>
<pre>  // dma_addr_t dma_handle;<o:p></o:p></pre>
<pre>  map_size = vma->vm_end - vma->vm_start;<o:p></o:p></pre>
<pre>  printk(KERN_INFO "dummy map mmap called!\n");<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>  /*dma_virtaddr = dma_alloc_coherent(dummymap_dev.this_device, map_size,*/<o:p></o:p></pre>
<pre>                                    /*&dma_handle, GFP_KERNEL);*/<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>  dma_virtaddr = kmalloc(map_size, GFP_KERNEL);<o:p></o:p></pre>
<pre>  if (!dma_virtaddr) {<o:p></o:p></pre>
<pre>    printk(KERN_ERR "dummy map failed in  memory allocation");<o:p></o:p></pre>
<pre>    return -ENOMEM;<o:p></o:p></pre>
<pre>  }<o:p></o:p></pre>
<pre>  vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>  if (remap_pfn_range(vma, vma->vm_start,<o:p></o:p></pre>
<pre>                      virt_to_phys(dma_virtaddr) >> PAGE_SHIFT, map_size,<o:p></o:p></pre>
<pre>                      vma->vm_page_prot))<o:p></o:p></pre>
<pre>    return -ENOMEM;<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>  vma->vm_ops = &dummymap_fops;<o:p></o:p></pre>
<pre>  vm_open(vma);<o:p></o:p></pre>
<pre>  pr_info("dummy map succeed");<o:p></o:p></pre>
<pre>  return 0;<o:p></o:p></pre>
<pre>}<o:p></o:p></pre>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">```<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">What happened is <o:p></o:p></p>
<ol style="margin-top:0in" start="1" type="1">
<li class="MsoListParagraph" style="margin-left:0in;mso-list:l1 level1 lfo2">the “devdax” registration seems to succeed.  I will do further tests on actual DMA. (I hope I am doing the right thing, am I?)
<o:p></o:p></li><li class="MsoListParagraph" style="margin-left:0in;mso-list:l1 level1 lfo2">The “dummy map” approach failed at the VFIO_IOMMU_MAP_DMA ioctl (with errno = -14), I guess it violated some memory requirements for DMA using vfio, does anyone have any suggestions
 on this?.    <o:p></o:p></li></ol>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">I tracked into the kernel source and found out that the vaddr_get_pfn requires Pg_reserved bit set for VM_PFNMAP mappings(which is set from remap_pfn_range)… So I guess I needs somehow allocate memory with Pg_reserved set, but how?<o:p></o:p></p>
<p class="MsoNormal">I also left my code in <a href="https://github.com/fengggli/dumymap/commit/c562cd863ec0f6d921a7ae42ecfad0dbfc9d9d0b">
https://github.com/fengggli/dumymap/commit/c562cd863ec0f6d921a7ae42ecfad0dbfc9d9d0b</a> , if anyone wants to have a try.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Thanks<o:p></o:p></p>
<p class="MsoNormal">Feng Li<o:p></o:p></p>
<p class="MsoNormal"><o:p></o:p></p>
</div>
</body>
</html>