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