eal/vfio: fix sPAPR IOMMU mapping
Checks
Commit Message
Commit 73a639085938 ("vfio: allow to map other memory regions")
introduced a bug in sPAPR IOMMU mapping. The commit removed necessary
ioctl with VFIO_IOMMU_SPAPR_REGISTER_MEMORY. Also, vfio_spapr_map_walk
should call vfio_spapr_dma_do_map instead of vfio_spapr_dma_mem_map.
Fixes: 73a639085938 ("vfio: allow to map other memory regions")
Signed-off-by: Takeshi Yoshimura <tyos@jp.ibm.com>
---
lib/librte_eal/linuxapp/eal/eal_vfio.c | 23 +++++++++++++++--------
1 file changed, 15 insertions(+), 8 deletions(-)
Comments
06/08/2018 10:43, Takeshi Yoshimura:
> Commit 73a639085938 ("vfio: allow to map other memory regions")
> introduced a bug in sPAPR IOMMU mapping. The commit removed necessary
> ioctl with VFIO_IOMMU_SPAPR_REGISTER_MEMORY. Also, vfio_spapr_map_walk
> should call vfio_spapr_dma_do_map instead of vfio_spapr_dma_mem_map.
This is fixing an old patch:
http://git.dpdk.org/dpdk/commit/?id=73a639085938
> Fixes: 73a639085938 ("vfio: allow to map other memory regions")
You probably want it to be backported in previous release,
so you need to add Cc: stable@dpdk.org
> Signed-off-by: Takeshi Yoshimura <tyos@jp.ibm.com>
It is common to have bugs in sPAPR implementation.
How can we be sure this one is OK?
Should it be added in last minute of 18.08?
Or can it wait 18.11?
Adding Anatoly and Chao who are maintainers to decide.
>06/08/2018 10:43, Takeshi Yoshimura:
>> Commit 73a639085938 ("vfio: allow to map other memory regions")
>> introduced a bug in sPAPR IOMMU mapping. The commit removed
>necessary
>> ioctl with VFIO_IOMMU_SPAPR_REGISTER_MEMORY. Also,
>vfio_spapr_map_walk
>> should call vfio_spapr_dma_do_map instead of
>vfio_spapr_dma_mem_map.
>
>This is fixing an old patch:
> INVALID URI REMOVED
>k_commit_-3Fid-3D73a639085938&d=DwICAg&c=jf_iaSHvJObTbx-siA1ZOg&r=EZR
>6Jx10q0q3dTopeH3WIQ&m=JqmiDyEAYS0sG-jH6aSYikeyXYLr12jnaWDUpBN1mgI&s=7
>bvq2dyXbquauFqqhuOTPVOpoqEPKg8MoncacU4OdJU&e=
>
>> Fixes: 73a639085938 ("vfio: allow to map other memory regions")
>
>You probably want it to be backported in previous release,
>so you need to add Cc: stable@dpdk.org
>
>> Signed-off-by: Takeshi Yoshimura <tyos@jp.ibm.com>
>
>It is common to have bugs in sPAPR implementation.
>How can we be sure this one is OK?
>Should it be added in last minute of 18.08?
>Or can it wait 18.11?
>
>Adding Anatoly and Chao who are maintainers to decide.
>
OK. I will resend the patch with Cc: stable@dpdk.org.
On 06-Aug-18 10:50 AM, Thomas Monjalon wrote:
> 06/08/2018 10:43, Takeshi Yoshimura:
>> Commit 73a639085938 ("vfio: allow to map other memory regions")
>> introduced a bug in sPAPR IOMMU mapping. The commit removed necessary
>> ioctl with VFIO_IOMMU_SPAPR_REGISTER_MEMORY. Also, vfio_spapr_map_walk
>> should call vfio_spapr_dma_do_map instead of vfio_spapr_dma_mem_map.
>
> This is fixing an old patch:
> http://git.dpdk.org/dpdk/commit/?id=73a639085938
>
>> Fixes: 73a639085938 ("vfio: allow to map other memory regions")
>
> You probably want it to be backported in previous release,
> so you need to add Cc: stable@dpdk.org
>
>> Signed-off-by: Takeshi Yoshimura <tyos@jp.ibm.com>
>
> It is common to have bugs in sPAPR implementation.
> How can we be sure this one is OK?
> Should it be added in last minute of 18.08?
> Or can it wait 18.11?
>
> Adding Anatoly and Chao who are maintainers to decide.
>
The patch appears to be correct - we did have a
VFIO_IOMMU_SPAPR_REGISTER_MEMORY ioctl in the old map() function, but
not in the new one.
However, i agree with Thomas - without more testing from other sPAPR
users/IBM, i would be hesitant to allow it in at the last minute. In any
case, this code has been there for a while and no one has reported any
issues - so this can probably wait until 18.11, seeing how this codepath
is so popular :)
@@ -1145,8 +1145,22 @@ vfio_spapr_dma_do_map(int vfio_container_fd, uint64_t vaddr, uint64_t iova,
struct vfio_iommu_type1_dma_map dma_map;
struct vfio_iommu_type1_dma_unmap dma_unmap;
int ret;
+ struct vfio_iommu_spapr_register_memory reg = {
+ .argsz = sizeof(reg),
+ .flags = 0
+ };
+ reg.vaddr = (uintptr_t) vaddr;
+ reg.size = len;
if (do_map != 0) {
+ ret = ioctl(vfio_container_fd,
+ VFIO_IOMMU_SPAPR_REGISTER_MEMORY, ®);
+ if (ret) {
+ RTE_LOG(ERR, EAL, " cannot register vaddr for IOMMU, "
+ "error %i (%s)\n", errno, strerror(errno));
+ return -1;
+ }
+
memset(&dma_map, 0, sizeof(dma_map));
dma_map.argsz = sizeof(struct vfio_iommu_type1_dma_map);
dma_map.vaddr = vaddr;
@@ -1163,13 +1177,6 @@ vfio_spapr_dma_do_map(int vfio_container_fd, uint64_t vaddr, uint64_t iova,
}
} else {
- struct vfio_iommu_spapr_register_memory reg = {
- .argsz = sizeof(reg),
- .flags = 0
- };
- reg.vaddr = (uintptr_t) vaddr;
- reg.size = len;
-
ret = ioctl(vfio_container_fd,
VFIO_IOMMU_SPAPR_UNREGISTER_MEMORY, ®);
if (ret) {
@@ -1201,7 +1208,7 @@ vfio_spapr_map_walk(const struct rte_memseg_list *msl __rte_unused,
{
int *vfio_container_fd = arg;
- return vfio_spapr_dma_mem_map(*vfio_container_fd, ms->addr_64, ms->iova,
+ return vfio_spapr_dma_do_map(*vfio_container_fd, ms->addr_64, ms->iova,
ms->len, 1);
}