On 30-Nov-17 6:44 PM, Jianfeng Tan wrote:
Previously, vfio has its own channel for the secondary process to
get container fd and group fd from the primary process.
This patch changes to use the generic mp channel.
Signed-off-by: Jianfeng Tan <jianfeng....@intel.com>
---
lib/librte_eal/linuxapp/eal/eal.c | 14 +-
lib/librte_eal/linuxapp/eal/eal_vfio.c | 139 +++------
lib/librte_eal/linuxapp/eal/eal_vfio.h | 15 +-
lib/librte_eal/linuxapp/eal/eal_vfio_mp_sync.c | 416 ++++---------------------
4 files changed, 109 insertions(+), 475 deletions(-)
diff --git a/lib/librte_eal/linuxapp/eal/eal.c
b/lib/librte_eal/linuxapp/eal/eal.c
index a84eab4..93824bf 100644
--- a/lib/librte_eal/linuxapp/eal/eal.c
+++ b/lib/librte_eal/linuxapp/eal/eal.c
<...snip...>
- default:
- RTE_LOG(ERR, EAL, " cannot get container fd!\n");
- close(socket_fd);
- return -1;
- }
+ ret = rte_eal_mp_sendmsg("vfio", &p, sizeof(p), NULL, 0, 1);
+ if (ret < 0) {
+ RTE_LOG(ERR, EAL, " cannot request group fd!\n");
+ cur_grp->group_no = -1;
+ } else {
+ cur_grp->group_no = iommu_group_no;
+ vfio_cfg.vfio_active_groups++;
}
Either i'm missing something here, or i don't see where we actually
store the group fd (e.g. the "cur_gtp->fd = vfio_group_fd" part from the
previous code).
Also, this is why i mentioned "receive parameters" in comments to
previous patch - looking at this code, it is quite unclear that the
return from rte_eal_mp_sendmsg is either error or, well, "something",
defined as "whatever mp_action returns". It would be much clearer if we
were explicitly getting some data in response.
- return -1;
+
+ return ret;
}
<...snip...>
+ /* For secondary process, request container fd from primary process */
+
+ p.req = SOCKET_REQ_CONTAINER;
+
+ ret = rte_eal_mp_sendmsg("vfio", &p, sizeof(p), NULL, 0, 1);
+ if (ret < 0)
+ RTE_LOG(ERR, EAL, " cannot request container fd!\n");
Again here, looks counter-intuitive to get container fd in return - it
would've been much clearer to have a separate response parameter.
+
+ return ret;
}
<...snip...>
static int
-vfio_mp_sync_socket_setup(void)
+vfio_mp_secondary(const void *params, int len, int fds[],
+ int fds_num __rte_unused)
fds_num isn't unused here.
{
--
Thanks,
Anatoly