Hi Neo,
On Fri, Mar 4, 2016 at 3:00 PM, Neo Jia <[email protected]> wrote:
> On Wed, Mar 02, 2016 at 04:38:34PM +0800, Jike Song wrote:
>> On 02/24/2016 12:24 AM, Kirti Wankhede wrote:
>> > + vgpu_dma->size = map->size;
>> > +
>> > + vgpu_link_dma(vgpu_iommu, vgpu_dma);
>>
>> Hi Kirti & Neo,
>>
>> seems that no one actually setup mappings for IOMMU here?
>>
>
> Hi Jike,
>
> Yes.
>
> The actual mapping should be done by the host kernel driver after calling the
> translation/pinning API vgpu_dma_do_translate.
Thanks for the reply. I mis-deleted the mail in my intel account, so
reply with private mail account, sorry for that.
In vgpu_dma_do_translate():
for (i = 0; i < count; i++) {
{snip}
dma_addr_t iova = gfn_buffer[i] << PAGE_SHIFT;
vgpu_dma = vgpu_find_dma(vgpu_iommu, iova, 0 /* size */);
remote_vaddr = vgpu_dma->vaddr + iova - vgpu_dma->iova;
if (get_user_pages_unlocked(NULL, mm, remote_vaddr, 1, 1, 0, page) == 1) {
pfn = page_to_pfn(page[0]);
}
gfn_buffer[i] = pfn;
}
If I understand correctly, the purpose of above code, is given an
array of gfns, try to pin & return associated pfns. There is still no
IOMMU mappings here. Is it supposed to be the caller who should set
up IOMMU by DMA api such as dma_map_page(), after calling
vgpu_dma_do_translate()?
--
Thanks,
Jike