Hi Yuanhan,
On 9/29/2017 4:28 PM, Yuanhan Liu wrote:
On Thu, Sep 28, 2017 at 01:55:59PM +0000, Jianfeng Tan wrote:static int +share_device(int vid) +{ + uint32_t i, vring_num; + int len; + int fds[8]; + struct rte_vhost_memory *mem; + struct vhost_params *params; + struct rte_vhost_vring vring; + + /* share mem table */ + if (rte_vhost_get_mem_table(vid, &mem) < 0) { + RTE_LOG(ERR, PMD, "Failed to get mem table\n"); + return 0; + } + for (i = 0; i < mem->nregions; ++i) + fds[i] = mem->regions[i].fd; + + len = sizeof(struct rte_vhost_mem_region) * mem->nregions; + params = malloc(sizeof(*params) + len); + if (params == NULL) { + RTE_LOG(ERR, PMD, "Failed to allocate memory\n"); + return -1; + } + + params->type = VHOST_MSG_TYPE_REGIONS; + params->vid = vid; + memcpy(params->regions, mem->regions, len); + + if (rte_eal_mp_sendmsg("vhost pmd", params, sizeof(*params) + len,To me, it's not a good idea to identify an object by a string. The common practice is to use a handler, which could either be a struct or a nubmer.
My point is that if we choose the way you suggested, we need somewhere to maintain them. For example, every time we need register a new action, we need to update that file to add a new entry (number).
In current way, the duplicated register with the same name will fail, developers is responsible to check that.
+ fds, mem->nregions) < 0) { + RTE_LOG(ERR, PMD, "Failed to share mem table\n"); + free(params); + return -1; + } + + /* share callfd and kickfd */ + params->type = VHOST_MSG_TYPE_SET_FDS; + vring_num = rte_vhost_get_vring_num(vid); + for (i = 0; i < vring_num; i++) { + if (rte_vhost_get_vhost_vring(vid, i, &vring) < 0) {If you save the fds here, you don't have to get it every time when there is a new secondary process attached. Then as I have suggested firstly, you don't have to introduce callfd_pri in the vhost lib.
If we don't introduce callfd_pri, when we do virtqueue cleanup (or similar operations) in vhost lib, it will wrongly close fds belonging to secondary process.
You remind me that, instead of introduce callfd_pri, we can introduce callfd_effective, to reduce the modification lines.
Thanks, Jianfeng

