Re: [vfio-users] VFIO_IOMMU_MAP_DMA succeeds only on second try?

2018-03-12 Thread Alex Williamson
On Mon, 12 Mar 2018 15:18:30 +0100
Oliver Heid  wrote:

> Many thanks!
> 
> mmap succeeds - I removed the checks only to post the code on this list. 
> I use this now:
> 
>      if ( !ioctl(container, VFIO_IOMMU_MAP_DMA, &dma_map) )
>      {    if ( !ioctl(container, VFIO_IOMMU_MAP_DMA, &dma_map) )
>   {   perror("mmap ioctl"); return 1; }
>      }
> 

Um, the ioctl returns zero on success, as most ioctls do.  Your test
only reaches the perror if it's able to successfully dma map the same
area twice, so yeah, I would expect that never "fails".

___
vfio-users mailing list
vfio-users@redhat.com
https://www.redhat.com/mailman/listinfo/vfio-users


Re: [vfio-users] VFIO_IOMMU_MAP_DMA succeeds only on second try?

2018-03-12 Thread Oliver Heid

Many thanks!

mmap succeeds - I removed the checks only to post the code on this list. 
I use this now:


    if ( !ioctl(container, VFIO_IOMMU_MAP_DMA, &dma_map) )
    {    if ( !ioctl(container, VFIO_IOMMU_MAP_DMA, &dma_map) )
 {   perror("mmap ioctl"); return 1; }
    }

It mostly succeeds only on second try but I never needed more than two 
tries. So it's ok.


Re. IOMMU type 1 recognition: You are right: It is independent of kernel 
version. It seems to be related to auto-loading vfio_pci via 
/etc/modules.conf. Installing the module later gets it working.





*From:* Alex Williamson <mailto:alex.william...@redhat.com>
*Sent:* Monday, March 12, 2018 6:57AM
*To:* Heid, Oliver <mailto:oliver.h...@h-next.de>
*Cc:* Vfio-users <mailto:vfio-users@redhat.com>
*Subject:* Re: [vfio-users] VFIO_IOMMU_MAP_DMA succeeds only on second try?


On Mon, 5 Mar 2018 12:37:24 +0100
Oliver Heid  wrote:


Do I miss something here? I want to allow RW access of a peripheral
device to a memory region via

      struct vfio_iommu_type1_dma_map dma_map = { .argsz = sizeof(dma_map) };

      __u32* mem = (__u32*)mmap(NULL,size,PROT_READ|PROT_WRITE,
MAP_SHARED|MAP_ANONYMOUS|MAP_LOCKED, -1, 0);

      dma_map.argsz = sizeof(dma_map);
      dma_map.flags = VFIO_DMA_MAP_FLAG_READ | VFIO_DMA_MAP_FLAG_WRITE;
      dma_map.vaddr = (__u64)mem;
      dma_map.iova  = 0;
      dma_map.size  = size;

      ioctl(container, VFIO_IOMMU_MAP_DMA, &dma_map);

Any idea why theVFIO_IOMMU_MAP_DMA ioctl fails with EINVAL, but then a
second, identical call succeeds? Does it actually succeed then? QEMU
re-tries if the first attempt fails with EBUSY, but not with EINVAL.


I don't think the QEMU -EBUSY behavior is related, that handles
previous mappings and may no longer even be necessary.  One of my unit
tests[1] does a similar map with no issues.  Your code excerpt doesn't
check whether mmap succeeds, so for all we know mmap is failing too.


The latest 4.15.7 kernel (4.15.6 too IIRC) does not recognize the AMD
Ryzen 3 1200 as  VFIO_TYPE1_IOMMU so I am using version 4.15.4.


This doesn't make sense, anything implementing the kernel's IOMMU API in
the kernel is compatible with type1, that includes anything supporting
AMD-Vi.  There is no whitelist or specific processor support
selection.  There are no iommu or vfio changes between the kernels
you're quoting, perhaps you could do a bisect.  Thanks,

Alex

[1] https://github.com/awilliam/tests/blob/master/vfio-iommu-map-unmap.c


___
vfio-users mailing list
vfio-users@redhat.com
https://www.redhat.com/mailman/listinfo/vfio-users


Re: [vfio-users] VFIO_IOMMU_MAP_DMA succeeds only on second try?

2018-03-11 Thread Alex Williamson
On Mon, 5 Mar 2018 12:37:24 +0100
Oliver Heid  wrote:

> Do I miss something here? I want to allow RW access of a peripheral 
> device to a memory region via
> 
>      struct vfio_iommu_type1_dma_map dma_map = { .argsz = sizeof(dma_map) };
> 
>      __u32* mem = (__u32*)mmap(NULL,size,PROT_READ|PROT_WRITE, 
> MAP_SHARED|MAP_ANONYMOUS|MAP_LOCKED, -1, 0);
> 
>      dma_map.argsz = sizeof(dma_map);
>      dma_map.flags = VFIO_DMA_MAP_FLAG_READ | VFIO_DMA_MAP_FLAG_WRITE;
>      dma_map.vaddr = (__u64)mem;
>      dma_map.iova  = 0;
>      dma_map.size  = size;
> 
>      ioctl(container, VFIO_IOMMU_MAP_DMA, &dma_map);
> 
> Any idea why theVFIO_IOMMU_MAP_DMA ioctl fails with EINVAL, but then a 
> second, identical call succeeds? Does it actually succeed then? QEMU 
> re-tries if the first attempt fails with EBUSY, but not with EINVAL.

I don't think the QEMU -EBUSY behavior is related, that handles
previous mappings and may no longer even be necessary.  One of my unit
tests[1] does a similar map with no issues.  Your code excerpt doesn't
check whether mmap succeeds, so for all we know mmap is failing too.

> The latest 4.15.7 kernel (4.15.6 too IIRC) does not recognize the AMD 
> Ryzen 3 1200 as  VFIO_TYPE1_IOMMU so I am using version 4.15.4.

This doesn't make sense, anything implementing the kernel's IOMMU API in
the kernel is compatible with type1, that includes anything supporting
AMD-Vi.  There is no whitelist or specific processor support
selection.  There are no iommu or vfio changes between the kernels
you're quoting, perhaps you could do a bisect.  Thanks,

Alex

[1] https://github.com/awilliam/tests/blob/master/vfio-iommu-map-unmap.c

___
vfio-users mailing list
vfio-users@redhat.com
https://www.redhat.com/mailman/listinfo/vfio-users